Google Apps Script: создание новых строк для ячеек, содержащих запятые - PullRequest
0 голосов
/ 14 февраля 2019

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

Например, вот скриншоты концепции, которую я хотел бы:

Как это начинается

Конеццель

А вот мой фактический набор данных: Мой лист

У меня есть столбцы от A до S. Я толькохочу посмотреть на столбцы с D по L и проверить, есть ли у них запятые.На рисунке вы можете видеть, что первые три строки информации не содержат запятых.Я просто хотел бы, чтобы код возвращал эти значения такими, какие они есть.В строке 5 столбцы с D по L содержат запятые, которые представляют отдельные ответы, и поэтому я хотел бы, чтобы эти значения были разбиты на отдельные строки в выводе.

Это то, что я до сих пор,что я нашел большую часть от кого-то еще на Stackoverflow.Этот код работает, но , только если вы указываете один столбец .

Например, на пустом листе Google я пишу =split_rows(Sheet1!A:S,3), который проверяет только запятую в столбце 3 моего другого листа.Мне нужен код, который будет делать то же самое, но для нескольких столбцов и разделить значения.

function split_rows(anArray, splitColumnIndex) {
  var output = [];
  for (i in anArray){                                                 // for each row
    var current_cell = anArray[i][splitColumnIndex];                  // current cell in loop
    if (current_cell.toString().indexOf(",")>-1) {                    // if the cell in the designated column contains a comma,  
      var splitArray = current_cell.split(",");                       // split values in specified column
        for (j in splitArray){                                          // for each split cell value
         var row = anArray[i].slice(0);                                // take a copy of source row 
         row[splitColumnIndex] = alltrim(splitArray[j]);               // replace comma separated value with current split value
         output.push(row);                                             // push new row to output
       } 
    }

    else {
      var row = anArray[i].slice(0); 
      output.push(row);
    }
  }
      return output;
  }
 
function alltrim(str) {
  return str.replace(/^\s+|\s+$/g, '');
}

Вот пример моего листа;https://docs.google.com/spreadsheets/d/1mgqKriAxf6-hAPNJ9Um8i9SD22TxDXVKM8llRn0sCS4/edit#gid=0

1 Ответ

0 голосов
/ 14 февраля 2019

Если мое понимание верно, как насчет этой модификации?В этой модификации я использовал следующий поток.Я думаю, что есть несколько ответов для вашей ситуации.Поэтому, пожалуйста, подумайте об этом как об одном из них.

  1. Извлечение значений.
  2. Когда значения столбцов «A», «B» и «C» разделяют значениястолбец "B" и столбец "C" на ,.
  3. Когда длина столбцов "B" и "C" одинакова, создайте двумерный массив, поместив каждое значение в каждую строку.
    • Исходя из вашего входного изображения, я предположил, что числа , для столбца "B" и "C" совпадают.
  4. Поместите преобразованные значения.

Модифицированный скрипт:

function split_rows(anArray) {
  var res = anArray.reduce(function(ar, e) {
    if (e.slice(0, 3).every(String)) {
      var colB = e[1].split(",").map(function(f) {return f.trim()});
      var colC = e[2].split(",").map(function(f) {return f.trim()});
      if (colB.length == colC.length) {
        var temp = colB.map(function(g, k) {
          return [e[0], g, colC[k]];
        });
        Array.prototype.push.apply(ar, temp);
      }
    }
    return ar;
  }, []);
  return res;
}

Результат:

Когда используются значения вашего входного изображения, результат будет следующим.

enter image description here

Примечание:

  • Я подготовил этот модифицированный скрипт, используя ваши входные и выходные изображения.
  • Хотя вы используете диапазониз Sheet1!A:S кажется, что во входном изображении нет значений от столбца "D" до "S".Таким образом, в этом измененном сценарии используются значения от столбца «A» до «C».
    • Если вы хотите использовать значения от столбца "D" до "S", можете ли вы предоставить информацию о преобразованном результате?

Ссылки:

Если это не тот результат, который вы хотите, пожалуйста, сообщите мне.Я хотел бы изменить это.В то время, можете ли вы предоставить подробную информацию, которую вы хотите?

Редактировать:

Для вашего 2-го вопроса вышеуказанный скрипт был изменен с использованием вашей общей таблицы.

Измененный скрипт:

function split_rows2(anArray) {
  var res = anArray.reduce(function(ar, e) {
    var splitted = e.slice(3, 12).map(function(f) {return f.toString().split(",").map(function(g) {return g.trim()})});
    var temp = [];
    for (var j = 0; j < splitted[0].length; j++) {
      temp.push(e.slice(0, 3).concat(splitted.map(function(f) {return f[j] ? (isNaN(f[j]) ? f[j] : Number(f[j])) : ""})).concat(e.slice(12, 20)));
    }   
    Array.prototype.push.apply(ar, temp);
    return ar;
  }, []);
  return res;
}

Результат:

enter image description here

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