Google表单提交邮件通知脚本故障排查求助
解决Google表单提交触发脚本时
e.values未定义的问题 我之前也踩过类似的坑,你的问题核心是表单提交触发器没有正确传递事件对象e,导致脚本运行时找不到e.values。咱们一步步来排查解决:
1. 先检查触发器的绑定配置
首先得确认你的触发器是不是真的和onFormSubmit函数绑定对了,触发类型也没选错:
- 打开关联的Google表格,点
扩展程序 > Apps 脚本进编辑器 - 点左侧的闹钟图标(触发器面板)
- 仔细核对现有触发器:
- 事件源必须是表单提交(别选成电子表格的“编辑”或其他)
- 事件类型必须是来自表单的提交
- 目标函数必须是
onFormSubmit(注意大小写完全匹配,差一个字母都不行)
很多时候手动建触发器会不小心选成电子表格的事件,这种情况下根本不会传递表单的e对象,自然会报错。
2. 换更稳定的取值方式(可选但推荐)
你现在用e.values[1]和e.values[2]是按字段顺序取值,但如果以后调整表单字段顺序,脚本就会出错。可以换成e.namedValues按字段名取值,更靠谱:
function onFormSubmit(e){ // 把这里的字段名换成你表单里实际的“姓名”和“校园邮箱编号”字段名称 var name = e.namedValues["姓名"][0]; var mailbox = e.namedValues["校园邮箱编号"][0]; var subject = "New Cold Pack Order"; var message = "New Cold Pack Order received for " + name + " to be delivered to Mailbox number " + mailbox; MailApp.sendEmail("myemail@gmail.com", subject, message); }
namedValues返回的是数组(因为同一个字段可能有多选情况),所以要加[0]取第一个值。
3. 加日志排查触发器是否传了e对象
如果触发器配置看起来没问题,就加个日志看看事件对象到底有没有传过来:
function onFormSubmit(e){ // 先把事件对象打出来,方便排查 Logger.log("收到的事件对象:" + JSON.stringify(e)); // 加个判断,避免直接报错 if (!e || !e.values) { Logger.log("警告:没收到表单提交的事件对象,检查触发器!"); return; } var name = e.values[1]; var mailbox = e.values[2]; var subject = "New Cold Pack Order"; var message = "New Cold Pack Order received for " + name + " to be delivered to Mailbox number " + mailbox; MailApp.sendEmail("myemail@gmail.com", subject, message); }
提交一次表单后,在脚本编辑器里点查看 > 日志,看看有没有打印出事件对象。如果日志里显示“警告:没收到表单提交的事件对象”,那就直接删了现有触发器重新建:
- 删除旧触发器,点
添加触发器 - 选函数
onFormSubmit,事件源选表单提交,事件类型选来自表单的提交,保存时会要求授权,一定要给全权限(工作区账号可能需要管理员同意)
4. 确认授权没出问题
第一次运行脚本或者建触发器时,必须授权脚本访问你的邮箱和表单数据。如果授权被拒绝或者不完整,脚本也跑不起来:
- 手动跑一次
onFormSubmit(这时候会报错,因为手动跑没有e对象,但没关系,主要是触发授权流程) - 跟着提示选你的账号,允许脚本访问邮件发送和表单数据的权限
5. 为啥硬编码能运行但触发器不行?
你硬编码测试时,是直接在编辑器里运行,这时候你应该是把name和mailbox写成固定值了,不需要e对象,所以能正常发邮件。但触发器运行时,脚本依赖e传递表单数据,一旦触发器没传e,就会报Cannot read property "values" from undefined的错。
按上面的步骤来,基本上就能解决问题啦!
内容的提问来源于stack exchange,提问作者Spaceman
相关产品推荐
相关产品推荐

