表单提交触发脚本报错:TypeError: Cannot read properties of undefined (reading '0')
问题分析与解决方案
错误原因
你遇到的TypeError: Cannot read properties of undefined (reading '0'),本质是代码中尝试读取e.values[0]时,e.values为undefined——说明表单提交的事件对象e没有被正确传入到函数中。
具体修复方案
1. 禁止手动直接运行onFormSubmit函数
直接在脚本编辑器点击运行onFormSubmit时,系统不会自动生成表单提交的事件对象e,此时e为undefined必然报错。
- 正确测试方式:构造模拟事件对象进行调试,代码示例:
运行这个function testOnFormSubmit() { // 模拟表单提交的事件对象,字段值对应你的表单结构 var mockEvent = { values: ["2023-12-22 02:35:35", "测试用户", "测试歌曲", "测试祝福语"] }; onFormSubmit(mockEvent); }testOnFormSubmit函数即可完成调试,正式触发必须通过实际提交表单。
2. 检查触发器配置是否正确
确认脚本已绑定正确的表单提交触发器:
- 打开脚本编辑器,点击左侧闹钟形状的「触发器」图标
- 检查是否存在一条类型为「表单提交」、关联函数为
onFormSubmit的触发器 - 若没有则点击「添加触发器」,按以下配置设置:
- 选择函数:
onFormSubmit - 事件源:来自表单
- 事件类型:表单提交
- 保存配置
- 选择函数:
3. 改用更稳定的namedValues获取字段值
e.values依赖表单字段的顺序,一旦表单调整字段顺序就会出错,建议改用e.namedValues按字段名取值,代码修改如下:
function onFormSubmit(e) { Logger.log("Event Object: " + JSON.stringify(e)); // 替换为你表单中实际的字段名称(完全匹配大小写、空格) var timestamp = e.namedValues["时间戳"][0]; var name = e.namedValues["姓名"][0]; var songRequest = e.namedValues["点歌"][0]; var dedication = e.namedValues["祝福语"][0]; var message = "New song request and dedication:\n\n"; message += "Timestamp: " + timestamp + "\n"; message += "Name: " + name + "\n"; message += "Song Request: " + songRequest + "\n"; message += "Dedication: " + dedication + "\n"; sendEmail("coolvibes1989@gmail.com", "New Song Request", message); sendEmail("kay2043838@gmail.com", "New Song Request", message); sendEmail("Shortdale4@gmail.com", "New Song Request", message); }
注:namedValues返回的是数组(支持多值字段),所以需要用[0]取第一个值。
4. 确认sendEmail函数存在
你的代码中调用了sendEmail但未提供实现,若这是自定义函数,需补充以下代码:
function sendEmail(to, subject, body) { MailApp.sendEmail(to, subject, body); }
内容的提问来源于stack exchange,提问作者Jay George
相关产品推荐
相关产品推荐

