Google 从市场安装时,表格插件无法添加其菜单项
Google Sheets add-on fails to add its menu items when installed from market
我正在尝试将 Google 表格编辑器插件发布到市场。
它被拒绝列出,因为插件菜单项没有被添加到表格插件菜单中。这是我从审查小组那里得到的图片:
正在 onOpen()
触发器函数中添加菜单项,在开发环境中它工作正常。
第一次发布被拒绝,因为我不知道 onOpen
ScriptApp.AuthMode 限制以及实施 onInstall()
只是为了调用 onOpen()
的必要性,如所述here.
实施onInstall()
并重新提交后,再次被拒绝,因为它仍然无法正常工作。 GCP 错误控制台显示 onOpen() 是 运行 作为触发器,而不是因为它是由 onInstall()
调用的,看起来根本没有被触发。
密码是:
function onInstall(e) {
onOpen(e);
console.log("FA onInstall...");
}
function onOpen(){
console.log("FA onOpen...");
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: 'Trace precedents', functionName: 'tracePrecedents'},
{name: 'Trace dependents', functionName: 'traceDependents'}
];
spreadsheet.addMenu (AppName, menuItems);
}
我可以看到我 onOpen()
是在没有参数的情况下定义的,它没有特殊原因 - 只是不注意。我想这不是问题所在。
在云控制台中,onInstall()
似乎没有被触发。您只能在执行日志中看到 onOpen()
,并且在云错误中您可以看到 onOpen()
权限问题,如果未调用 onInstall()
,这是有道理的。
下图显示了涉及 google 审核团队操作的云执行、日志记录和错误条目。我实际上假设,但不能 100% 确定,图像中的这些日志条目实际上是指 Google 团队审核操作。我只是按时间过滤了日志条目,根据我从审查小组收到的拒绝邮件时间,加上当时我什么都没做(所以那个时候没有出现“属于我”的条目,所以它也有帮助。
以下是"Exception: You do not have permission"过滤后对应的错误日志条目JSON格式
{
"insertId": "-vw46i0f1p6gav",
"jsonPayload": {
"message": "Exception: You do not have permission to perform that action.\n at addMenu(src/macros:27:36)\n at onOpen(src/macros:16:3)",
"context": {
"reportLocation": {
"lineNumber": 27,
"functionName": "addMenu",
"filePath": "src/macros"
}
},
"serviceContext": {
"service": "AKfycbx5HHHMsaYBlD39Pf3UmyM0JhkFUWIpxU0Iw3Jp-XYCBw"
}
},
"resource": {
"type": "app_script_function",
"labels": {
"invocation_type": "simple trigger",
"function_name": "onOpen",
"project_id": "gothic-space-325413"
}
},
"timestamp": "2021-11-24T20:49:50.684Z",
"severity": "ERROR",
"labels": {
"script.googleapis.com/deployment_id": "AKfycbx5HHHMsaYBlD39Pf3UmyM0JhkFUWIpxU0Iw3Jp-XYCBw",
"script.googleapis.com/process_id": "EAEA1GOytih2wJPcuJNmCqsYzsqHKmik2d0KexhRdxq9Bi-T9frqnuGYZ_0XT1d0rvTIF6w5AWR5km2z2arNDWNHrShY88Z1ZvRKKib5hX46-e1oqdrpz0T7Fxc7xNnOrWXglwuTsdOQp0CbTO-4KgutgMRotiOjwArel5QOYPKYkhD8Jb-oJ6mYPa__KPLAug-Li3IzIbR_g5y9YffLMHhY-Chd_SlfcaxuB607i30zSFjBdmtYnQreN5KXKUzfXJ60SHHNtLPZZVeaozQDB6roqP82bgzZliyU7X12Y",
"script.googleapis.com/project_key": "MVmLkhkHw02MpGp6YjTYdgIJQT15o7EEE",
"script.googleapis.com/user_key": "APrZfepJTnqDE2xPOOZyy7vfu7vWpovS3THrJ8F1CIHw5sc/710lPeQ940fg7V6II4bRKBAqBvr2"
},
"logName": "projects/gothic-space-325413/logs/script.googleapis.com%2Fconsole_logs",
"receiveTimestamp": "2021-11-24T20:49:51.726293367Z"
}
问题:
根据云错误和日志记录,假设 onInstall()
不是 运行 是正确的吗?如果是 - 可能是什么原因?
我想也许,这是审核小组所做的事情,或者可能没有做的事情。例如:
他们第一次安装插件,所以它被添加到主菜单(即 Formula Analyzer),但是由于缺少 onInstall()
而缺少子项。第二次审查他们只是再次打开文档,所以 Formula Analyzer 仍然存在,但是 onOpen
失败(再次),因为他们没有重新安装插件。只是一个假设 - 我当然不知道这是否是一个有效的场景,或者他们实际上在做什么..
也许更重要的是,这是我之前考虑的场景,如何在开发环境中测试模拟市场安装,而无需添加。如何测试 onInstall 触发器?我还是找不到路。
这就是为什么在第一次拒绝和修复之后,我再次发布以供审查,而没有实际测试它。我试着询问审查小组是否可能以及如何,但他们忽略了。我们又来了。
如何解决?
问题:
如果加载项未为当前文档启用并且刚刚安装,onOpen
触发器无权访问该文档。
解释:
在文档中首次使用加载项之前,该文档未启用该加载项。在这些情况下,简单的 onOpen
无法访问该文档,并且与该文档相关的方法(如 SpreadsheetApp.getActive() or Spreadsheet.addMenu)会相应地失败。
由于可以在不调用 onOpen
的情况下安装附加组件,当您稍后调用 onOpen
时,它可能不会 运行 与 AuthMode.FULL
(授权模式onInstall
).
因此,应该设计一个附加组件,使 onOpen
触发器可以 运行 和 AuthMode.NONE
(即,在为用户,但未为文档启用),审核团队在没有 onInstall
的情况下尝试执行此操作是正确的。因此,访问当前文档的方法不应在该函数中使用。
这就是为什么使用像 Spreadsheet.addMenu are not used in the documentation code snippets for editor add-ons, and Ui.createAddonMenu() 这样的方法的原因,因为该方法不访问文档,因此可以在 onOpen
中使用。
代码示例:
function onOpen() {
var menu = SpreadsheetApp.getUi().createAddonMenu();
menu.addItem('Trace precedents', 'tracePrecedents');
menu.addItem('Trace dependents', 'traceDependents');
menu.addToUi();
}
注:
您会注意到此方法不允许您为菜单命名。这是因为,由于这是为加载项设计的,因此菜单名称将与加载项名称相匹配。
进一步阅读:
我正在尝试将 Google 表格编辑器插件发布到市场。
它被拒绝列出,因为插件菜单项没有被添加到表格插件菜单中。这是我从审查小组那里得到的图片:
正在 onOpen()
触发器函数中添加菜单项,在开发环境中它工作正常。
第一次发布被拒绝,因为我不知道 onOpen
ScriptApp.AuthMode 限制以及实施 onInstall()
只是为了调用 onOpen()
的必要性,如所述here.
实施onInstall()
并重新提交后,再次被拒绝,因为它仍然无法正常工作。 GCP 错误控制台显示 onOpen() 是 运行 作为触发器,而不是因为它是由 onInstall()
调用的,看起来根本没有被触发。
密码是:
function onInstall(e) {
onOpen(e);
console.log("FA onInstall...");
}
function onOpen(){
console.log("FA onOpen...");
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: 'Trace precedents', functionName: 'tracePrecedents'},
{name: 'Trace dependents', functionName: 'traceDependents'}
];
spreadsheet.addMenu (AppName, menuItems);
}
我可以看到我 onOpen()
是在没有参数的情况下定义的,它没有特殊原因 - 只是不注意。我想这不是问题所在。
在云控制台中,onInstall()
似乎没有被触发。您只能在执行日志中看到 onOpen()
,并且在云错误中您可以看到 onOpen()
权限问题,如果未调用 onInstall()
,这是有道理的。
下图显示了涉及 google 审核团队操作的云执行、日志记录和错误条目。我实际上假设,但不能 100% 确定,图像中的这些日志条目实际上是指 Google 团队审核操作。我只是按时间过滤了日志条目,根据我从审查小组收到的拒绝邮件时间,加上当时我什么都没做(所以那个时候没有出现“属于我”的条目,所以它也有帮助。
以下是"Exception: You do not have permission"过滤后对应的错误日志条目JSON格式
{ "insertId": "-vw46i0f1p6gav", "jsonPayload": { "message": "Exception: You do not have permission to perform that action.\n at addMenu(src/macros:27:36)\n at onOpen(src/macros:16:3)", "context": { "reportLocation": { "lineNumber": 27, "functionName": "addMenu", "filePath": "src/macros" } }, "serviceContext": { "service": "AKfycbx5HHHMsaYBlD39Pf3UmyM0JhkFUWIpxU0Iw3Jp-XYCBw" } }, "resource": { "type": "app_script_function", "labels": { "invocation_type": "simple trigger", "function_name": "onOpen", "project_id": "gothic-space-325413" } }, "timestamp": "2021-11-24T20:49:50.684Z", "severity": "ERROR", "labels": { "script.googleapis.com/deployment_id": "AKfycbx5HHHMsaYBlD39Pf3UmyM0JhkFUWIpxU0Iw3Jp-XYCBw", "script.googleapis.com/process_id": "EAEA1GOytih2wJPcuJNmCqsYzsqHKmik2d0KexhRdxq9Bi-T9frqnuGYZ_0XT1d0rvTIF6w5AWR5km2z2arNDWNHrShY88Z1ZvRKKib5hX46-e1oqdrpz0T7Fxc7xNnOrWXglwuTsdOQp0CbTO-4KgutgMRotiOjwArel5QOYPKYkhD8Jb-oJ6mYPa__KPLAug-Li3IzIbR_g5y9YffLMHhY-Chd_SlfcaxuB607i30zSFjBdmtYnQreN5KXKUzfXJ60SHHNtLPZZVeaozQDB6roqP82bgzZliyU7X12Y", "script.googleapis.com/project_key": "MVmLkhkHw02MpGp6YjTYdgIJQT15o7EEE", "script.googleapis.com/user_key": "APrZfepJTnqDE2xPOOZyy7vfu7vWpovS3THrJ8F1CIHw5sc/710lPeQ940fg7V6II4bRKBAqBvr2" }, "logName": "projects/gothic-space-325413/logs/script.googleapis.com%2Fconsole_logs", "receiveTimestamp": "2021-11-24T20:49:51.726293367Z" }
问题:
根据云错误和日志记录,假设
onInstall()
不是 运行 是正确的吗?如果是 - 可能是什么原因?我想也许,这是审核小组所做的事情,或者可能没有做的事情。例如: 他们第一次安装插件,所以它被添加到主菜单(即 Formula Analyzer),但是由于缺少
onInstall()
而缺少子项。第二次审查他们只是再次打开文档,所以 Formula Analyzer 仍然存在,但是onOpen
失败(再次),因为他们没有重新安装插件。只是一个假设 - 我当然不知道这是否是一个有效的场景,或者他们实际上在做什么..也许更重要的是,这是我之前考虑的场景,如何在开发环境中测试模拟市场安装,而无需添加。如何测试 onInstall 触发器?我还是找不到路。 这就是为什么在第一次拒绝和修复之后,我再次发布以供审查,而没有实际测试它。我试着询问审查小组是否可能以及如何,但他们忽略了。我们又来了。
如何解决?
问题:
如果加载项未为当前文档启用并且刚刚安装,onOpen
触发器无权访问该文档。
解释:
在文档中首次使用加载项之前,该文档未启用该加载项。在这些情况下,简单的 onOpen
无法访问该文档,并且与该文档相关的方法(如 SpreadsheetApp.getActive() or Spreadsheet.addMenu)会相应地失败。
由于可以在不调用 onOpen
的情况下安装附加组件,当您稍后调用 onOpen
时,它可能不会 运行 与 AuthMode.FULL
(授权模式onInstall
).
因此,应该设计一个附加组件,使 onOpen
触发器可以 运行 和 AuthMode.NONE
(即,在为用户,但未为文档启用),审核团队在没有 onInstall
的情况下尝试执行此操作是正确的。因此,访问当前文档的方法不应在该函数中使用。
这就是为什么使用像 Spreadsheet.addMenu are not used in the documentation code snippets for editor add-ons, and Ui.createAddonMenu() 这样的方法的原因,因为该方法不访问文档,因此可以在 onOpen
中使用。
代码示例:
function onOpen() {
var menu = SpreadsheetApp.getUi().createAddonMenu();
menu.addItem('Trace precedents', 'tracePrecedents');
menu.addItem('Trace dependents', 'traceDependents');
menu.addToUi();
}
注:
您会注意到此方法不允许您为菜单命名。这是因为,由于这是为加载项设计的,因此菜单名称将与加载项名称相匹配。