簡體   English   中英

Google Apps腳本超時(需要更簡單的方法)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM