【问题标题】:How to split single rows into multiple rows depending on whether one cell has values separated by commas or new lines in Google Sheet?如何根据一个单元格的值是否在 Google 表格中以逗号或换行符分隔,将单行拆分为多行?
【发布时间】:2016-01-27 20:35:40
【问题描述】:

电子表格中有一些单元格的内容由逗号或换行分隔。

123、876、456

列“C”是确定是否应将一行拆分为多行的列。

EXAMPLE Spreadsheet

表单中的信息进入“表单提交”页面。

我们必须满足特定格式才能提交给我们的报告跟踪软件,该格式要求将问题编号(在 C 列中找到)与在 A:B、D:J 列中找到的信息分开成各自的行保持不变(见预期结果表)。

我找到了一个similar question,我们将它实施到了我们的 Google 表格中。

此脚本需要在单独的表格中将函数 =result('FormSubmission'!A2:J) 放置在我们希望显示数据的第一列/行中(请参阅“当前结果”表格,单元格 A2。)

这是我们正在使用的编码:

function result(range) {
  var output2 = [];
  for(var i = 0, iLen = range.length; i < iLen; i++) {
    var s = range[i][2].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 == 2) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
} 

function results(range) {
  var output2 = [];
  for(var i = 0 /, iLen = range.length; i < iLen; i++) {
    var s = range[i][2].split(",");    
    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 == 2 /) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
} 

如果有人在表单中提交了多个用逗号分隔的问题编号,则该行需要拆分为多行,如“期望结果”表中所示。

【问题讨论】:

    标签: google-apps-script google-sheets google-forms


    【解决方案1】:

    这是我测试过的一些代码,它可以工作。它也适用于同时具有新行和逗号分隔值的单元格。不要求传入范围。。 . . . .此代码不需要它。它将新行直接写入“当前结果”表。

    function result() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var frmSubmissionSheet = ss.getSheetByName('Form Submission');
      var desiredOutcomeSheet = ss.getSheetByName('Current Outcome');
    
      var data = frmSubmissionSheet.getRange(1, 1, frmSubmissionSheet.getLastRow(), frmSubmissionSheet.getLastColumn()).getValues();
    
      var issueNumbers = "",
          hasComma = false,
          arrayOfIssueNumbers = [],
          arrayRowData = [],
          thisRowData,
          hasNewLine;
    
      for (var i=0;i<data.length;i+=1) {
        if (i===0) {continue}; //Skip row 1
    
        issueNumbers = data[i][2];
        hasComma = issueNumbers.indexOf(",") !== -1;
        hasNewLine = issueNumbers.indexOf("\n") !== -1;
        Logger.log(hasNewLine)
        if (!hasComma && !hasNewLine) {
          desiredOutcomeSheet.appendRow(data[i]);
          continue;  //Continue to next loop, there are no multiple issue numbers
        };
    
        if (hasNewLine) {
          var arrayNewNewLine = issueNumbers.split("\n");//Get rid of new line
          issueNumbers = arrayNewNewLine.toString(); //Back to string.  Handles cells with both new line and commas
        };
    
        arrayOfIssueNumbers = [];
        arrayOfIssueNumbers = issueNumbers.split(",");
    
        for (var j=0;j<arrayOfIssueNumbers.length;j+=1) {
          arrayRowData = []; //Reset
          thisRowData = [];
    
          thisRowData = data[i];
          for (var k=0;k<thisRowData.length;k+=1) {
            arrayRowData.push(thisRowData[k]);
          };
    
          arrayRowData.splice(2, 1, arrayOfIssueNumbers[j]);
          desiredOutcomeSheet.appendRow(arrayRowData);
        };
      };
    };
    

    【讨论】:

      【解决方案2】:

      除了 Sandy 的贡献之外,这里还有一些替代代码:

      function extract(range, colToSplit, delimiter) {
      var resArr = [], row;
      range.forEach(function (r) {
          r[colToSplit-1].replace(/(?:\r\n|\r|\n)(\d|\w)/g,", ").split(delimiter)
              .forEach(function (s) {
                  row = [];
                  r.forEach(function (c, k) {               
                      row.push( (k === colToSplit-1) ? s.trim() : c);
                  })
                  resArr.push(row);
              })
      })
      return resArr;
      

      }

      这是一个接受三个参数的自定义函数:

      1. 范围
      2. 拆分应基于的列
      3. 要分割的分隔符

      可以像这样在电子表格中使用:

      =extract('Form Submission'!A1:J, 3, ", ")
      

      代码将所有换行符(后跟数字或字母)替换为逗号,并使用逗号作为分隔符进行拆分(基于第 3 列)。

      希望对你有帮助?

      【讨论】:

        猜你喜欢
        • 2020-10-24
        • 2017-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多