我在理解 Google Sheet 插件的工作流程时遇到了一些困难。我在其中也绑定了脚本的工作表中使用它,并且它工作得很好。但是,当我创建新的电子表格时,我可以看到在
Add-ons
下创建的附加菜单,但看不到其子菜单。另外,如果我查看执行情况,我会得到:
Exception: You do not have permission to perform that action.
尝试执行 Spreadsheet.getUi()
创建菜单时。
我部署了一个新版本,并调整了 Marketplace SDK 中的设置以与部署的设置相匹配。另外,我在我的 google 项目和 Marketplace SDK 的 OAuth 同意屏幕中拥有匹配的所有脚本范围。
唯一有效的方法是进入
Add-ons > Manage add-ons
并点击 Use in this document
让我的附加菜单在新创建的电子表格中自动可用的正确工作流程是什么?
onOpen (e)
是一个简单的触发器,并且受到一系列限制,特别是
他们无法访问需要授权的服务。
在单击 “在本文档中使用” 之前,插件处于 已安装模式 并且事件对象
e.authMode
具有值 AuthMode.NONE
,因此您的触发器无法访问 Properties
服务。仅当您单击 “在本文档中使用” 后,触发器才会进入“启用模式”(e.authMode === AuthMode.LIMITED
),并且您可以访问 Properties
。
要解决此问题,您需要测试该附加组件是否已安装或启用,并显示一个菜单选项,允许用户在仅安装该附加组件时启用它。请参阅下面的示例:
function onOpen (e) {
var menu = SpreadsheetApp.getUi().createAddonMenu(); // Or DocumentApp.
if (e && e.authMode == ScriptApp.AuthMode.NONE) {
// Add a normal menu item (works in all authorization modes).
menu.addItem('Enable add-on', 'enableAddOn');
} else {
// Add a menu item based on properties (doesn't work in AuthMode.NONE).
var properties = PropertiesService.getDocumentProperties();
var workflowStarted = properties.getProperty('workflowStarted');
if (workflowStarted) {
menu.addItem('Check workflow status', 'checkWorkflow');
} else {
menu.addItem('Start workflow', 'startWorkflow');
}
}
menu.addToUi();
}
function enableAddOn () {
onOpen();
}
仅安装时,用户只能看到“启用附加组件”选项。通过单击它,该附加组件将被启用,因此该功能只需调用
onOpen()
并且 if..else
将加载正确的菜单选项。
请注意,您只需要此修复,因为您的简单触发器
onOpen (e)
正在使用Properties服务。如果删除它,则无需测试已安装/启用模式。