代码需要2分钟才能将值粘贴到另一个选项卡上。如何优化它?

我已经在Google Script上完成了这段代码,但是它花费的时间太长了(它在30分钟内完成10到15行。我不知道如何进一步对其进行优化。电子表格的大小是否会影响它的处理,如果没有,如何更改以改进?

function PreenchePlanilhaFinal() {
  var App = Spreadsheetapp;
  App.getactiveSpreadsheet().getSheetByName('MacroHelp').getRange(1,1).activate();
  var helpMacro = App.getactiveSpreadsheet().getactiveSheet(); //aba que vc está ativo
  var lastLine = helpMacro.getLastRow(); 
  for (var i = 214; i < lastLine; i++){ 
    if (helpMacro.getRange(i,17).getvalue() == "") 
    {
      var regionCode = helpMacro.getRange(i,5).getvalue(); 
      var nomeAba = ""; //inicializo a variável da região
      for (var j = 1; j < lastLine; j++){ 
        if (regionCode == helpMacro.getRange(j,20).getvalue()){
          nomeAba = helpMacro.getRange(j,21).getvalue(); 
          break;
        }
      }
      var email = helpMacro.getRange(i,1).getvalue(); 
      var aba = App.getactiveSpreadsheet().getSheetByName(nomeAba); 
      aba.getRange(1,1).activate(); //ativo a aba
      var lastLineNovaAba = aba.getLastRow();
      for (var k = 1; k <= lastLineNovaAba; k++){
        if (email == aba.getRange(k,8).getvalue()){
          App.getactiveSpreadsheet().getactiveSheet().getRange(k,31,1,11).setvalues(helpMacro.getRange(i,6,11).getvalues()); 
        }
      }
      helpMacro.getRange(i,17).activate().setvalue("Feito"); 
    }
  }
}
nihao_123456 回答:代码需要2分钟才能将值粘贴到另一个选项卡上。如何优化它?

您正在尝试优化脚本功能PreenchePlanilhaFinal()

执行时间受许多getValue语句的影响;这些中的每一个(特别是在循环中重复时)可能都非常昂贵。解决方案是在可能的情况下:1)getValues()仅一次,2)在循环外执行此操作。

以下脚本未经测试,但演示了基本方法。


function PreenchePlanilhaFinal() {
  var App = SpreadsheetApp;
  App.getActiveSpreadsheet().getSheetByName('MacroHelp').getRange(1,1).activate(); // get MacroHelp A1
  var helpMacro = App.getActiveSpreadsheet().getActiveSheet(); //aba que vc está ativo
  var lastLine = helpMacro.getLastRow(); 

    // new line to get last column
    var lastColumn = helpMacro.getlastColumn();

    // new line to declare start line as a variable
    var startRow = 214;

    // define the range and get values
    var helpMacroData = helpMacro.getRange(startRow,1,lastLine-startRow+1,lastColumn).getValues();

    // declare aba outside the loop,and define the range and get values
    var aba = App.getActiveSpreadsheet().getSheetByName(nomeAba); 
    var abaLR = aba.getlastRow();
    var abaLC = aba.getLastColumn();
    var abaData = aba.getRange(1,abaLR,abaLC).getValues();


    // note i = 0 since the values start on line 214
  for (var i = 0; i < lastLine; i++){ 

    if (helpMacroData[i][16] == "") // describe variable as array value
    {
      var regionCode = helpMacroData[i][4];// describe variable as array value
      var nomeAba = ""; //inicializo a variável da região
      for (var j = 0; j < lastLine; j++){ // set j to 0 since arrays are zero-based
        if (regionCode == helpMacroData[0][19]){// describe variable as array value
                        nomeAba = helpMacroData[j][20];// describe variable as array value
          break;
        }
      }
      var email = helpMacroData[i][0];// describe variable as array value
      aba[0][0].activate(); //ativo a aba //// describe variable as array value
      for (var k = 0; k < abaLC; k++){ set k to 0 since arrays are zero-based,also make "<" not "<="
        if (email == aba[k][7]){   // describe variable as array value
          App.getActiveSpreadsheet().getActiveSheet().getRange(k,31,11).setValues(helpMacro.getRange(i,6,11).getValues()); 
        }
      }
      helpMacro.getRange(i,17).activate().setValue("Feito"); 
    }
  }
}
本文链接:https://www.f2er.com/3169345.html

大家都在问