2017-09-01 89 views
1

每次運行時,我都會在圖紙腳本編輯器中看到這個紅色燈泡消息。代碼有問題嗎?它似乎有效,執行時間並不長。紅色燈泡警告

方法Range.getValue頻繁使用由腳本

該腳本使用這被認爲是昂貴的方法。每次調用都會產生一個耗時的遠程服務器調用。這可能會對腳本的執行時間產生嚴重影響,尤其是對於大數據。如果性能是腳本的問題,則應考慮使用其他方法,例如Range.getValues()

function Merge() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('Expense Index'); 
    var lastrow=sheet.getLastRow(); 
    var range = sheet.getRange("A1:F"+(lastrow+1)); 
var k=3; 

    for (var i = 4; i <=lastrow+1; i++) { 
    var val1=range.getCell(i-1, 1).getValue(); 
    var val2=range.getCell(i, 1).getValue(); 

    if(val1!==val2){ 
    if(!(sheet.getRange('A'+k+':A'+(i-1)).isPartOfMerge())){ 
    sheet.getRange('A'+k+':A'+(i-1)).mergeVertically(); 
    range.getCell((i-1), 6).setValue('=SUM(E'+k+':E'+(i-1)+')'); 
    } 
    k=i; 
    } 
} 
sheet.getRange("A1:F"+(lastrow+1)).setHorizontalAlignment('center'); 
sheet.getRange("A1:F"+(lastrow+1)).setVerticalAlignment('middle') 
} 

回答

0

谷歌Google Apps腳本best practices建議由開發團隊。進行重複範圍呼叫在操作中是昂貴的。批量處理範圍數據然後迭代返回的對象會更好。

現在,你在每個循環中請求2個對象。將所有數據作爲單個對象更有效。所以,改變:使用括號標記

var range = sheet.getRange("A1:F"+(lastrow+1)); 

// range.getValues() returns a 2D array you can loop through in one call. 
var range = sheet.getRange("A1:F"+(lastrow+1)).getValues(); 

和循環通過該對象。

+0

總noob,我似乎無法弄清楚如何循環對象,我試過了一堆東西,但經常得到這個錯誤。 TypeError:無法在對象中找到getCell函數費用 –

+0

如何設置表單?我可以使用示例循環來更新以幫助解決問題。 – Brian

+0

https://drive.google.com/open?id=1MUguO4w6CkeuOGToFBGffCKFV8skVt0FlKe7yCzip4A –