繁体   English   中英

工作表的Google脚本-超过了最大执行时间

[英]Google Script for a Sheet - Maximum Execution time Exceeded

我正在编写一个脚本,该脚本将浏览一份月度报告,并为我们工作的公司的每个商店创建工作表,并将每个工作表的数据复制到新工作表中。 目前,我遇到的问题是,我们有两天的数据,并且有171行代码正在运行我的脚本369.261秒,但无法完成。

function menuItem1() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("All Stores");
  var data = sheet1.getDataRange().getValues();
  var CurStore;
  var stores = [];
  var target_sheet;
  var last_row;
  var source_range
  var target_range;
  var first_row = sheet1.getRange("A" + 1 +":I" + 1);

  //assign first store number into initial index of array
  CurStore = data[1][6].toString();
  //add 0 to the string so that all store numbers are four digits.
  while (CurStore.length < 4) {CurStore = "0" + CurStore;}
  stores[0] = CurStore;

  // traverse through every row and add all unique store numbers to the array
  for (var row = 2; row <= data.length; row++) {
    CurStore = data[row-1][6].toString(); 

    while (CurStore.length < 4) {
      CurStore = "0" + CurStore;
    }

    if (stores.indexOf(CurStore) == -1) {
      stores.push(CurStore.toString());
    }
  }

  // sort the store numbers into numerical order
  stores.sort();

  // traverse through the stores array, creating a sheet for each store, set the master sheet as the active so we can copy values, insert first row (this is for column labels), traverse though every row and when the unique store is found, 
  // we take the whole row and paste it onto it's newly created sheet
  // at the end push a notification to the user letting them know the report is finished.
  for (var i = stores.length -1; i >= 0; i--) {
    ss.insertSheet(stores[i].toString());
    ss.setActiveSheet(sheet1);
    target_sheet = ss.getSheetByName(stores[i].toString());
    last_row = target_sheet.getLastRow();
    target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));
    first_row.copyTo(target_range);

    for (var row = 2; row <= data.length; row++) { 
      CurStore = data[row-1][6].toString();

      while (CurStore.length < 4) {
        CurStore = "0" + CurStore;
      }

      if (stores[i] == CurStore) {
        source_range = sheet1.getRange("A" + row +":I" + row);
        last_row = target_sheet.getLastRow();
        target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));
        source_range.copyTo(target_range);
      }
    }

    for (var j = 1; j <= 9; j++) {
       target_sheet.autoResizeColumn(j);
    }
  }

  Browser.msgBox("The report has been finished.");
}

由于我在使用此功能时还比较陌生,因此将不胜感激,并且我确信有很多方法可以加快此速度,否则,我将最终找到一种方法来分解除以执行。 如果需要,我还可以提供一些示例数据。

提前致谢。

问题是在每次迭代中都调用SpreadsheepApp lib相关的方法,例如getRange() 如此处所述:

在脚本中使用JavaScript操作比调用其他服务要快得多。 在Google Apps脚本本身中可以完成的任何事情,比进行需要从Google服务器或外部服务器获取数据的调用要快得多,例如对电子表格,文档,站点,翻译,UrlFetch等的请求。 如果您找到最小化脚本对这些服务的调用的方法,则脚本将运行得更快。

我遇到了同样的情况,而不是像for(i=0;i<data.length;i++) ,我最终将data.length分为3个独立的函数,并在其中每个函数结束时手动运行了它们。 和您一样,我有一个复杂的报表要自动化,这是唯一的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM