超过最大执行时间(第 0 行)

Exceeded maximum execution time (line 0)

我有一个来自工具的 .tsv 文件,我必须 Google Sheet(几乎)实时将其导入报告。这是我的导入代码:

function importBigTSV(url) {return Utilities.parseCsv(UrlFetchApp.fetch(url).getContentText(),'\t');}

它一直工作到几天前,当错误消息一直说 "Exceeded maximum execution time (line 0)."

有人能帮忙吗?非常感谢!

问题:

正如@TheMaster 所说,自定义函数有 30 seconds 的硬限制,您的函数很可能达到了。常规 Apps 脚本执行的时间限制要宽松得多(6 或 30 分钟,具体取决于您的帐户),因此您应该相应地修改您的函数。

功能差异:

为了转换您的功能,您必须考虑这些基本差异:

  • 您不能将参数传递给由菜单或按钮调用的函数。因此,您必须找到另一种方法来指定要获取的URL。
  • 常规函数返回的值不会自动写入 sheet。您必须使用一种书写方法(如 setValuesappendRow)才能做到这一点。
  • 在任何特定单元格中都不会调用非自定义函数,因此您必须指定要将值写入的位置。

因为据我所知,您总是获取相同的 URL,您可以通过将其硬编码到您的函数中来指定 URL。

解决方案:

例如,下面的函数会将解析后的输出写入当前 selected 的范围(在触发函数时)。您也可以使用 getRange:

提供一个默认范围来写入输出
function importBigTSV() {
  var url = "{url-to-fetch}";
  var range = SpreadsheetApp.getActiveRange();
  try {
    var output = Utilities.parseCsv(UrlFetchApp.fetch(url).getContentText(),'\t');
    var outputRange = range.offset(0, 0, output.length, output[0].length);
    outputRange.setValues(output);
  } catch(err) {
    console.log(err);
  }
}

如果 URL 可以改变,我建议你有一个 URL 的列表来获取,并且在触发函数之前,select 想要的 URL,并使用 getActiveRange 以获得此 URL.

正在将功能附加到菜单:

无论如何,一旦您编写了函数,就必须以某种方式附加此函数,以便可以从 sheet 本身触发它。您可以创建 custom menu, or insert and image or drawing, and attach the script to it。引用的链接提供了实现此目的的清晰简洁的步骤。

参考: