Google Apps Script を使用して Google スプレッドシートの行を削除する 質問する

Google Apps Script を使用して Google スプレッドシートの行を削除する 質問する

Google Apps Script を使用して特定の値に一致する行を削除しようとしたときに、奇妙なエラーが発生しました。

これが私のコードです:

function myFunction() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = doc.getSheetByName("file.csv");
  
  var values = sheet.getRange("N2:N").getValues();
  
  var row_del = new Array();
    
  for(var i=0;i<values.length;i++)
  {
    if(values[i] == 'del'){
      row_del.push(i+2); // This line was added for debugging purposes.
     // sheet.deleteRow(i+2) was the line that was in this condition
     // (i+2) is used because row 1 has headers and the range starts from 0.
    }
  }
  
//  Logger.log(row_del);
//  GmailApp.sendEmail("my_email_address", "subject", row_del)
 
  for (var i = 0; i < row_del.length; i++)
  {
    sheet.deleteRow(row_del[i]);
  }
  
}

私が書いたコードは、削除すべき行番号を取得しますが、最初の試行ではすべての行が削除されるわけではありません。これらの行を削除するには、スクリプトを何回か実行する必要があります。

コードにエラーがある場合は、それが表示され、ロジックが間違っている場合は、間違った行を削除する必要があります。私はどちらのシナリオにも遭遇していないので、この関数を複数回実行する必要があります。

何か見落としている点はありますか?

ベストアンサー1

シートから行が削除されると、スクリプトの実行が継続されている間も、その下の行の番号が付け直されます。スクリプトがその後それらの行も削除しようとすると、結果は予測できません。このため、行を削除するときは下から上に向かって進める必要があります。あなたの場合は、次のようになります。

for (var i = row_del.length - 1; i>=0; i--) {
  sheet.deleteRow(row_del[i]); 
}

おすすめ記事