【问题标题】:i want to run delete row function if a certain column meets the conditions [duplicate]如果某列满足条件,我想运行删除行功能[重复]
【发布时间】:2021-02-01 18:09:42
【问题描述】:

如果该行中的 B 列等于 CID 参数,我想删除多行数据。但我运行后,删除的数据不正确。有时删除的数据位于for row循环中指定行的上方或下方的一行 这是我的代码:

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

【问题讨论】:

    标签: javascript for-loop google-apps-script google-sheets


    【解决方案1】:

    解释:

    您需要自下而上或向后删除行,因为删除一行后,您会更改电子表格文件的结构,因此rg 与工作表的新结构不匹配。

    • 请记住,JavaScript 中的数组索引从 0 开始。当变量row1 时,您要删除工作表中的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;       
        }
    }
    

    【讨论】:

    • 其实第一行是一个表头
    • @TitanAnggaraksa row&gt;0 确保 row至少为 1,因此它从工作表的第二行开始。标题行将被忽略,因为它在 row=0 中。请记住,JavaScript 索引从 0 开始,即 rg 中的标头位于数组的零位置,因此被忽略。如果您对此更有信心,可以使用row&gt;=1 而不是row&gt;0。它不会有任何区别,因为它是相同的表达式:)
    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 2015-10-13
    • 2017-09-27
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多