GAS表单提交触发sendEmail时报Cannot read property 'response' of undefined错误
问题排查与解决方案
错误根因
你遇到的两个报错存在直接关联:
sendEmail是绑定谷歌表单提交事件的回调函数,必须由表单提交动作触发运行,此时谷歌会自动传入包含提交全量信息的事件对象e。你直接在Apps Script编辑器点击「运行」按钮测试时,没有传入事件参数e,导致e为undefined,触发Cannot read property 'response' of undefined报错;同时e.response.getRespondentEmail()无法获取到有效收件人,触发无收件人退信。
分步修复操作
- 修正HTML模板渲染逻辑
当前代码中html.getCode()调用错误,该方法返回的是模板的原始代码字符串,而非渲染完成的可发送HTML正文。需替换为evaluate().getContent()完成模板渲染,修正后的代码片段如下:function sendEmail(e) { var html = HtmlService.createTemplateFromFile("email.html"); // 替换原getCode()调用为以下内容 var htmlText = html.evaluate().getContent(); var emailTo = e.response.getRespondentEmail(); var subject = "Thanks for participating"; var textBody = "This email requires HTML support, please make sure you open with a client that supports it."; var options = { htmlBody: htmlText }; if(emailTo !== undefined && emailTo !== ""){ GmailApp.sendEmail(emailTo,subject,textBody,options); } } - 确认表单已开启邮箱收集权限
打开绑定的谷歌表单,进入「设置」→「回复」分类,确认已勾选「收集邮箱地址」选项,否则getRespondentEmail()接口会返回空值,无法获取收件人。 - 配置正确的表单提交触发器
- 打开Apps Script编辑器,点击左侧菜单栏的「触发器」(闹钟样式图标)
- 点击右下角「添加触发器」按钮
- 选择要运行的函数为
sendEmail - 选择事件来源为「表单」
- 选择事件类型为「表单提交时」
- 保存触发器,按照页面提示完成权限授权
- 正确测试脚本
不要直接在编辑器内运行函数,打开谷歌表单,填写并提交一次测试数据,脚本会自动触发运行,此时事件对象e会由谷歌自动传入,不会再出现undefined错误。
内容的提问来源于stack exchange,提问作者UD.Cole
相关产品推荐
相关产品推荐

