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
相关产品推荐
相关产品推荐

