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

时间:2016-02-04 20:44:29

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

我正在编写一个脚本,该脚本将查看月度报告,并为我们工作的公司为每个商店创建工作表,并将每个商店的数据复制到新工作表中。目前我遇到的问题是我们有两天的数据,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.");
}

任何帮助都会非常感激,因为我还是比较新用的,我相信有很多方法可以加快速度,如果没有,我最终会找到一种方法来打破分割执行的功能。如果需要,我还可以提供一些样本数据。

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题是在每次迭代中调用SpreadsheepApp与lib相关的方法,如getRange()。如上所述:

  

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

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