Аркуші Google розділяють багаторядкові комірки на нові рядки (+ дублікати записів навколишніх рядків)


15

Я складаю базу даних про адресу компанії, включаючи ключовий персонал для кожного бізнесу. Електронна таблиця 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 "з невизначеного" Дякую!
користувач2060451

на дійсно великому файлі це, швидше за все, не вдасться ... результат занадто великий.
Кайл Пеннелл

Блискуче відповів, лише одна помилка. ПЕРША КОЛІЯ в заданому діапазоні НЕ повинна мати ВИДАЛЕННЯ. Тимчасове вирішення проблеми має мати серійні нуми або статичне значення в якості першого стовпця. Не випробуваний, але перший порожній стовпець також повинен вирішити проблему.
Ашіш Сінгх

3

Для повторюваного рішення знадобиться сценарій.

Але для разових зусиль ви могли просто скористатися =SPLIT(B3,CHAR(10)). Це дасть вам усі імена людини у стовпчикових стовпчиках, як це:

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

Копіювати / спеціально вставляти, цінує вміст стовпця помічників.

І для кожного стовпчика-помічника, який використовується (сподіваємось, не надто багато, оскільки, сподіваємось, у вас немає занадто багато людей у ​​будь-якій справі) вручну скопіюйте та вставте блок рядків до кінця поточного блоку. (Це не чудовий опис, але ви отримаєте дрейф.)


Привіт Мері, дякую, але мені потрібні люди. імена осіб потрапляють у нові ROWS (з додатковими рядками автоматично створюються для їх розміщення), потім навколишня інформація копіюється поруч із новими клітинками 'person'. І мені потрібен 100% автоматизований процес - я не можу зробити це вручну для тисяч або більше підприємств!
вкладка

Вам не потрібно робити крок вручну для всієї тисячі підприємств. Вам потрібно зробити це лише для максимальної кількості pepole, пов’язаної з будь-яким з цих підприємств: наприклад, якщо в одному бізнесі є шість людей, тоді буде створено шість нових стовпчиків помічників, тому вам доведеться вручну скопіювати та вставити шість разів, по одному для кожного стовпця.
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/…) Але я все одно маю ту саму помилку.
користувач2060451

@ user2060451 Рішення в цій відповіді показує код спеціальної функції, її не слід запускати з редактора сценаріїв. Я додав посилання на спеціальний посібник із функцій від Google.
Рубен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.