如何根据一个单元格中的值是用逗号分隔还是在 Google Sheet 中用换行分隔单行成多行?

How to split single rows into multiple rows depending on whether one cell has values separated by commas or new lines in Google Sheet?

跨页sheet的一些单元格的单元格内容用逗号或换行分隔。

123, 876, 456

列 "C" 是确定一行是否应拆分为多行的列。

EXAMPLE Spreadsheet

表单中的信息进入 "Form Submission" 页面。

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

我找到了一个 similar question 并将其应用到我们的 Google 表格中。

此脚本需要在单独的 sheet 上将函数 =result('FormSubmission'!A2:J) 放置在我们希望显示数据的第一列/行中(参见 "Current Outcome" sheet, 单元格 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;
} 

如果有人在表单中提交多个以逗号分隔的问题编号,则该行需要分成多行,如 Desired Outcome sheet.

所示

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

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);
    };
  };
};

除了 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 列)。

希望对您有所帮助?