Код, предназначенный для удаления нескольких строк (для повышения скорости обработки) при условии, что не работает - PullRequest
1 голос
/ 11 октября 2019

В моем столбце D есть два значения - exp и ok;Я имею в виду удалить все строки exp, но иногда есть тысячи, и макросу требуется несколько веков.

Итак, из обычного макроса - удаляя по 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);

};

Я ранее записал макрос, сортирующий лист, убедившись, что все опытные образцы находятся внизу, думая, что это поможет мне сэкономить несколько хороших минут.

Проблема в том, что всякий раз, когдаЯ запускаю макрос, он удаляет один набор из 50 'строк, а затем выдает ошибку, говорящую о том, что строки выходят за границы.

Есть предложения? (У меня уже есть рабочая версия для удаления одной строки за раз)

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Возможно, мое понимание неверно, но вы можете использовать сопоставление, которое поможет вам быстрее.

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

}
});
0 голосов
/ 15 октября 2019

Если столбец 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);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...