表单脚本中namedValues报错,表格脚本可正常运行的技术咨询
问题原因
Google表单绑定脚本的onFormSubmit触发器事件对象,和Google表格绑定脚本的结构完全不同:
- 表格端的事件对象属于
SpreadsheetFormSubmitEvent,自带namedValues属性,直接用字段名就能取到对应值 - 表单端的事件对象属于
FormResponse,没有namedValues属性,这就是你报错Cannot read property 'Name' of undefined的核心原因
解决方案:在表单脚本中实现类似namedValues的功能
可以手动把表单的ItemResponse列表转换成键值对对象,键是问题标题,值是响应内容,这样就能像用namedValues一样通过标题访问数据,完美适配你处理30个字段的需求,代码示例如下:
function onFormSubmit(e) { // 把表单响应转换成类似namedValues的键值对对象 const formResponseObj = {}; e.response.getItemResponses().forEach(itemResp => { const questionTitle = itemResp.getItem().getTitle(); const responseValue = itemResp.getResponse(); // 处理多选等返回数组的情况,和表格端namedValues行为保持一致 formResponseObj[questionTitle] = Array.isArray(responseValue) ? responseValue.join(', ') : responseValue; }); const emailRecipients = 'someemail@gmail.com'; const emailSubject = 'Subject of email'; // 现在可以直接用问题标题访问,和表格端用法完全一致 let name = formResponseObj['Name'].trim(); let htmlBody = `<p>${name}</p>`; GmailApp.sendEmail(emailRecipients, emailSubject, '', { htmlBody: htmlBody }); }
补充说明
- 转换后的对象和表格端
namedValues行为基本一致:多选问题会把选项数组转成逗号分隔的字符串,单个选项直接返回字符串 - 注意问题标题要完全匹配(包括大小写、空格),否则会取不到对应值
- 表单自带的必填项校验已生效,无需额外处理
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

