Google电子表格拆分基于换行符

Alf*_*red 4 javascript google-sheets google-apps-script

我试图拆分具有由新行分隔的多个值的单元格,它适用于具有多于1个值的单元格,但是如果我得到一个只有1个值的单元格(即,没有换行符,则错误输出)我能解决这个问题吗?

function splitColumnAndRepeatRows(anArray, splitColumnIndex) 
{
var output = [];
for (i in anArray)
{ // for each row
var splitArray = anArray[i][splitColumnIndex].split("\n"); // split values in specified column
for (j in splitArray)
 { // for each split cell value
  if(splitArray[j]=="")
    continue;
  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
  row[splitColumnIndex] =splitArray[j];
   output.push(row); // push new row to output
 }
} 
return output;
}
Run Code Online (Sandbox Code Playgroud)

链接到电子表格:https://docs.google.com/spreadsheet/ccc?key = 0AjA1J4T5598RdGRWd0p4Q3FtaW5QTG1MVVdEVUQ0NFE #gid = 0

小智 17

你可以使用内置函数= SPLIT(D1; CHAR(10))

  • 我不知道为什么这个答案得到了一次投票,因为这样可以优雅地解决问题并简明扼要地回答这个问题,而不必干涉自定义函数.你的回答对我很有帮助,请接受我的投票,并希望你继续为SO做出贡献 (3认同)
  • 尽管如此,对于 95% 发现这个问题只想用换行符分割列的人来说,这是更好的答案,这也可以通过赞成票数与接受的答案来判断;) (3认同)
  • 这是更好的答案 (2认同)

Mog*_*dad 10

引发的错误是:

TypeError: Cannot find function split in object //OBJECT//. (line xx, file "xxxx")
Run Code Online (Sandbox Code Playgroud)

问题是这.split()是一个String方法.如果你的"单项"是文字,你就没事了 - 但如果它是一个数字或日期......繁荣!

幸运的是,.toString()数字和日期有一个共同点,对于字符串来说这是一个无操作.所以你可以把它添加到这一行:

var splitArray = anArray[i][splitColumnIndex].toString().split("\n"); // split values in specified column
Run Code Online (Sandbox Code Playgroud)

您正在使用错误版本的for索引数组.它有效,但你真的应该使用:

for (var i=0; i < anArray.length; i++) {
  ...
  for (var j=0; j < splitArray.length; j++) {
    ...
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

你有另一个问题,虽然它不太可能.由于您的空字符串测试,有些情况会导致整行输入丢失.

  • 空白的"分裂"细胞
  • "拆分"单元格中包含1个或多个换行符,但没有文本

要抓住这个,你只需要允许ONE"split"项可以为null:

if(splitArray[j]=="" && j>=1)
  continue;
Run Code Online (Sandbox Code Playgroud)

完整代码

function splitColumnAndRepeatRows(anArray, splitColumnIndex) {
  var output = [];
  for (var i = 0; i < anArray.length; i++) { // for each row
    var splitArray = anArray[i][splitColumnIndex].toString().split("\n"); // split values in specified column
    for (var j = 0; j < splitArray.length; j++) { // for each split cell value
      if (splitArray[j] == "" && j >= 1)
        continue;
      var row = anArray[i].slice(0); // take a copy of source row 
      row[splitColumnIndex] = splitArray[j];
      output.push(row); // push new row to output
    }
  }
  return output;
}
Run Code Online (Sandbox Code Playgroud)