Google Apps 脚本 - 根据属性服务中的用户设置添加不同的菜单项?
Google Apps Script - Add different menu item based on user settings in Properties service?
我正在开发一个需要两件事的表单插件:
用户第一次打开插件时,他会看到"Get Started"菜单项,之后他将配置一些设置以使用插件
之后,在他第二次打开插件菜单时,他会看到其他菜单项,例如"Feature 1"、"Feature 2"、……他赢了看不到 "Get Started" 菜单项了,因为他已经配置了设置
我认为它与onOpen
功能有关。这是我尝试过的:
const onOpen = () => {
try {
const userProperties = PropertiesService.getUserProperties()
let isFinishedSetup = userProperties.getProperty('IS_FINISHED_SETUP')
if (isFinishedSetup === '1') {
FormApp.getUi()
.createAddonMenu()
.addItem('Feature One', 'featureOne')
.addItem('Feature Two', 'featureTwo')
.addToUi()
} else {
FormApp.getUi()
.createAddonMenu()
.addItem('Get Started', 'showGetStarted')
.addToUi()
}
} catch (err) {
FormApp.getUi()
.createAddonMenu()
.addItem('Get Started', 'showGetStarted')
.addToUi()
}
}
基本上,我尝试从 PropertiesService 获取 IS_FINISHED_SETUP 属性,检查它是否为真。
万一不能getUserProperties(),我在catch
语句中处理
但是这行不通,插件菜单按钮不显示。
在控制台中,我看到错误 you don't have the permission to call getUserProperties
或类似的错误。
我搜索了Google,发现原因是:onOpen函数不能使用需要作用域的服务
但需要在菜单显示后才能授权
那么我该如何处理这种情况呢?我想要根据用户是否完成设置而使用不同的菜单。
答案就在这个linkhttps://developers.google.com/gsuite/add-ons/concepts/editor-auth-lifecycle#the_complete_lifecycle
感谢@TheMaster
const onOpen = (e) => {
const menu = FormApp.getUi().createAddonMenu()
if (e && e.authMode === ScriptApp.AuthMode.NONE) {
// Add Get Started menu item (works in all authorization modes).
menu.addItem('Get Started', 'showGetStarted')
} else {
// Add a menu item based on properties (doesn't work in AuthMode.NONE).
const documentProperties = PropertiesService.getDocumentProperties()
const isFinishedSetup = documentProperties.getProperty('isFinishedSetup')
if (isFinishedSetup === '1') {
menu.addItem('Feature One', 'featureOne')
menu.addItem('Feature Two', 'featureTwo')
} else {
menu.addItem('Get Started', 'showGetStarted')
}
}
menu.addToUi()
}
当您尝试使用 "Test as add-on":
进行测试时,请注意此处
测试时必须手动选择AuthMode
为add-on。
如果您选择 AuthMode.NONE
,它将 不显示 Get Started
菜单项以外的任何内容。
您需要选择AuthMode.LIMITED
我正在开发一个需要两件事的表单插件:
用户第一次打开插件时,他会看到"Get Started"菜单项,之后他将配置一些设置以使用插件
之后,在他第二次打开插件菜单时,他会看到其他菜单项,例如"Feature 1"、"Feature 2"、……他赢了看不到 "Get Started" 菜单项了,因为他已经配置了设置
我认为它与onOpen
功能有关。这是我尝试过的:
const onOpen = () => {
try {
const userProperties = PropertiesService.getUserProperties()
let isFinishedSetup = userProperties.getProperty('IS_FINISHED_SETUP')
if (isFinishedSetup === '1') {
FormApp.getUi()
.createAddonMenu()
.addItem('Feature One', 'featureOne')
.addItem('Feature Two', 'featureTwo')
.addToUi()
} else {
FormApp.getUi()
.createAddonMenu()
.addItem('Get Started', 'showGetStarted')
.addToUi()
}
} catch (err) {
FormApp.getUi()
.createAddonMenu()
.addItem('Get Started', 'showGetStarted')
.addToUi()
}
}
基本上,我尝试从 PropertiesService 获取 IS_FINISHED_SETUP 属性,检查它是否为真。
万一不能getUserProperties(),我在catch
语句中处理
但是这行不通,插件菜单按钮不显示。
在控制台中,我看到错误 you don't have the permission to call getUserProperties
或类似的错误。
我搜索了Google,发现原因是:onOpen函数不能使用需要作用域的服务
但需要在菜单显示后才能授权
那么我该如何处理这种情况呢?我想要根据用户是否完成设置而使用不同的菜单。
答案就在这个linkhttps://developers.google.com/gsuite/add-ons/concepts/editor-auth-lifecycle#the_complete_lifecycle
感谢@TheMaster
const onOpen = (e) => {
const menu = FormApp.getUi().createAddonMenu()
if (e && e.authMode === ScriptApp.AuthMode.NONE) {
// Add Get Started menu item (works in all authorization modes).
menu.addItem('Get Started', 'showGetStarted')
} else {
// Add a menu item based on properties (doesn't work in AuthMode.NONE).
const documentProperties = PropertiesService.getDocumentProperties()
const isFinishedSetup = documentProperties.getProperty('isFinishedSetup')
if (isFinishedSetup === '1') {
menu.addItem('Feature One', 'featureOne')
menu.addItem('Feature Two', 'featureTwo')
} else {
menu.addItem('Get Started', 'showGetStarted')
}
}
menu.addToUi()
}
当您尝试使用 "Test as add-on":
进行测试时,请注意此处测试时必须手动选择AuthMode
为add-on。
如果您选择 AuthMode.NONE
,它将 不显示 Get Started
菜单项以外的任何内容。
您需要选择AuthMode.LIMITED