意外错误 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 错误,我正在考虑以下实现
- 用 try-catch ans extract 包装添加菜单以分离功能
_addmenus()
- 检查
_addmenus()
return 值。如果不成功睡觉再试一次
- 最大尝试次数 = 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
处理上述建议的情况,然后重试。
我有一个 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 错误,我正在考虑以下实现
- 用 try-catch ans extract 包装添加菜单以分离功能
_addmenus()
- 检查
_addmenus()
return 值。如果不成功睡觉再试一次 - 最大尝试次数 = 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
处理上述建议的情况,然后重试。