应用程序脚本,用于从Google表格中删除行(如果与单元格值匹配)



我正在为我的脚本删除我的 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();
  }
}

若要修复代码,请添加一个独立于数组迭代器 irow 变量。

尝试将其作为模板:

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
    }
  }
}

最新更新