1

我目前正在为我的公司开发一个新的电子表格,以使我们每周执行的任务之一更容易 - 它的工作方式是将数据导入到此电子表格中,然后运行脚本来生成我们使用的报告。下面是我为编制电子表格的一部分而编写的一个脚本示例。Google Apps脚本 - 超出最长执行时间

手动导入到电子表格中的数据最多可以包含3000个信息单元,因此用于检查单元格的循环 - 但是无论何时运行此脚本,它都将启动到第1617行,然后向我提供超出最大错误执行时间 - 是否有避免这个问题,因为我有几个脚本需要后来运行,以帮助生成我们使用的报告。

有6张纸,每张纸都有数据输入,取决于已导入数据中的单元格值。

function WorkoutTotals() { 
// ----------------------------------------------------------------------------- 
// This function is used for working out the totals of each centre 
// ----------------------------------------------------------------------------- 
var value; 
for (var j = 2; j < abignumber; j++) { 
    var rawcentres = rawdata.getRange(j, 1); 
    var rawcategory = rawdata.getRange(j, 6); 
    switch (rawcentres.getValue()) { 
    case centres[0]: 
     centresheet = ss.getSheetByName(sheets[0]); 
     switch (rawcategory.getValue()) { 
     case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[1]: 
     centresheet = ss.getSheetByName(sheets[1]); 
     switch (rawcategory.getValue()) { 
     case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[2]: 
     centresheet = ss.getSheetByName(sheets[2]); 
     switch (rawcategory.getValue()) { 
     case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[3]: 
     centresheet = ss.getSheetByName(sheets[3]); 
     switch (rawcategory.getValue()) { 
        case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[4]: 
     centresheet = ss.getSheetByName(sheets[4]); 
     switch (rawcategory.getValue()) { 
        case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[5]: 
     centresheet = ss.getSheetByName(sheets[5]); 
     switch (rawcategory.getValue()) { 
        case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
     } 
    break; 
    } 
} 
} 

回答

1

这里的主要问题是脚本获取/设置每个迭代的值。相反,您可以获取整个范围,计算并更新范围以缩短执行时间。这是来自Developers网站的similar example

+0

即使对于很多数据,您可能需要重写脚本,以便使用时间触发块进行处理,并将其当前状态保存在script中PropertyProperties –

+0

您是否偶然有一个我可以使用的示例?我很少使用JavaScript代码,因此我的代码很差= /。 – Andy

+0

@Chris是正确的,批量读/写应该解决这个问题。还有一些关于阅读/书写电子表格的教程作为对象https://developers.google.com/apps-script/guides/sheets。如果仍然需要分块脚本,则最近的自定义脚本库已经发布,以执行此操作。http://patt0.blogspot.in/2014/01/using-scriptapp-to-process-batches-in.html – mhawksey

相关问题