我正在使用此脚本为每个同事建立统计信息,它包含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);
};
答案 0 :(得分:1)
Google在此处提供了最佳做法指南:https://developers.google.com/apps-script/guides/support/best-practices
我看到您正在调用SpreadsheetApp服务七次。太慢了最好先调用一次以获取数据,然后再次调用以写入数据(如果可能的话)。另外,您是否可以使用缓存服务一次从电子表格中提取数据,并为每个单独的用户反复操作它的副本?
https://developers.google.com/apps-script/reference/cache/cache
答案 1 :(得分:0)
我首先建议您浏览一下best practice。
话虽如此,我确实必须在几千张纸上运行一个脚本,并开发了这一小段代码来帮助解决超时问题。它会运行一个超时的循环,您可以设置一个触发器在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);
}
}