Google表单提交脚本报错:无事件对象或值,无法写入指定单元格
解决Google表单提交时Apps Script无法获取提交数据的问题
问题现状
你编写的脚本期望将Google表单提交的数据写入表格第61行F列起始位置,已创建「表单提交时」触发器,但实际提交后表格无数据写入。执行日志显示事件对象中不存在values属性:
Event object: {"authMode":"FULL","response":{},"source":{},"triggerUid":"229403691"}
No event object or values found.
但运行测试函数testOnFormSubmitRoofing时,模拟数据能正常写入指定位置,且尝试过重建触发器、更换表单/表格均无效。
问题原因
Google Apps Script中,表格绑定的「表单提交」触发器与表单绑定的「表单提交」触发器生成的事件对象结构不同:
- 测试函数模拟的是表格触发器的结构(直接包含
e.values字段) - 你实际创建的是表单触发器,其事件对象的提交数据存储在
e.response中,而非e.values,因此原脚本的判断逻辑直接返回,无法执行写入操作。
解决方案
修改脚本,从e.response中提取提交数据,替换原有的e.values相关逻辑:
修改后的完整脚本
function onFormSubmitRoofing(e) { Logger.log('Event object: ' + JSON.stringify(e)); // 检查事件对象及表单响应是否存在 if (!e || !e.response) { Logger.log("No event object or form response found."); return; } // 从表单响应中提取所有提交值 var itemResponses = e.response.getItemResponses(); var submittedValues = itemResponses.map(itemResp => itemResp.getResponse()); Logger.log('Form submitted: ' + JSON.stringify(submittedValues)); // 写入指定表格位置 var sheet = SpreadsheetApp.openById('1QpOZxLNWd21eYpcOk_gQfTE9aD0BRRlF7resFcOECec').getSheetByName('Sheet1'); var targetRow = 61; var startColumn = 6; sheet.getRange(targetRow, startColumn, 1, submittedValues.length).setValues([submittedValues]); Logger.log('Data written to sheet: ' + JSON.stringify(submittedValues)); } function testOnFormSubmitRoofing() { // 模拟表单触发器的事件对象结构 var mockResponse = { getItemResponses: () => [ { getResponse: () => "Test Name" } // 可根据表单字段数量添加更多模拟响应 ] }; var e = { response: mockResponse }; onFormSubmitRoofing(e); }
关键修改点
- 将判断条件从
!e || !e.values改为!e || !e.response,适配表单触发器的事件结构 - 通过
e.response.getItemResponses()获取所有表单问题的响应,再遍历提取每个问题的提交值 - 更新测试函数,模拟表单触发器的
e.response结构,确保测试逻辑与实际触发场景一致
额外说明
如果你的脚本是绑定在Google表格中,也可以选择创建表格的「表单提交」触发器,此时事件对象会包含e.values字段,原脚本无需修改即可正常运行。但如果需要绑定在表单或独立脚本中,必须使用e.response来获取提交数据。
内容的提问来源于stack exchange,提问作者Kevin San
相关产品推荐
相关产品推荐

