Google Apps 脚本 - 根据属性服务中的用户设置添加不同的菜单项?

Google Apps Script - Add different menu item based on user settings in Properties service?

我正在开发一个需要两件事的表单插件:

我认为它与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