0

所以我與谷歌的腳本在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(); 
} 

任何幫助/解釋,將不勝感激。

+3

非但沒有單獨的單元格值 - 使用[的GetValues()](https://developers.google.com/apps-script/reference/spreadsheet/range#getValues()),以獲得自然網格和訪問數據使用[數組索引]的值(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections#Multi-dimensional_arrays)。另外一些[最佳實踐](https://developers.google.com/apps-script/guides/support/best-practices) –

回答

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. 
} 

我很確定這不起作用。但希望它能讓你瞭解如何使代碼更快。