【问题标题】:Google Scripts Runtime Optimization谷歌脚本运行时优化
【发布时间】:2018-03-18 10:10:24
【问题描述】:

所以我在 VBA 中做了大量工作后第一次使用谷歌脚本。运行代码时,我收到一条消息,指出脚本运行时间过长。 .getValue() 和 .setValue() 等某些部分会导致问题,但我不确定如何重新编写代码以更好地优化。 这是代码:

function getPredictions() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var Carter = ss.getSheetByName("Carter");
  var back = ss.getSheetByName("Back");
  var monthsLeft= Carter.getRange(13,15)
  var months = monthsLeft.getValue();
  var total = 0;
  Carter.getRange("d2").setValue(months);
  for(var i = 13;Carter.getLastRow(); i++){
    if(Carter.getRange(i, 2).getValue() != ""){
      total = 0;
      var k = 17;
      monthsLeft = Carter.getRange(i,15).getValue();
      for(var j = 2; j<29; j++){
        if(back.getRange(j, 2).getValue() <= monthsLeft){
          total = total + back.getRange(j, 3).getValue();
          Carter.getRange(i,k).setValue((back.getRange(j, 3).getValue() / Carter.getRange(i,16).getValue()) * Carter.getRange(i,11).getValue());
          k++;
        }
      }
    }
  }
}

function getMonthsL () {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var Carter = ss.getSheetByName("Carter");
  for(var i = 13; i < Carter.getLastRow(); i++){
     if(Carter.getRange(i, 2).getValue() != ""){
       Carter.getRange(i,15).setFormula('=if(day($B$5)>20,DATEDIF($B$5,I' +i + ',"M"),DATEDIF($B$5,I' +i+',"M")+1)');
     }
   }
}

function getMonthP(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var Carter = ss.getSheetByName("Carter");
  var back = ss.getSheetByName("Back");
  var total = 0;
  for(var i = 13; i < Carter.getLastRow(); i++){
    total = 0;
    if(Carter.getRange(i, 2).getValue() != ""){
      for(var j = 2; Carter.getRange(i,15).getValue() >= back.getRange(j,2).getValue(); j++){
        total = total + back.getRange(j,3).getValue(); 
      }
    Carter.getRange(i,16).setValue(total);
    }
  }
}

function runAll(){
getMonthsL();
getMonthP();
getPredictions();
}

任何关于重构它的最佳方式的帮助/解释将不胜感激。

【问题讨论】:

标签: javascript optimization google-apps-script google-sheets


【解决方案1】:

我不认为这个答案是正确的,但我想我只是给你一个例子,说明我们中的许多人会向你推荐什么。试图限制 getValue() 的使用并尝试使用返回二维数组的 getValues(有点)。

其中一个复杂性是索引从零开始,而行和列从一开始。因此,有时保持一切正常可能会有点挑战,但一旦你这样做了,你会发现代码运行速度可以快 10 倍。

function getPredictions() 
{
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var Carter=ss.getSheetByName("Carter");
  var crg=Carter.getDataRange();
  var carterA=crg.getValues();
  var back=ss.getSheetByName("Back");
  var backA=back.getDataRange().getValues();
  var months=carterA[12][14];
  var total=0;
  carterA[3][1]=months;
  for(var i = 12;i<carterA.length; i++)
  {
    if(carterA[i][1]!= "")
    {
      total = 0;
      var k = 16;
      var monthsLeft = carterA[i][14];
      for(var j=0;j<28;j++)//I probably got this indexing incorrect
      {
        if(backA[j][1] <= monthsLeft)
        {
          total = total + backA[j][2];
          carterA[i][k]=backA[j][2];
          k++;
        }
      }
    }
  }
  crg.setValues(carterA);//This save all the changes
  //Didn't do backA because I don't think you changed it.
}

我很确定这行不通。但希望它能让您了解如何更快地编写代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    相关资源
    最近更新 更多