尝试在给定条件下删除多行时超出最大执行错误
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
}
目前,我正在尝试使用我设法编写的以下代码来完成此操作:
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
}