GAS插件在Auth Mode NONE模式下菜单不显示报错问题求助
故障根因
1. 授权判断逻辑顺序错误
AuthMode.NONE(已安装未启用)模式下,SpreadsheetApp.getUi()属于需要授权才能调用的受限API。你当前的代码将SpreadsheetApp.getUi().createAddonMenu()放在了授权模式判断的最前面,程序还没走到authMode校验逻辑就先触发了权限校验,直接抛出无权限错误。
2. 编辑器测试环境限制
Apps Script编辑器的直接运行环境不存在表格UI上下文,只要在编辑器内直接运行调用了SpreadsheetApp.getUi()的函数,都会触发「无法从该上下文调用SpreadsheetApp.getUi()」报错,这是环境特性导致的正常现象,不属于代码故障。
修复方案
调整onOpen函数的逻辑顺序,先做授权模式校验,再根据场景调用UI相关接口,同时兼容编辑器直接运行的场景避免报错:
function onInstall(e) { onOpen(e); } function onOpen(e) { // 适配编辑器直接运行场景,无事件参数直接返回避免报错 if (!e) return; if (e.authMode === ScriptApp.AuthMode.NONE) { // 已安装未授权场景,仅加载最小启用菜单 SpreadsheetApp.getUi() .createAddonMenu() .addItem('Enable Khan2Canvas','mainMenu') .addToUi(); } else { // 已授权场景加载完整菜单 mainMenu(); } } // 原mainMenu函数无需修改 function mainMenu() { var ui = SpreadsheetApp.getUi(); ui.createAddonMenu() .addItem('Import Data', 'importDataMenu') .addSubMenu(ui.createMenu('Send Scores') .addItem('Send All Assignments', 'sendAllMenu') .addItem('Send Selected Assignments', 'sendSelectedMenu') .addItem('Clear Selections', 'resetSelectedMenu')) .addSeparator() .addSubMenu(ui.createMenu('Setup') .addItem("Launch Setup", "launchSetupMenu") .addItem("Update Sheet", "updateSheetMenu") .addItem("Install Triggers", 'installTriggersMenu') .addItem("Create Data Folder", "createDataFolderMenu") .addItem("Import Roster", "importRosterMenu") .addItem("Download Courses", "downloadCoursesMenu")) .addSubMenu(ui.createMenu('Reformat') .addItem("Scores", 'formatScoresMenu') .addItem("Settings", 'formatSettingsMenu') .addItem("DATA", 'formatDATAMenu') .addItem("All", 'formatAllMenu')) .addSubMenu(ui.createMenu('Rebuild') .addItem("Scores", 'rebuildScoresMenu') .addItem("Settings", 'rebuildSettingsMenu') .addItem("DATA", 'rebuildDATAMenu') .addItem("All", 'rebuildAllMenu')) .addSubMenu(ui.createMenu('Reset') .addItem("New Grading Term", 'newGradingTermMenu') .addItem("New Class", 'newClassMenu') //.addItem("New Academic Year",'newAcademicYearMenu') .addItem("All", 'resetAllMenu')) .addSubMenu(ui.createMenu('Info') .addItem("Documentation", 'documentationMenu') //.addItem("License", 'licenseModal') .addItem("Donate", 'donateMenu') .addItem("Contact", 'contactMenu') .addItem("About", 'aboutModal')) .addItem("Show/Hide Options", "showHideOptionsMenu") .addToUi(); }
测试注意事项
- 测试
onOpen逻辑不要直接在编辑器点击运行,必须在Google Sheets界面通过「扩展程序 > 对应插件 > 测试作为插件加载」的流程,在真实表格环境中测试 - 发布前需要分别选择「已安装未启用」「已启用」两种测试模式,验证两种场景下的菜单加载逻辑是否符合预期
内容的提问来源于stack exchange,提问作者Josh Bunzel
相关产品推荐
相关产品推荐

