Как заставить этот скрипт работать быстрее? - PullRequest
0 голосов
/ 09 марта 2020

Здравствуйте, поэтому я пытаюсь получить значения из листа 'book', а затем скопировать его на лист 'Completed'. Он берет форму значений, хранит ее в массиве данных и копирует на лист «Завершено». Он работает нормально, но очень медленно, что ставит под угрозу мою работу в плане времени. Как я могу сделать это быстрее?

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var clear_sheet = spreadsheet.getSheetByName('Completed_Orders'); // clear the destination sheet first
  clear_sheet.getRange('A2:X').clear();


  var sheet = spreadsheet.getSheetByName('book'); //source sheet
  var Datarange = sheet.getRange('Q3:Q'); //range to check
  var Datavalue = (Datarange.getValues());
  var dest = spreadsheet.getSheetByName('Completed_Orders'); //destination sheet
  var data = [];
  for (i=0; i<Datavalue.length;i++) {
    if ( Datavalue[i] == "Completed") {
      data.push.apply(data,sheet.getRange(i+3,1,1,24).getValues());
    }
  }
  dest.getRange(2,1,data.length,data[0].length).setValues(data);

  var column = dest.getRange('A3:A');
  var values = column.getValues(); // get all data in one call
  var ct = 0;
  while ( values[ct][0] != "" ) { // to find the last row correctly, getLastRow is not working perfectly
    ct++;
  }
  var endRow = ct+2;
}

1 Ответ

1 голос
/ 09 марта 2020

Попробуйте:

Не используйте этот синтаксис var values=sheet.getRange('A3:A').getValues(), потому что он получает данные вплоть до getMaxRows (). Вместо этого используйте var values=sheet.getRange(3,1,sheet.getLastRow()-2,1).getValues().

Также Datavalue [i] - это целая строка

function myfunction() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var clear_sheet = spreadsheet.getSheetByName('Completed_Orders'); 
  clear_sheet.getRange(2,1,clear_sheet.getLastRow()-1,24).clear();    
  var sheet = spreadsheet.getSheetByName('book'); //source sheet
  var Datarange = sheet.getRange(3,17,sheet.getLastRow()-2,1); //range to check
  var Datavalue = Datarange.getValues();
  var dest = spreadsheet.getSheetByName('Completed_Orders'); //destination sheet
  var data = [];
  for (var i=0;i<Datavalue.length;i++) {
    if (Datavalue[i]["************You need another index here**************"] == "Completed") { //need another index Datavalue is 2d
      data.push(sheet.getRange(i+3,1,1,24).getValues());
    }
  }
  dest.getRange(2,1,data.length,data[0].length).setValues(data);
}

Я думаю, что эта версия будет намного быстрее.

function myfunction() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var ssh=ss.getSheetByName('book');
  var dsh=ss.getSheetByName('Completed_Orders'); 
  dsh.getRange(2,1,dsh.getLastRow()-1,24).clear();    
  var dv=ssh.getRange(3,1,ssh.getLastRow()-2,24).getValues();//this version just gets this data one time so it should a lot faster.
  var data=[];
  for (var i=0;i<dv.length;i++) {
    if (dv[i][16]=="Completed") { 
      data.push(dv[i]);
    }
  }
  dsh.getRange(2,1,data.length,data[0].length).setValues(data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...