Google Sheets插件从市场安装后无法添加菜单项问题咨询
问题1解答
从现有日志没有任何onInstall()的执行记录,完全可以判定该触发器没有运行。你猜测的场景完全合理:谷歌审核团队的测试环境会保留上一次提交版本的安装记录,第二次审核时不会特意卸载旧版本再重新安装,仅会打开测试文档验证功能。旧版本安装时没有正确的onInstall()逻辑,后续打开文档触发的onOpen()运行在AuthMode.NONE权限模式下,没有权限调用addMenu接口,就会抛出你看到的权限错误。
问题2解答
要模拟应用市场安装场景测试onInstall(),可以用以下两种方法:
- 把脚本发布为未列出的测试版插件,设置测试人员为你自己的其他谷歌账号,用测试账号登录后在Google Sheets插件市场搜索测试版插件完成安装,此时触发的
onInstall()和正式市场安装的运行环境完全一致,测试完成后可以随时撤销测试版发布,不会影响正式提审流程。 - 不想发布测试版的话,可以在脚本编辑器的执行页面,手动构造
onInstall的事件对象参数,手动触发onInstall函数执行,验证函数逻辑是否能正常调用onOpen添加菜单。
问题3解答
你可以按以下步骤修复问题:
- 补全
onOpen的参数,同时在函数开头加入权限模式判断,兼容不同运行场景,参考修复后的代码:
// 先定义全局的AppName变量,确保变量存在才能正常调用addMenu const AppName = "Formula Analyzer"; function onInstall(e) { onOpen(e); console.log("FA onInstall..."); } function onOpen(e) { console.log("FA onOpen..."); // 权限模式判断,无权限时先添加引导授权的菜单 if (e && e.authMode === ScriptApp.AuthMode.NONE) { SpreadsheetApp.getActive().addMenu(AppName, [ {name: '启用插件', functionName: 'authorizeAndInit'} ]); return; } // 权限足够时加载完整功能菜单 var spreadsheet = SpreadsheetApp.getActive(); var menuItems = [ {name: 'Trace precedents', functionName: 'tracePrecedents'}, {name: 'Trace dependents', functionName: 'traceDependents'} ]; spreadsheet.addMenu(AppName, menuItems); } // 新增授权初始化函数,用户点击后触发授权,完成后重新加载完整菜单 function authorizeAndInit() { onOpen({authMode: ScriptApp.AuthMode.LIMITED}); }
- 提交审核时,在审核备注里明确要求审核人员先完全卸载旧版本插件,再重新安装新版本进行测试,避免旧版本缓存影响测试结果。
内容的提问来源于stack exchange,提问作者OJNSim
相关产品推荐
相关产品推荐

