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

Google Apps Script从模板HTML调用方法时Session.getActiveUser返回错误邮箱

问题原因

这是Google账号多登录场景下的已知特性:

  • 容器绑定脚本的onOpen、自定义菜单触发的函数执行上下文,会自动对齐当前Google Slides页面对应的登录账号,因此Session.getActiveUser()可以拿到正确的活跃账号
  • 侧边栏加载后调用google.script.run时,请求默认会使用浏览器第一个登录的账号(即默认账号)的身份凭据发起,不会自动对齐当前Slides页面使用的次账号,因此会出现获取到的用户和实际活跃账号不一致的情况

可行解决方案

方案1:模板预注入活跃用户信息(最推荐,改造成本最低)

在渲染HTML模板的服务端逻辑中,直接把当前上下文拿到的正确活跃用户信息注入模板,后续前端交互直接使用注入的信息即可,不需要再调用Session.getActiveUser()。

修改服务端showSidebar逻辑:

const showSidebar = () => {
  const template = HtmlService.createTemplateFromFile('gra-main-v3');
  template.include = include;
  // 预注入当前正确的活跃用户邮箱
  template.activeUserEmail = Session.getActiveUser().getEmail();
  const html = template.evaluate().setTitle('New Sidebar');
  SlidesApp.getUi().showSidebar(html);
};

修改HTML侧逻辑:

如果只是前端需要用到邮箱,直接用模板变量即可;如果需要传给后端接口,作为参数传递即可:

<HTML>
...
<script>
    // 模板渲染时已经注入了正确的活跃邮箱,直接使用
    const activeUser = '<?= activeUserEmail ?>';
    // 调用后端接口时把邮箱作为参数传递
    google.script.run.customFunction(activeUser);
</script>
..
</HTML>

调整后端customFunction接收参数:

const customFunction = (userEmail) => {
  // 可选校验:防止前端伪造邮箱,因为executeAs配置为USER_ACCESSING,有效用户和实际访问用户一致
  if(userEmail !== Session.getEffectiveUser().getEmail()) {
    throw new Error('用户身份校验失败');
  }
  Logger.log(userEmail); // 这里拿到的就是正确的活跃账号邮箱
  Logger.log(Session.getEffectiveUser().getEmail());
  ..
}

方案2:单账号隔离访问

如果是个人使用场景,也可以直接给不同的Google账号配置不同的浏览器配置文件,避免同一浏览器同时登录多个账号,从根源上避免身份冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:00:04