Код занимает 2 минуты, чтобы вставить значения на другую вкладку. Как это оптимизировать? - PullRequest
1 голос
/ 04 ноября 2019

Я сделал этот код в Google Script, но он занимает слишком много времени (он занимает 10-15 строк за 30 минут. Я не знаю, как его оптимизировать больше. Может ли размер таблицы влиять на егообработка? Если нет, как я могу изменить его, чтобы улучшить?

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, 1, 11).getValues()); 
        }
      }
      helpMacro.getRange(i, 17).activate().setValue("Feito"); 
    }
  }
}

1 Ответ

3 голосов
/ 04 ноября 2019

Вы пытаетесь оптимизировать функцию скрипта 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,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, 1, 11).setValues(helpMacro.getRange(i, 6, 1, 11).getValues()); 
        }
      }
      helpMacro.getRange(i, 17).activate().setValue("Feito"); 
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...