在 VBA 中进行了大量工作之后,我第一次使用 google 脚本。运行代码时,我收到一条消息,指出脚本运行时间太长。某些部分(例如 .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();
}
任何有关重构此问题的最佳方法的帮助/解释将不胜感激。
最佳答案
我不认为这个答案是正确的,但我想我只是给你一个我们许多人会向你推荐的例子。尝试限制 getValue() 的使用并尝试使用返回二维数组(某种程度)的 getValues。
复杂性之一是索引从 0 开始,行和列从 1 开始。因此,有时保持一切正常可能有点困难,但一旦你做到了,你会发现代码的运行速度可以提高 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.
}
我很确定这行不通。但希望它能让您了解如何使代码更快。
关于javascript - Google 脚本运行时优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46608513/