Разделение значений, разделенных запятыми, в строке по идентификатору в Google Таблицах - PullRequest
0 голосов
/ 08 мая 2020

Образец таблицы Google

У меня есть некоторые данные, которые хранятся в таблице Google и связаны с Google Data Studio. Некоторые из этих данных разделены запятыми внутри строки. Выше приведена ссылка на образец некоторых из этих данных.

Я постараюсь объяснить как можно лучше, но это видео о том, как это решается с помощью Power Query в Excel, - ИМЕННО то, что я пытаюсь сделать, только в Google Таблицах. Обучающее видео на YouTube

В приведенном выше образце у меня есть идентификатор респондента в столбце A на вкладке «Данные», а в столбце B «Данные» есть строка, разделенная запятыми. вкладка.

На вкладке «Решение» в столбце B вы увидите, что я использовал следующий код для разделения и транспонирования содержимого столбца B из вкладки «Данные» на вкладку «Решение». =transpose(split(join(" ",arrayformula(Data!B2:B&",")),",")), который хорошо работал для разделения значений на их собственные строки в этом столбце

Но мне нужно, чтобы идентификатор был сопоставлен с соответствующими значениями в столбце A на вкладке «Решение». Да хоть убей, я не могу этого понять.

Любая помощь будет принята с благодарностью. Спасибо!

Обновление:

Я также нашел этот сценарий для настраиваемой функции, которая, я думаю, будет работать, но я не уверен, как заставить ее работать. Я получаю сообщение об ошибке «TypeError: не удается прочитать длину свойства ...»

function myFunction(range) {
delimiter = ", ";
targetColumn = 1;
targetColumn2 = 2;

var output2 = [];
for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][targetColumn].split(delimiter);    
    var s2 = range[i][targetColumn2].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 if (k == targetColumn2) {
           output1.push(s2[j]);
       } else {
            output1.push(range[i][k]);
       }
    }
    output2.push(output1);
  } 
 }
return output2;
}

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Существует простое решение этих проблем с недавним обнаружением новой функции, скрытой в задней части таблиц Google, называемой FLATTEN (). Я также сделал копию, поскольку ваш общий лист был доступен только для просмотра. Ссылка на копию.

На новой вкладке эта формула:

=ARRAYFORMULA(QUERY(SPLIT(FLATTEN(Data!A2:A&"|"&TRIM(SPLIT(Data!B2:B,","))),"|",0,0),"where Col2 is not null"))

Немного сложнее, но разбивается на 3 столбца вместо 2 на вкладке Альтернативное решение.

=ARRAYFORMULA(QUERY(SPLIT(SUBSTITUTE(FLATTEN(Data!A2:A&" ("&TRIM(SPLIT(Data!B2:B,","))),")","")," (",0,0),"where Col3 is not null"))
0 голосов
/ 08 мая 2020

попробуйте:

=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(
 IF(IFERROR(SPLIT(B2:B, ","))="",,"♠"&A2:A&"♦"&SPLIT(B2:B, ",")))
 ,,99^99)),,99^99), "♠")), "♦")))

0

демонстрация электронной таблицы

0 голосов
/ 08 мая 2020

Подход

Я бы использовал здесь настраиваемую функцию:

/**
* @customfunction
*/
function covid(range) {
  let delimiter = ", ";
  let newRows = [];
  for (let i in range) {
    let row = range[i];
    let id = row[0];
    let strings = row[1].split(delimiter); // split the responses
    for (let j in strings) {
      newRows.push([id, strings[j]]); // links the responder id to its splitted response
    }
  }
  return newRows; // prints the rows
}

Входной параметр - это диапазон обозначений A1, в вашем случае это будет: =covid(Data!A2:B383)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...