使用Google Apps脚本删除Google表格中的行

Bha*_*kar 7 google-sheets 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]);
  }

}
Run Code Online (Sandbox Code Playgroud)

我编写的代码选择了应该删除的行号,但是在我的第一次尝试中并没有删除所有这些行.我应该多次执行我的脚本以删除这些行.

如果我的代码有错误,它应该显示,如果逻辑错误,则必须删除不正确的行.我没有遇到这些场景,我应该多次执行此功能.

这里有什么我想念的吗?

小智 13

从工作表中删除行时,即使脚本继续运行,它下面的行也会重新编号.如果脚本随后尝试也删除这些行,则结果是不可预测的.出于这个原因,当删除行时,应该从下到上进行.在你的情况下,像这样:

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

  • 每次迭代都会导致API调用,速度很慢。最好在这里执行批量更新。 (5认同)

Tom*_*oma 5

参考google团队建议的锁定功能:

  var lock = LockService.getScriptLock();
  lock.waitLock(30000); // lock 30 seconds
  //do whatever you want here
  lock.releaseLock();
Run Code Online (Sandbox Code Playgroud)

这样,您一次就能完成删除作业!在 30 秒结束或释放锁之前,系统线程不会继续执行其他作业。

谷歌开发文档:https://developers.google.com/apps-script/reference/lock/lock