Google Apps脚本超时(需要更简单的方法)

时间:2019-05-22 22:50:07

标签: javascript google-apps-script simplify

我正在使用此脚本为每个同事建立统计信息,它包含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);
};

2 个答案:

答案 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);

  }

}