尝试在给定条件下删除多行时超出最大执行错误

Exceeded the maximum execution error when trying to delete multiple rows on given condition

目前,我正在尝试使用我设法编写的以下代码来完成此操作:

 var ss = SpreadsheetApp.openById('***');
 var rowCount = ss.getLastRow();


for (i=1; i <= rowCount; i++) {

   var I = ss.getRange("I" + i).getValue(); 
   var J = ss.getRange("J" + i).getValue(); 
   var K = ss.getRange("K" + i).getValue(); 
   var L = ss.getRange("L" + i).getValue(); 
   var M = ss.getRange("M" + i).getValue(); 
   var N = ss.getRange("N" + i).getValue(); 
   var O = ss.getRange("O" + i).getValue(); 
   var P = ss.getRange("P" + i).getValue(); 
   var Q = ss.getRange("Q" + i).getValue(); 
   var R = ss.getRange("R" + i).getValue(); 
   var S = ss.getRange("S" + i).getValue(); 
   var T = ss.getRange("T" + i).getValue();
  if(I === 0 && J === 0 && K === 0 && L === 0 && M === 0 && N === 0 && O === 0 && P === 0 && Q === 0 && R === 0 && S === 0 && T === 0){

    Logger.log(ss.getRange("I" + i).getA1Notation());

    ss.deleteRow(i);

  }


} 

不幸的是,这似乎不是实现我需要的最佳方式,仅仅是因为我正在使用的工作表在 5-10K 行之间,因此脚本超过了最大执行时间。

能否以更好、更快、更智能的方式完成这项工作?又如何?

试试这个:

function myDelete()
{
  var ss = SpreadsheetApp.openById('***');
  var allshts=ss.getSheets();
  var sh=allshts[0];
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  for(var i=vA.length-1;i>=0;i--) 
  {
    if(vA[i][8]==0 && vA[i][9]==0 && vA[i][10]==0 && vA[i][11]==0 && vA[i][12]==0 && vA[i][13]==0 && vA[i][14]==0 && vA[i][15]==0 && vA[i][16]==0 && vA[i][17]==0 && vA[i][18]==0 && vA[i][19]==0)
    {
      sh.deleteRow(i+1);
    }
  } 
}

最好从下往上删除

这里用JS中的every()方法解决。它使您无需手动循环和测试每个条件。

function deleteRow() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // Get all the data as a 2D array
  var data = sheet.getDataRange().getValues();

  // Go through each row in the array
  for(var i=0; i<data.length; i++) {
    var row = data[i];

    // Test the row for *every* cell having 0.
    var toDelete = row.every(isZero);

    // If all columns in the row === 0, delete the row.
    if(toDelete) { sheet.deleteRow(i+1) }
  }
}

// Test 
function isZero(element, index, array) { 
  // returns true if each element in the array (the columns) === 0
  return element === 0 
}