用于删除条件的多行代码(以提高处理速度)的代码不起作用

时间:2019-10-11 17:07:38

标签: google-apps-script google-sheets google-docs google-sheets-macros

在D列上有两个值-exp和ok;我本来打算删除所有exp行,但是有时会有1000个,并且宏需要很长时间才能完成。

因此,从普通宏中-一次删除1行,我正在尝试删除多行。


function expirate_removed(){



  var app = SpreadsheetApp.getActive();
  var activesheet = app.getActiveSheet()


  var r = activesheet.getRange('D:D');
  var v = r.getValues();
  for(var i=v.length-1;i>=0;i--)


    if( v[0,i-50]=='exp')
      activesheet.deleteRows(i-50, 50);

};

我以前已经记录了一个宏来对工作表进行排序,确保所有exp都在底部,以为这可以节省几分钟。

问题是,每当我运行宏时,它都会删除一组50'行,然后给出错误消息,指出行超出范围。

有什么建议吗? (我已经有一个可以一次删除一行的工作版本)

2 个答案:

答案 0 :(得分:0)

假设列D已排序,请尝试以下操作:

function expirate_removed(){
  var app = SpreadsheetApp.getActive();
  var activesheet = app.getActiveSheet();

  var r = activesheet.getRange('D:D');
  var v = r.getValues();

  var startRow = 0;
  var endRow = 0;

  for(var i=0; i<v.length; i++) {
    if(v[i] == 'ok'){
      startRow = i+1;
      break;
    }
  }

  for(var i=startRow; i<v.length; i++) {
    if(v[i] != 'ok'){
      endRow = i;
      break;
    }
  }

  activesheet.deleteRows(startRow, endRow - startRow + 1);
};

答案 1 :(得分:0)

也许我的理解是错误的,但是您可以使用映射来帮助您更快地获得结果。

    function expirate_removed(){
      var app = SpreadsheetApp.getActive();
      var activesheet = app.getActiveSheet();

      var values = activesheet.getRange(1,5,activesheet.getLastRow()).getValues();
      var mapValues = values.map(function(r){return r[0]});
      mapValues.forEach(function(elt,index){
      if(elt == "exp"){
     activesheet.deleteRow(index);

}
});