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

Javascript 工作表的Google脚本-超过最大执行时间,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正在写一个脚本,它将浏览一份月度报告,为我们工作的公司的每个门店创建表单,并将每个门店的数据复制到新表单中。目前我遇到的问题是,我们有两天的数据,171行代码需要369.261秒才能运行,但无法完成 function menuItem1() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet1 = ss.getSheetByName("All Stores"); var data = sheet1.getDataR

我正在写一个脚本,它将浏览一份月度报告,为我们工作的公司的每个门店创建表单,并将每个门店的数据复制到新表单中。目前我遇到的问题是,我们有两天的数据,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.");
}
函数menuItem1(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet1=ss.getSheetByName(“所有门店”);
var data=sheet1.getDataRange().getValues();
var CurStore;
var存储=[];
var目标表;
var最后一行;
var源范围
var目标范围;
var first_row=sheet1.getRange(“A”+1+”:I”+1);
//将第一个存储编号分配到数组的初始索引中
CurStore=data[1][6].toString();
//将0添加到字符串中,以便所有门店编号均为四位数字。
而(CurStore.length<4){CurStore=“0”+CurStore;}
存储区[0]=游标存储区;
//遍历每一行并将所有唯一的存储编号添加到数组中

对于(var row=2;row,问题是在每次迭代中调用
spreadsheepap
lib相关方法,如
getRange()
。如下所述:

在脚本中使用JavaScript操作要快得多 而不是打电话给其他服务。任何你能在谷歌内完成的事情 应用程序脚本本身将比拨打需要的电话快得多 从Google的服务器或外部服务器获取数据,例如 对电子表格、文档、站点、翻译、UrlFetch等的请求。 如果您能找到方法来最小化错误,您的脚本将运行得更快 脚本对这些服务的调用


我遇到了同样的情况,而不是为(i=0;i数据范围有多大?如果您将每个存储的数据中的行拼接出来,这样下一个存储就不必再搜索这些数据了,那么您可能可以大大加快处理速度。当运行它时,您也可以通过自己而不是通过手动触发器来调度它。一旦所有数据都如果在月底提交,我认为数据范围将至少为3000行,最多为9行。拼接行的唯一问题是我希望有一个完整数据的主控表。您是否介意进一步详细说明计划触发器,以了解为什么这可能会实现更快的执行?您不会这样做e来自实际工作表的数据,仅来自数据变量(您可以从主数据获取,也可以先写入)。您必须扫描以查找条目的范围将不断缩小,根据我的经验,这抵消了删除元素的成本。根据我的经验,在关闭工作表的同时运行流程可能会使其执行更快,因为用户不必同时查询它,也不必不断更新视图.不幸的是我最需要的函数(insertSheet)是一个始终需要2-5秒才能执行的表单。我建议创建一个包含x个空表单的模板电子表格,而不是继续在
for
循环中插入表单,只需复制该电子表格并将其用于您的月度报告。