我正在为我的脚本删除我的 Google 表格文件的 POHistory 选项卡中与我的 POTemplate 选项卡的单元格 E9 中的值相比,它们的第一个单元格中具有匹配值的任何行。但是,执行命令时我没有看到任何响应。 不知道这里缺少什么。 从本质上讲,我收到一条错误消息,指出我尝试删除的行"越界"。 谢谢你的关注。
function deleteOld() {
var app = SpreadsheetApp;
var orderSheet = app.getActiveSpreadsheet().getSheetByName("POTemplate");
var historySheet = app.getActiveSpreadsheet().getSheetByName("POHistory");
var poNO = orderSheet.getRange("E9").getValue();
var lastRow = historySheet.getLastRow();
var myRange = historySheet.getRange("A2:A" + lastRow);
var data = myRange.getValues();
for(i = 0; i < data.length; i++){
if(data[i][0] != poNO){
continue;
}else{
historySheet.deleteRow(i);
}}}
由于要删除行,因此i
值不再对应于同一范围。例如,您有一个包含 5 个元素的数组:
[A, B, C, D, E]
如果删除元素0
,将得到
[B, C, D, E]
现在,您将迭代器递增得如此i++; // i = 1
,因此您将操作的下一个值不是"B",而是"C"。
你可以通过跑步来尝试自己
function test() {
var letters = ["A", "B", "C", "D", "E"];
for (var i=0; i<letters.length; i++) {
Logger.log("i : " + i + " || Letter: " + letters[i]);
letters.shift();
}
}
若要修复代码,请添加一个独立于数组迭代器 i
的 row
变量。
尝试将其作为模板:
function deleteOld() {
var app = SpreadsheetApp;
var orderSheet = app.getActiveSpreadsheet().getSheetByName("POTemplate");
var historySheet = app.getActiveSpreadsheet().getSheetByName("POHistory");
var poNO = orderSheet.getRange("E9").getValue();
var lastRow = historySheet.getLastRow();
var myRange = historySheet.getRange("A2:A" + lastRow);
var data = myRange.getValues();
var row = 1;
for(i = 0; i < data.length; i++) {
if(data[i][0] != poNO){
row++; // Go to the next row
continue;
} else {
historySheet.deleteRow(row);
row--; // Deleted a row
}
}
}