You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Workspace插件如何实现点菜单动态展示登录后专属选项

实现方案

静态写在manifest里的universalActions确实不支持部署后直接修改,你可以通过动态更新会话级全局菜单的方式实现登录后显示登出/设置选项,步骤如下:

步骤1:manifest里仅保留未登录状态的静态菜单项

把需要动态展示的「设置」「登出」从manifest的universalActions里移除,示例初始配置仅保留登录相关入口:

"universalActions": [{
  "label": "登录",
  "runFunction": "handleLogin"
}],
"oauthScopes": [
  "https://www.googleapis.com/auth/script.locale",
  "https://www.googleapis.com/auth/userinfo.email"
]

步骤2:登录成功后动态重写全局菜单

在登录校验通过的回调函数里,用CardService提供的setUniversalActions方法更新当前用户会话的全局菜单:

function handleLogin() {
  // 此处替换为你自己的登录校验逻辑,校验通过后执行下方代码
  const loggedInActions = [
    CardService.newUniversalAction()
      .setLabel("设置")
      .setOpenLink(CardService.newOpenLink().setUrl("https://myapp.com/settings")),
    CardService.newUniversalAction()
      .setLabel("Sign Out")
      .setOpenLink(CardService.newOpenLink().setUrl("https://myapp.com/logout"))
  ];
  return CardService.newActionResponseBuilder()
    .setUniversalActions(loggedInActions)
    .build();
}

步骤3:登出后重置菜单为初始状态

在登出逻辑的回调函数里,清理用户会话后把全局菜单重置回未登录状态即可:

function handleLogout() {
  // 此处替换为你自己的登出逻辑,清理会话信息后执行下方代码
  const loggedOutActions = [
    CardService.newUniversalAction()
      .setLabel("登录")
      .setRunFunction("handleLogin")
  ];
  return CardService.newActionResponseBuilder()
    .setUniversalActions(loggedOutActions)
    .build();
}

注意事项

  • 动态设置的universalActions仅对当前用户的当前会话生效,用户刷新插件或者重启Workspace应用后,会恢复为manifest里定义的默认配置。因此你需要在每次插件初始化(比如onHomepage回调)时先判断用户登录状态,如果已经登录就主动调用一次setUniversalActions重写菜单,避免刷新后菜单恢复默认。
  • 所有动态菜单绑定的执行函数都需要在manifest的allowedRuntimeFunction列表里声明,否则会触发权限报错。

内容的提问来源于stack exchange,提问作者CK_One

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:57:00