为什么执行变得如此慢,具有完全相同的功能? (Google apps Script / JS)

时间:2018-06-14 08:41:01

标签: javascript performance google-apps-script google-sheets

我使用的电子表格包含几个简单的功能 基本上他们使用简单的getValues和setValues,按顺序批量调用 优化执行时间。

示例1:

function updateSocialMediaAnalytics() {

    var ss = SpreadsheetApp.getActiveSpreadsheet();

    // define relevant ranges
    var constantAnalytics = sheet.getRange("I2:K90").getValues();
    var autoAnalytics = sheet.getRange("N2:P90").getValues();
    var newConstantAnalytics = new Array(89);

    // Replace auto values in constant columns, creating new constant columns
    for (row=0;row<89;row++){
      newConstantAnalytics[row] = new Array(3);
      for (column=0;column<3;column++){
        if (autoAnalytics[row][column] == "Error" || autoAnalytics[row][column] == ""){
          newConstantAnalytics[row][column] = constantAnalytics[row][column];
        }else{
          newConstantAnalytics[row][column] = autoAnalytics[row][column];
        }
      } 
    }
    // set new values
    sheet.getRange("I2:K90").setValues(newConstantAnalytics);  
}

此updateSocialMediaAnalytics函数仅使用getValues两次,并且仅使用setValues一次。
执行时仍需要大约60秒(!)。 如果我将此函数循环到10张纸上,则超出了执行时间限制。

值得注意的是,在早期的脚本版本中,这个相同的脚本运行得更快。

示例2:

function hideMostColumns() {
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var lastColumn = activeSheet.getLastColumn();

  activeSheet.hideColumns(3,3); //hides columns C-E
  activeSheet.hideColumns(7); //hide column G
  activeSheet.hideColumns(9,lastColumn-9); //hides columns from G until last column (not included)
  };

此hideMostColumns函数用于在1秒后完成执行,现在需要超过60秒..

早期快速执行sript与当前慢执行脚本之间的主要区别在于我已将功能添加到同一脚本中,而不是将它们保存在不同的项目中。 该脚本还包含customMenu函数和onEdit函数(如果编辑不在特定列上,则返回immediatley。)
我已经检查了脚本仪表板,以确保功能正确执行,并且不会同时触发其他功能。

发生什么事了?我错过了什么吗?

编辑:
在Dimu Designs评论中提出建议之后,我检查了我的执行记录 这是针对hideMostColumns函数的:

>[18-06-15 06:11:02:598 PDT] Starting execution  
>[18-06-15 06:11:02:605 PDT] SpreadsheetApp.getActiveSheet() [0 seconds]  
>[18-06-15 06:11:17:773 PDT] Sheet.getLastColumn() [15.167 seconds]  
>[18-06-15 06:11:28:298 PDT] Sheet.hideColumns([3, 3]) [10.524 seconds]  
>[18-06-15 06:11:38:766 PDT] Sheet.hideColumns([7]) [10.467 seconds]  
>[18-06-15 06:11:49:356 PDT] Sheet.hideColumns([9, 14]) [10.589 seconds]  
>[18-06-15 06:11:49:484 PDT] Execution succeeded [46.752 seconds total runtime]  

这些电话突然花了太多时间。几天前,他们每个人花了不到1秒的时间。

这个有用的信息可能有所帮助 - 当我将updateSocialMediaAnalytics函数循环到所有Spreadsheets时,所有函数的执行延迟开始发生。我只循环这个特定的功能。 然而,即使我将功能更改回上面分享的功能,只能在活动工作表上工作,每个功能运行仍需要一分钟!包括首先没有循环的功能。

0 个答案:

没有答案