【发布时间】: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();
}
任何关于重构它的最佳方式的帮助/解释将不胜感激。
【问题讨论】:
-
使用getValues() 获取自然网格中的数据并使用array indexes 访问值,而不是获取单个单元格值。还有一些best practices
标签: javascript optimization google-apps-script google-sheets