【问题标题】:Apps Script not deleting rowsApps 脚本不删除行
【发布时间】:2019-03-13 02:31:30
【问题描述】:

当我在工作表中运行以下函数时:

    function removeDuplicateRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var column = sheet.getRange('D580:D');
  var data= column.getValues();
  var newData = new Array();
  for(i in data){

    var row = data[i];
    var duplicate = false;
    for(j in newData){

      if(row.join() == newData[j].join()){

        duplicate = true;

      }

    }
    if(!duplicate){
      newData.push(row);

    }
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);

}

什么也没发生,只是超时。当我确定范围时,这似乎是由于我的“列”变量。如果我将其留空,它会运行,但我不希望它到达前 580 行。有人知道为什么会这样吗?

感谢您的帮助,

【问题讨论】:

  • 查看您的算法。双重嵌套for 不好。尤其是当您缺少短路逻辑步骤时,例如一旦您知道有重复就停止内部循环。但是,有比将事物存储在数组中并每次都遍历该数组更好的方法。查看我关于重复检测的一些答案。
  • PS:这段代码 sn-p 不可能删除行 - 你永远不会调用 Sheet#deleteRow
  • 它适用于我的测试电子表格(数据较少)。我没有放入 Sheet#deleterow?

标签: google-apps-script google-sheets


【解决方案1】:

试试这个:

function removeDuplicates() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getRange(580,4,sh.getLastRow(),1);
  var vA=rg.getValues();
  var uA=[];
  var dC=0;
  for(var i=0;i<vA.length;i++) {
    if(uA.indexOf(vA[i].join())==-1) {
      uA.push(vA[i].join());
    }else{
      sh.deleteRow(i + rg.getRow() - dC);
      dC++;
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多