Листы Google разбивают многострочную ячейку на новые строки (+ повторяющиеся записи окружающих строк)

14

Я собираю базу данных с адресами предприятий, включая ключевые кадры для каждого бизнеса. Электронная таблица Google, которую я унаследовал для этого проекта, содержит столбец «ключевые сотрудники» (в столбце B), в котором несколько имен ключевых сотрудников перечислены в одной и той же ячейке и разделены переносами строк (т. Е. CHAR (10)). В каждом ряду один бизнес. Количество строк в ячейке «ключевой персонал» изменяется построчно. Мой начальный лист выглядит так:

введите описание изображения здесь

Мне нужно сделать следующее, чтобы оптимизировать этот лист:

  1. разбить каждую многострочную ячейку «ключевой персонал», чтобы имя каждого ключевого персонала отображалось в отдельной строке. Это требует, чтобы новая строка была вставлена ​​под исходной строкой.
  2. дублируйте данные из всех других ячеек в исходной строке (т. е. из столбцов A и C: E), чтобы каждая новая строка содержала полные данные для каждого бизнеса
  3. Мне нужен автоматизированный процесс - у меня будет около 1000 предприятий для обработки, поэтому я не могу сделать это с помощью каких-либо ручных шагов

Лист должен выглядеть следующим образом:

введите описание изображения здесь

Использование, =TRANSPOSE(SPLIT(B1,CHAR(10)))очевидно, только часть пути - он не вставляет новые строки и не дублирует записи окружающих столбцов. Вся помощь с благодарностью принята!

вкладка кирк
источник
Связанный: webapps.stackexchange.com/questions/88517/…
Рубен

Ответы:

14

Прежде всего, извините за поздний ответ, но у меня есть решение для вас, чтобы работать с.

Код

function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][1].split("\n");    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == 1) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

Разъяснения

Сценарий оценивает каждую строку и, в частности, второй столбец каждой строки (в JavaScript массивы основаны на нуле, поэтому столбец 2 соответствует индексу 1 массива). Он разбивает содержимое этой ячейки на несколько значений и использует в "\n"качестве разделителя (перевод строки). После этого он добавляет существующую информацию в массив и добавляет отдельные результаты только при достижении индекса 1 ( k == 1). Недавно подготовленная строка добавляется в другой массив, который возвращается для отображения результата.

Снимок экрана

данные
введите описание изображения здесь

результат
введите описание изображения здесь

пример

Я создал для вас файл примера: многострочные ячейки в новые строки .
Добавьте сценарий в меню «Инструменты»> «Редактор сценариев» и нажмите кнопку «Сохранить».

Джейкоб Ян Туинстра
источник
2
Офигенно офигенно офигенно - купи этому мужчине пиво! Большое спасибо, Джейкоб, это именно то, что мне нужно.
вкладка Кирк
2
А как определить диапазон? (получить это сообщение "не могу прочитать свойство" length "из неопределенного" Спасибо!
user2060451
для действительно большого файла это, скорее всего, не удастся ... слишком большой результат.
Кайл Пеннелл
Блестяще ответил, только одна ошибка. ПЕРВАЯ КОЛОННА в данном диапазоне НЕ должна иметь РАЗДЕЛИТЕЛЬ. Временный обходной путь должен иметь последовательные числа или статическое значение в качестве первого столбца. Не пробовал, но первый пустой столбец также должен решить проблему.
Ашиш Сингх
3

Для повторного решения потребуется сценарий.

Но для единовременного усилия вы могли бы просто использовать =SPLIT(B3,CHAR(10)). Это даст вам все имена людей в параллельных вспомогательных столбцах, например:

введите описание изображения здесь

Copy / Paste-special, значение содержимого вспомогательного столбца.

И для каждого используемого вспомогательного столбца (надеюсь, не слишком много, потому что, надеюсь, у вас не слишком много людей в одном бизнесе), вручную скопируйте и вставьте блок строк в конец текущего блока. (Это не очень хорошее описание, но вы получите смещение.)

MaryC.fromNZ
источник
Привет Мэри, спасибо, но мне нужно лицо. имена людей помещаются в новые строки (с автоматически сгенерированными дополнительными строками для их размещения), а затем окружающая информация копируется рядом с новыми ячейками «людей». И мне нужен 100% автоматизированный процесс - я не могу сделать это вручную для тысячи или около того предприятий!
кирк таб
Вам не нужно делать ручной шаг для всей тысячи предприятий. Вам нужно сделать это только для максимального числа людей, связанных с любым из этих предприятий: например, если в одном предприятии работает шесть человек, то будет создано шесть новых вспомогательных столбцов, поэтому вам придется вручную скопировать и вставить шесть раз, по одному на каждый столбец.
MaryC.fromNZ
1
Кто-то может написать сценарий для этого (я не тот, кто!), Но на самом деле время, потраченное на тестирование, вероятно, будет больше, чем время, потраченное на его ручное выполнение.
MaryC.fromNZ
2

Для людей, которые могут не сразу понять, как использовать полезную пользовательскую функцию в принятом ответе :

  • Вам нужно более одного листа, в примере два листа DATAи RESULT. RESULTЛист пуст , пока запрос не будет работать. Вы можете увидеть запрос, который ссылается на DATAлист на скриншоте Джейкоба.

  • Скорее всего, вам потребуется изменить значение сравнения для kстроки 8, которая относится к столбцу, в котором должны быть найдены ваши данные для анализа. Такое же число нужно будет ввести во 2-е значение массива в строке 4.

  • Возможно, вам придется изменить разделитель в строке 4, которая в настоящее время \n

Чтобы сделать все это немного проще, я взял тот же код и извлек разделитель и целевой столбец в переменные, установленные в верхней части функции. Как Джейкоб упоминает, целевое число столбцов начинается с 0 в качестве первого числа.

function result(range) {
  delimiter = ", "
  targetColumn = 10

  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][targetColumn].split(delimiter);    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == targetColumn) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

использованная литература

jfunk
источник
1
Если я запускаю код, он говорит: TypeError: Невозможно прочитать свойство "length" из неопределенного. Спасибо большое. Ответ должен быть здесь: Ответ должен быть где-то здесь (developers.google.com/apps-script/reference/spreadsheet/…) Но у меня по-прежнему одна и та же ошибка.
user2060451
@ user2060451 Решение этого ответа показывает код пользовательской функции, она не предназначена для запуска из редактора сценариев. Я добавил ссылку на руководство по пользовательским функциям от Google.
Рубен