7

改行で区切られた複数の値を持つセルを分割しようとしています.2つ以上の値を持つセルでは完全に機能しますが、値が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;
}

スプレッドシートへのリンク: https://docs.google.com/spreadsheet/ccc?key=0AjA1J4T5598RdGRWd0p4Q3FtaW5QTG1MVVdEVUQ0NFE#gid=0

4

2 に答える 2

11

スローされるエラーは次のとおりです。

TypeError: Cannot find function split in object //OBJECT//. (line xx, file "xxxx")

問題は、それ.split()が String メソッドであることです。「単一のアイテム」がテキストであれば問題ありませんが、数字や日付であれば... ブームです!

幸いなことに、.toString()Number と Date には共通点があり、String には何もしません。したがって、次の行に追加するだけです。

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

forインデックス配列に間違ったバージョンを使用しています。それは動作しますが、実際に使用する必要があります:

for (var i=0; i < anArray.length; i++) {
  ...
  for (var j=0; j < splitArray.length; j++) {
    ...
  }
  ...
}

可能性は低いですが、別の問題があります。ヌル文字列テストが原因で、入力行全体が失われる場合があります。

  • 空白の「分割」セル
  • 1 つ以上の改行があり、テキストがない「分割」セル

それをキャッチするには、1 つの「分割」アイテムが null になる可能性があることを許可する必要があります。

if(splitArray[j]=="" && j>=1)
  continue;

完全なコード

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;
}
于 2013-05-28T19:53:14.963 に答える