意外错误 DEADLINE_EXCEEDED google 电子表格 onOpen() 触发器

unexpected error DEADLINE_EXCEEDED google spreadsheet onOpen() trigger

我有一个 google 电子表格插件,Formula Tracer Sidebar,发布在 Google 工作区市场上。

每隔一段时间,gcloud 日志资源管理器中就会出现以下错误条目。

示例日志条目

{
"insertId": "***",
"jsonPayload": {
  "serviceContext": {
    "service": "***"
  },
  "context": {
    "reportLocation": {
      "functionName": "[unknown function]",
      "filePath": "[unknown file]"
    }
  },
  "message": "We're sorry, the JavaScript engine reported an unexpected error. Error code DEADLINE_EXCEEDED."
},
"resource": {
  "type": "app_script_function",
  "labels": {
    "invocation_type": "simple trigger",
    "project_id": "formula-tracer-side-bar",
    "function_name": "onOpen"
  }
},
"timestamp": "2022-04-05T18:14:51.408Z",
"severity": "ERROR",
"labels": {
  "script.googleapis.com/user_key": "***",
  "script.googleapis.com/project_key": "***",
  "script.googleapis.com/deployment_id": "***",
  "script.googleapis.com/process_id": "***"
},
"logName": "***",
"receiveTimestamp": "2022-04-05T18:14:51.690091557Z"
}

添加插件菜单项的onOpen触发器发生异常

resource.labels 值:

"invocation_type": "simple trigger",
"function_name": "onOpen"

打开:

function onOpen(e){
  let menu = SpreadsheetApp.getUi().createAddonMenu();
  menu.addItem('Trace precedents', 'tracePrecedents');
  menu.addItem('Trace dependents', 'traceDependents');

  menu.addToUi();.
}

我从未经历过或实际看到错误,也不知道如何重现错误。我只能这样的日志文件条目。

我发现一些较旧的帖子虽然有类似的错误但并不完全相同,这表明这是因为 V8 运行 时间错误。例如:here and here.

This article by Google 日历支持给出了一种通用的解释和解决方案(重新发送请求)。 假设这是类似的情况,甚至可能是完全相同的 V8 错误,我正在考虑以下实现

  1. 用 try-catch ans extract 包装添加菜单以分离功能 _addmenus()
  2. 检查 _addmenus() return 值。如果不成功睡觉再试一次
  3. 最大尝试次数 = 10

新打开:

function onOpen(e) {
  let done = false;
  const maxTimes = 10;
  const timeout = 200; //ms
  let i = 1;

  //loop to try add menus
  while(!done && i <= maxTimes){
    //add menus
    done = _addmenus();

    //if failed - sleep before next try
    if (!done && i < maxTimes){
      Utilities.sleep(timeout);
    }

    i++;
  }

  //done loop - log failure
  if (!done){
    console.error("failed to add FT menu items");
    const msg = `Unexpected error while loading spreadsheet addon. `
            +`Please try to reload the spreadsheet. `
            +`If the problem continute, wait a few minutes and try again.`;
    SpreadsheetApp.getUi().alert(msg);
 }
}

function _addmenus() {
  let success = false;
  try {

    let menu = SpreadsheetApp.getUi().createAddonMenu();
    menu.addItem('Trace precedents', 'tracePrecedents');
    menu.addItem('Trace dependents', 'traceDependents');
    menu.addToUi();
    success = true;

  } catch (e) {
    console.error("SS onOpen", e);
  }

  return success;
}

我什至不知道用户是否真的意识到异常(即得到一些错误反馈)或者结果只是插件菜单项没有被添加到电子表格中,但我想显示带有 SpreadsheetApp.getUi().alert(msg); 的消息。 也许这也会失败。但这是处理问题的尝试。

这是处理这种情况的好方法吗? onOpen() 时可以睡觉吗?

更新:

我在 Goolge 的问题跟踪器 here

中报告了一个错误

不确定这将如何以及是否会真正解决这个问题,只有时间会证明一切。

Google recommends 使用 sleep 处理上述建议的情况,然后重试。