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


14

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

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

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

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

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

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

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


Ответы:


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, значение содержимого вспомогательного столбца.

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


Привет Мэри, спасибо, но мне нужно лицо. имена людей помещаются в новые строки (с автоматически сгенерированными дополнительными строками для их размещения), а затем окружающая информация копируется рядом с новыми ячейками «людей». И мне нужен 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;
}

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


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

@ user2060451 Решение этого ответа показывает код пользовательской функции, она не предназначена для запуска из редактора сценариев. Я добавил ссылку на руководство по пользовательским функциям от Google.
— Рубен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.