提交Google表单后无法获取源与值:onFormSubmit触发器日志为空
解决Google Apps Script onFormSubmit触发器e.values为空的问题
问题描述
已安装onFormSubmit触发器,但触发时日志显示事件对象的response和source为空,且提示'e'对象或'e.values'不可用。,日志内容如下:
Mar 28, 2025, 9:34:06 AM Info {"authMode":"FULL","response":{},"source":{},"triggerUid":"1839349930"}
Mar 28, 2025, 9:34:06 AM Info 'e'对象或'e.values'不可用。
用户代码如下:
function testSendConfirmationEmail() { var mockEvent = { values: [ "2025-03-26 12:00:00", "john.doe@gmail.com", "john doe", "john.doe@gmail.com", "0478123456", "M", "Jas met lange mouwen - €31,5", "Keuze2", "John Doe", "", "31.5", ], }; sendConfirmationEmail(mockEvent); } function sendConfEmail(e) { Logger.log(JSON.stringify(e)); // 以JSON格式记录完整事件对象 if (!e || !e.values) { Logger.log("'e'对象或'e.values'不可用。"); return; } Logger.log(e); var responses = e.values; // 基于您的布局自定义列索引 var timestamp = responses[0] || "未填写时间戳"; // 列A var email = responses[1] || "未填写邮箱地址"; // 列B var naam = responses[2] || "未填写姓名"; // 列C var alternatiefEmail = responses[3] || "未填写备用邮箱地址"; // 列D var telefoonnummer = responses[4] || "未填写电话号码"; // 列E var maat = responses[5] || "未填写尺码"; // 列F var keuze1 = responses[6] || "未选择选项"; // 列G var keuze2 = responses[7] || ""; // 列H var naamJas = responses[8] || "未填写夹克姓名"; // 列I var prijs = responses[10] || "未知"; // 列K Logger.log("Naam: " + naam); Logger.log("E-mailadres: " + email); Logger.log("Alternatief E-mailadres: " + alternatiefEmail); Logger.log("Telefoonnummer: " + telefoonnummer); Logger.log("Maat: " + maat); Logger.log("Keuze 1: " + keuze1); Logger.log("Keuze 2: " + keuze2); Logger.log("Naam (jas): " + naamJas); Logger.log("Prijs: " + prijs); // 邮件内容 var subject = "订单确认"; var body = "尊敬的 " + naam + ",\n\n感谢您的订单!以下是订单概述:\n\n" + "时间戳: " + timestamp + "\n" + "邮箱地址: " + email + "\n" + "电话号码: " + telefoonnummer + "\n" + "尺码: " + maat + "\n" + "所选商品: " + keuze1 + " + " + keuze2 + "\n" + "夹克姓名: " + naamJas + "\n" + "价格: €" + prijs + "\n\n" + "此致,\nHe团队"; try { MailApp.sendEmail(email, subject, body); Logger.log("邮件已发送至: " + email); } catch (error) { Logger.log( "发送邮件时出错: " + error.message ); } }
解决方案
1. 核对触发器绑定的函数名
测试函数调用的是sendConfirmationEmail,但实际触发器绑定的是sendConfEmail,两者名称不匹配会导致无法正确接收事件对象。请打开触发器设置,确认选择函数为sendConfEmail。
2. 确认触发器的事件源类型
Google表单的onFormSubmit触发器分为两种,事件对象结构不同:
- 表格绑定触发器:绑定到表单对应的Google表格,事件对象包含
values属性(提交的行数据数组),适配你现有代码的e.values逻辑; - 表单绑定触发器:直接绑定到Google表单,事件对象包含
response属性,需通过e.response.getItemResponses()获取响应值。
若你想保留现有代码逻辑,应选择绑定表格的onFormSubmit触发器。
3. 适配不同触发器的代码调整(二选一)
若使用表格触发器
无需修改核心逻辑,仅需确保触发器绑定到表单对应的表格,且函数名匹配即可。
若使用表单触发器
修改代码获取响应值的方式:
function sendConfEmail(e) { Logger.log(JSON.stringify(e)); if (!e || !e.response) { Logger.log("'e'对象或'e.response'不可用。"); return; } // 获取所有表单字段的响应 var itemResponses = e.response.getItemResponses(); var responses = itemResponses.map(itemResp => itemResp.getResponse()); // 时间戳通过response对象获取 var timestamp = e.response.getTimestamp().toLocaleString() || "未填写时间戳"; // 后续字段按表单顺序对应数组索引 var email = responses[0] || "未填写邮箱地址"; var naam = responses[1] || "未填写姓名"; var alternatiefEmail = responses[2] || "未填写备用邮箱地址"; var telefoonnummer = responses[3] || "未填写电话号码"; var maat = responses[4] || "未填写尺码"; var keuze1 = responses[5] || "未选择选项"; var keuze2 = responses[6] || ""; var naamJas = responses[7] || "未填写夹克姓名"; var prijs = responses[9] || "未知"; // 后续邮件发送逻辑保持不变 var subject = "订单确认"; var body = "尊敬的 " + naam + ",\n\n感谢您的订单!以下是订单概述:\n\n" + "时间戳: " + timestamp + "\n" + "邮箱地址: " + email + "\n" + "电话号码: " + telefoonnummer + "\n" + "尺码: " + maat + "\n" + "所选商品: " + keuze1 + " + " + keuze2 + "\n" + "夹克姓名: " + naamJas + "\n" + "价格: €" + prijs + "\n\n" + "此致,\nHe团队"; try { MailApp.sendEmail(email, subject, body); Logger.log("邮件已发送至: " + email); } catch (error) { Logger.log("发送邮件时出错: " + error.message); } }
4. 重新创建触发器
若以上操作后问题仍存在,建议删除现有触发器并重新创建:
- 打开脚本编辑器,点击左侧「触发器」图标;
- 删除当前的onFormSubmit触发器;
- 点击「添加触发器」,选择正确的函数名、事件源(表格/表单)、事件类型(提交时),完成配置。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

