[英]Google Apps Script Timing Out (needs simpler approach)
我正在使用此腳本來建立每個同事的統計信息,它包含15個數據透視表,這些數據透視表經常需要在不同的時間段更新其過濾器。 我在此工作表上有很多同事,因此每人15張桌子的腳本最終花費的時間太長且超時。
我包括一張表,但是代碼每人有15次此迭代( 乘以20+人 )。
如何防止其超時? 通過變通或清理代碼來提高效率。
function MassUpdateofFilters() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('Andrew!A1').activate();
var sourceData = spreadsheet.getRange('Batches!1:997');
var pivotTable = spreadsheet.getRange('A1').createPivotTable(sourceData);
pivotTable.setValuesDisplayOrientation(SpreadsheetApp.Dimension.ROWS);
var pivotValue = pivotTable.addPivotValue(3, SpreadsheetApp.PivotTableSummarizeFunction.SUM);
var pivotGroup = pivotTable.addRowGroup(5);
pivotGroup.showTotals(false)
.sortDescending()
.sortBy(pivotTable.getPivotValues()[0], []);
pivotGroup = pivotTable.addRowGroup(4);
pivotGroup.showTotals(false);
var criteria = SpreadsheetApp.newFilterCriteria()
.setVisibleValues(['Andrew'])
.build();
pivotTable.addFilter(5, criteria);
criteria = SpreadsheetApp.newFilterCriteria()
.setVisibleValues([ '1', '2', '3', '5', '6', '7'])
.build();
pivotTable.addFilter(16, criteria);
criteria = SpreadsheetApp.newFilterCriteria()
.setVisibleValues(['April'])
.build();
pivotTable.addFilter(15, criteria);
criteria = SpreadsheetApp.newFilterCriteria()
.setVisibleValues(['2019'])
.build();
pivotTable.addFilter(17, criteria);
};
Google在此處提供了最佳做法指南: https : //developers.google.com/apps-script/guides/support/best-practices
我看到您正在調用SpreadsheetApp服務七次。 太慢了 最好先調用一次以獲取數據,然后再次調用以寫入數據(如果可能的話)。 另外,您是否可以使用緩存服務一次從電子表格中提取數據,並為每個單獨的用戶反復操作它的副本?
https://developers.google.com/apps-script/reference/cache/cache
我首先建議您進行最佳實踐 。
話雖這么說,但我確實必須在幾千張紙上運行一個腳本,並開發了這一小段代碼來幫助解決超時問題。 它會運行一個超時的循環,您可以設置一個觸發器在5或10分鍾內運行一次。 幾個小時后,它將成功。 請記住,如果您這樣做過多,Google最終將使您超時,並且您可能需要等待一天左右的時間才能再次運行它。
function changeAll() {
var startd = new Date();
var diff = 0;
var start = Number(PropertiesService.getScriptProperties().getProperty("START"));
Logger.log(start);
for(var i = start; i < YOUR_MAX && diff < 280; i++){
//MAKE CHANGES HERE **************************************************************************
//END CHANGE AREA ****************************************************************************
//Change time and counter for next run
PropertiesService.getScriptProperties().setProperty("START", i);
var now = new Date();
var difdate = (now.getTime() - startd.getTime()) * 0.001;
diff = difdate;
Logger.log("DIFF: " + diff);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.