Аркуші 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.