0

これは私がグーグルスクリプトをいじり回す最初の日なので、私の制限を許してください。

ヘッダー行を残したまま、フォームスプレッドシートのすべての行を削除する関数を作成しようとしました。

なぜこれが機能するのですか?

  // Loop through the data in the range and delete the rows
if (data.length > 1) {
  for (var row = 1; row < data.length; row++) {
    ws.deleteRow(row+1);
    }
    ws.deleteRow(2); 

 }

次のように:

if (data.length > 1) {
  for (var row = 1; row < data.length; row++) {
    ws.deleteRow(row+1);
    }

  }

行2を残します

4

1 に答える 1

0

行インデックスは 1 ベース (つまり、1 から開始) であるため、for ループを次のように変更する必要があります。

for (var row = 1; row <= data.length; row++) {

2 つの行があると仮定すると、ループで 2 番目の行にヒットしたとき (つまり、行 = 2 のとき)、 の値はrowよりも小さくなりませんdata.length(これは です2)。に等しくなりdata.lengthます。その<ため、テストは失敗し、ループ内のコードは 2 回目は実行されません。これ<=で合格し、コードは必要に応じて実行されます。

もちろん、これと同じパターンは、任意の数の行で発生します。

編集:その他のいくつかの問題:

削除はすぐに行われるため、行は削除後にすべてシフトし、異なる番号が付けられます。これはいくつかの方法で処理できますが、1 つ: 削除を最後から開始し、逆方向に作業するように変更します。これで、次のようになりました。

for (var row = data.length; row >= 1; row--) {

また、ヘッダー行として最初の行のみをスキップしようとしている場合は、使用するインデックス (例: row + 1) を変更するのではなく、ループを開始/停止する場所を変更するだけです。これはより単純で理解しやすいものです。したがって、ループは次のようになります。

 for (var row = data.length; row >= 2; row--) {
    ws.deleteRow(row);
 }
于 2012-11-05T04:36:28.490 に答える