使用Google Apps Script同步Google Forms响应到Sheets的列匹配问题
问题原因
原代码未将表单响应和表格列标题做绑定,仅按表单提交的问题顺序依次写入表格列,一旦表单调整问题顺序、增减问题,就会出现内容错位。
修正后的完整代码
function onFormSubmit(event) { // 用对象存储响应,键为问题标题,值为对应答案 const responseMap = {}; // 直接从提交事件获取最新响应,无需拉取全量表单响应 const itemResponses = event.response.getItemResponses(); for (let j = 0; j < itemResponses.length; j++) { const itemResponse = itemResponses[j]; const title = itemResponse.getItem().getTitle(); const answer = itemResponse.getResponse(); responseMap[title] = answer; } AddRecord(responseMap); } function AddRecord(responseMap) { const url = 'https://docs.google.com/spreadsheets/d/1ZHlvt_Blqe7rDheIxVjvYhneoZfZPGiGbXFSIri6u1c/edit#gid=0'; const ss = SpreadsheetApp.openByUrl(url); const dataSheet = ss.getSheetByName("Sheet7"); // 读取第一行所有列标题 const headerRow = dataSheet.getRange(1, 1, 1, dataSheet.getLastColumn()).getValues()[0]; const newRow = []; // 按表格列标题顺序匹配对应答案 headerRow.forEach(header => { newRow.push(responseMap[header] || ""); }); // 末尾加提交时间 newRow.push(new Date()); // 写入新行 dataSheet.appendRow(newRow); }
核心修改说明
- 将收集响应的结构从普通数组改为对象,以表单问题标题为键存储对应答案,不受问题顺序影响
- AddRecord函数新增列标题匹配逻辑:先读取表格第一行的列标题,按标题顺序匹配对应答案生成行数据,无对应答案的列自动留空
- 优化了响应读取逻辑:直接使用表单提交事件自带的响应对象,不需要每次拉取全量表单响应,运行效率更高
注意事项
- 请确保Sheet7第一行的列标题与表单的问题标题完全一致,包括空格、大小写、特殊符号,否则无法正常匹配
- 部署时请保留onFormSubmit的触发器配置,触发条件选择「表单提交」即可
内容的提问来源于stack exchange,提问作者Chidi O
相关产品推荐
相关产品推荐

