Google Apps Script库调用时服务端对象传递至客户端丢失问题
问题根源与解决方案
这个问题的核心在于客户端项目的代理函数没有返回库函数的结果,再加上两种菜单触发的侧边栏运行上下文不同,导致了差异:
为什么会出现两种不同的结果?
- 当你通过自定义菜单(
Sidebar > Open)打开侧边栏时,实际执行的是客户端项目中的showSidebar()函数,它调用库的showSidebar()生成侧边栏。但此时侧边栏的HTML运行在客户端项目的上下文中,google.script.run.getEmail()会调用客户端项目里的getEmail()函数,而不是库中的。 - 你写的客户端
getEmail()函数只是调用了aLib.getEmail(),但没有返回它的结果——所以函数默认返回undefined,这就是你看到的现象。 - 而通过附加组件菜单(
Add-ons > My Project > Open)打开侧边栏时,是直接在库的上下文运行showSidebar(),侧边栏的google.script.run.getEmail()调用的是库自身的getEmail()函数,自然能正常返回结果。
修复步骤
只需要修改客户端项目中的代理函数,确保返回库函数的执行结果即可:
// 客户端项目的代码 function onOpen(e) { aLib.onOpen(e); } function showSidebar(){ aLib.showSidebar(); } // 关键:添加return语句,传递库函数的返回值 function getEmail(){ return aLib.getEmail(); } // 其他函数同理 function getCellValue(){ return aLib.getCellValue(); } function getGreeting(){ return aLib.getGreeting(); }
验证逻辑
修改后,当你点击自定义菜单打开的侧边栏按钮时:
google.script.run调用客户端项目的getEmail()- 客户端函数调用库的
aLib.getEmail()并返回其结果 - 成功回调
updateButton就能拿到正确的邮箱地址(或其他函数的返回值)
另外要注意:如果库中的函数需要特定授权(比如Session.getActiveUser()),确保客户端项目也已经获得了相应的授权——在测试附加组件模式下,首次运行时可能需要授权弹窗,确认授权即可。
内容的提问来源于stack exchange,提问作者Wicket
相关产品推荐
相关产品推荐

