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

