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" }

问题:

  1. 根据云错误和日志记录,假设 onInstall() 不是 运行 是正确的吗?如果是 - 可能是什么原因?

    我想也许,这是审核小组所做的事情,或者可能没有做的事情。例如: 他们第一次安装插件,所以它被添加到主菜单(即 Formula Analyzer),但是由于缺少 onInstall() 而缺少子项。第二次审查他们只是再次打开文档,所以 Formula Analyzer 仍然存在,但是 onOpen 失败(再次),因为他们没有重新安装插件。只是一个假设 - 我当然不知道这是否是一个有效的场景,或者他们实际上在做什么..

  2. 也许更重要的是,这是我之前考虑的场景,如何在开发环境中测试模拟市场安装,而无需添加。如何测试 onInstall 触发器?我还是找不到路。 这就是为什么在第一次拒绝和修复之后,我再次发布以供审查,而没有实际测试它。我试着询问审查小组是否可能以及如何,但他们忽略了。我们又来了。

  3. 如何解决?

问题:

如果加载项未为当前文档启用并且刚刚安装,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();
}

注:

您会注意到此方法不允许您为菜单命名。这是因为,由于这是为加载项设计的,因此菜单名称将与加载项名称相匹配。

进一步阅读: