如何使此脚本运行更快?

时间:2020-03-09 12:34:27

标签: google-apps-script google-sheets

您好,所以我试图从“书”表中获取值,然后将其复制到“已完成”表中。它采用值形式的书,将其存储在数据数组中,然后将其复制到“已完成”工作表中。它的工作正常,但速度很慢,这在时间上不利于我的工作。我怎样才能使其运行更快?

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 个答案:

答案 0 :(得分:1)

尝试一下:

请勿使用此语法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);
}