0

次のような行を含むGoogleドキュメントのスプレッドシートがあります。

          |                | things; separated;by;semicolons;with;line;breaks |
something | something else | A;B;C;D;E;F;G                                    | one more thing
          |                | K;L;M;N;O;P;Q                                    |
-----------------------------------------------------------------------------------------------

3 番目の列を改行で分割し、それぞれを行全体の 1 つのコピーに入れ、3 番目のセルを上書きしてから、そのセルをセミコロンで分割します。最後に、前の行を次のように変換する必要があります。

something|something else|things|separated|by|semicolons|with|line|breaks| one more thing
-----------------------------------------------------------------------------------------
something|something else|   A  |     B   | C|     D    |  E |  F |  G   | one more thing
-----------------------------------------------------------------------------------------
something|something else|   K  |     L   | M|     N    |  O |  P |  Q   | one more thing
-----------------------------------------------------------------------------------------

この関数を試してみましたが、一部のセルが重なり合って他のセルを上書きします:

function splitColumnAndRepeatRows(anArray, splitColumnIndex) {
  var output = [];
  for (i in anArray){ // for each row
    var splitArray = anArray[i][splitColumnIndex].split(/\n/g); // split values by line breaks
    for (j in splitArray){ // for each split array
      var row = anArray[i].slice(0); // copies the entire line
      row.splice(2,1,splitArray[j].split(";")); // inserts the splited values overwriting the third cell
      output.push(row);
    }
  }
  return output;
}

そのため、スプライス関数は、セル 2 と 4 の間に分割値を挿入しません。分割値は、次のように、3 番目のセルから配置され、4 番目のセル (例では「もう 1 つ」) を上書きします。

something|something else|things|separated|by|semicolons|with|line|breaks
------------------------------------------------------------------------

誰かが私の間違いを指摘できますか? 十分に説明したことを願っています。

前もって感謝します。

4

1 に答える 1

2

コードには 2 つの問題があります。1 つは、スプライス関数を実行するたびに 1 つのセルを置き換えることです。これを何度も行うため、最後の「もう 1 つ」のセルも上書きします。代わりに、最初に 1 回だけ交換してください。

もう 1 つの問題は、意図したことはわかりませんが、行配列に内部配列が作成されるため、 splice 関数に配列を提供したくないと思うことです。代わりに、配列値をループして、それぞれで splice を呼び出します。

この内側のループ コードで問題が解決するはずです。

for (j in splitArray){ // for each split array
  var row = anArray[i].slice(0); // copies the entire line
  var split = splitArray[j].split(";");
  var pos = 0;
  row.splice(2,1); // deletes the third cell
  for (var k in split) {
    row.splice(2+pos,0,split[k]); // inserts the splited values starting at cell 2
    pos++;
  }
  output.push(row);
}
于 2012-11-26T02:29:29.630 に答える