表单提交后无法调用FormApp.getUi实现URL打开(Google App Script)
解决表单提交后无法访问FormApp.getUi的问题
我看你用Serge insas的代码改了个弹窗打开URL的功能,但在表单提交后调用modalUrl()时碰到了访问FormApp.getUi()的错误,这问题我之前也踩过坑,给你捋捋原因和解决办法:
为什么会报错?
FormApp.getUi()这个方法只能在用户主动触发的交互场景里使用——比如手动点击自定义菜单、在脚本编辑器里运行函数,或是通过侧边栏/对话框触发。但表单提交的触发器是在服务器端异步运行的,完全没有和用户交互的UI上下文,调用它自然会报错。
怎么解决?
根据你的需求,给你两个实用方案:
方案1:用Google表单自带的跳转(最简单)
如果你的需求就是用户提交表单后自动打开指定URL,根本不用写脚本:
- 打开你的Google表单,点击右上角的「设置」图标
- 切换到「演示」标签页
- 在「提交后」下拉框选择「转到链接」,输入目标URL即可,用户提交后会直接跳转过去。
方案2:用脚本发送带链接的邮件(适合动态场景)
如果必须用脚本(比如要根据提交内容生成不同的URL),可以改成提交后给用户发邮件,把链接放在邮件里:
修改你的Code.gs代码为:
function onFormSubmit(e) { // 先获取提交用户的邮箱(需在表单设置里开启「收集电子邮件地址」) var respondentEmail = e.response.getRespondentEmail(); if (respondentEmail) { var targetUrl = 'https://stackoverflow.com/a/54675103'; MailApp.sendEmail({ to: respondentEmail, subject: '表单提交完成通知', body: '感谢你的提交!请点击以下链接继续操作:\n' + targetUrl, htmlBody: '感谢你的提交!请点击<a href="' + targetUrl + '" target="_blank">这里</a>继续操作!' }); } }
然后设置触发器:
- 打开脚本编辑器,点击左侧的「触发器」图标
- 点击「添加触发器」,函数选择
onFormSubmit,事件源选「表单」,事件类型选「当表单提交时」,保存即可。
补充说明
你原来的modalUrl()函数本身是没问题的,但只能在手动触发时使用(比如在脚本编辑器里运行,或是给表单绑定自定义菜单),绝对不能放在表单提交触发器里调用——因为触发器运行时根本没有可调用的UI环境。
内容的提问来源于stack exchange,提问作者New_2_Code
相关产品推荐
相关产品推荐

