如何加快Google Apps脚本的运行时间?

时间:2019-07-18 14:26:24

标签: javascript google-apps-script

我是程序设计领域的初学者,我创建了一个脚本来遍历table1并根据其告知的时间段将值带入table2中。

该脚本正常运行,因为它在运行时非常慢。我想要一些帮助,以使他更快。

我搜索了数组,但我不明白如何应用此功能。

链接电子表格:https://docs.google.com/spreadsheets/d/1mXPCEC50rw49GU42wM-VoQjVFqeGpw7O7A_eo5tZMms/edit#gid=1483928389

链接脚本:https://script.google.com/d/MRZzi4FhForjALEjRtYg7-CuYWxd3EZHO/edit?mid=ACjPJvFf4IPyfgW5E8N_XRpLXHxjNzQMt2gpkcMd0L7nom15r8yLAaUfGyxmhInUC2B9cVfhDFNmRVqycy7hfyOjIv3IcxkEPxOWx8aSfeGF6zjklcEyKc-daU6m3hDBVTEDq_HpC-gowQI&uiv=2

function teste() {

  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Página6");
  var tabela = ss.getRange(3, 9, ss.getLastRow(), 1).getValues();

  for(var l1 = 3 ; l1 <= tabela.length ; l1 ++ ){
    var tab1 = ss.getRange(l1,8).getValue();
    for( var l2 = 3 ; l2 <= tabela.length ; l2 ++ ){
      var tab2 = ss.getRange(l2,12).getValue();

      if (tab1 == tab2){

        for( var col = 13 ; col < 17 ; col ++){
             var coluna = ss.getRange(2, col).getValue();

          if( ss.getRange(l1, 9).getValue() == ss.getRange(2, col).getValue()){
               ss.getRange(l2, col).setValue(ss.getRange(l1, 10).getValue());
          }
        }
      }
    }
  } 
}

2 个答案:

答案 0 :(得分:1)

  • 您要将表转换为下图。您要将左表转换为右表。

  • ProdutoMês 1的每个Mês 4都是相同的。
  • Mês的数量进行了排序。
  • 左右表的位置在示例中是固定的。
    • 左表是H2:J38
    • 右边的表格是L2:P11
  • 您想通过修改来加快脚本的运行速度。

我可以像上面那样理解。如果我的理解是正确的,那么该修改如何?请认为这只是几个答案之一。

修改点:

  • 在脚本中,重要的一点是准备好要放在工作表中的值,然后使用setValues()将准备好的值放在工作表中。
  • 在此修改中,还准备了getValues()检索到的值,并使用setValues()将其放入工作表。

修改后的脚本:

function teste() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Página6");
  var values = ss.getRange(3, 8, ss.getLastRow() - 2, 5).getValues();

  // Value are parsed and put them to an object.
  var obj = values.reduce(function(o, e) {
    if (o[e[0]]) {
      o[e[0]][e[1]] = e[2];
    } else {
      o[e[0]] = {};
      o[e[0]][e[1]] = e[2];
    }
    return o;
  }, {});

  // Create an array for putting values to sheet.
  var ar = values.filter(function(e) {return e[4]}).map(function(e) {return Object.keys(obj[e[4]]).map(function(f) {return obj[e[4]][f]})});

  // Put the values.
  ss.getRange(3, 13, ar.length, ar[0].length).setValues(ar);
}

参考文献:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

答案 1 :(得分:0)

阅读本文,它应根据项目的复杂性为您提供帮助。 https://developers.google.com/apps-script/guides/support/best-practices