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

Ngu*_*ong 3 google-sheets urlfetch google-apps-script custom-function

错误信息

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

function importBigTSV(url) {return Utilities.parseCsv(UrlFetchApp.fetch(url).getContentText(),'\t');}
Run Code Online (Sandbox Code Playgroud)

直到几天前,当错误消息一直说“超出最大执行时间(第 0 行)”时,它仍然有效。

有人可以帮忙吗?非常感谢!

Iam*_*hus 7

问题:

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

功能之间的差异:

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

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

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

解决方案:

例如,下面的函数会将解析后的输出写入当前选择的范围(在触发函数时)。您也可以使用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);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果 URL 可以更改,我建议您有一个要获取的 URL 列表,并且在触发该功能之前,选择所需的 URL,并使用getActiveRange以获取此 URL。

将功能附加到菜单:

在任何情况下,一旦你编写了你的​​函数,你必须以某种方式附加这个函数,以便它可以从工作表本身触发。您可以创建自定义菜单,或者插入图像或绘图,然后将脚本附加到它。引用的链接提供了实现此目的的清晰简洁的步骤。

参考: