我想删除多行数据的条件,如果行中的B列等于CID参数。但我运行后,删除的数据是错误的。有时,删除的数据位于for行循环中指定行的上方或下方一行下面是我的代码:
if (e.parameter.func == "DeleteRec") {
var rg=ss.getSheetByName("MAIN").getDataRange().getValues();
var lr= ss.getSheetByName("MAIN").getLastRow();
for(var row=1;row<=lr;row++){
var cid=rg[row].toString().split(',');
if(cid[1]==e.parameter.CID){
ss.getSheetByName("MAIN").deleteRow(row-1);
var data=200;
}
}
return ContentService.createTextOutput(data).setMimeType(ContentService.MimeType.TEXT);
}
说明:
您需要从自下而上或向后删除行,因为在您删除一行之后,您更改了电子表格文件的结构,因此rg
与工作表的新结构不匹配。
-
请记住,JavaScript中的数组索引从
0
开始。当变量row
为1
时,您要删除工作表中的row+1
,因为row=1
正在获取数组的第二个元素。 -
在
for
循环中调用getSheetByName
将增加脚本的性能成本。相反,应该在循环之前定义sheet
变量,以便每次需要时都可以使用它。 -
由于您正在使用getDataRange,
rg
的长度等于getLastRow
返回的长度。因此不需要lr
。 -
不知道为什么你迭代地为变量
var data=200
分配固定值,但我保留了这部分,因为它不是你问题的一部分。
解决方案:
将相关部分替换为以下代码:
const sheet = ss.getSheetByName("MAIN");
const rg = sheet.getDataRange().getValues();
for (var row = rg.length - 1; row>0; row--) {
var cid=rg[row].toString().split(',');
if(cid[1]==e.parameter.CID){
sheet.deleteRow(row+1);
var data=200;
}
}