单个EditResponseURL能否编辑双表格响应?编辑时表格C新增记录求解
解决表单编辑响应时表格重复新增记录的问题
问题根源
你当前的脚本每次触发onFormSubmit事件时,都会获取表单的最后一条响应并追加到表格C中——不管是用户新提交的响应,还是编辑已有响应触发的事件,都会执行appendRow新增行。而官方关联的表格B会通过响应ID识别是编辑操作,自动更新原记录而非新增。
解决方案
核心思路是:利用表单响应的唯一ID,在表格C中匹配已有记录,存在则更新,不存在再新增。具体步骤如下:
- 在表格C的Sheet1中新增一列(建议放在第一列),表头设为「响应ID」,用来存储每个表单响应的唯一标识。
- 修改脚本,通过触发事件对象
e获取当前响应的ID和数据,实现匹配更新逻辑:
function onFormSubmit(e) { // 获取当前触发的响应对象(新提交/编辑后的响应) const formResponse = e.response; const responseId = formResponse.getId(); // 获取响应唯一ID const itemResponses = formResponse.getItemResponses(); // 整理要写入的数据:先放响应ID,再依次添加表单字段值 const rowData = [responseId]; itemResponses.forEach(itemResp => { rowData.push(itemResp.getResponse()); }); // 打开目标表格C const ss = SpreadsheetApp.openById('你的表格C的ID'); const dataSheet = ss.getSheetByName("Sheet1"); const allData = dataSheet.getDataRange().getValues(); // 查找表格中是否已有该响应ID的记录 let targetRowNum = -1; for (let i = 1; i < allData.length; i++) { // 跳过表头,从第2行开始遍历 if (allData[i][0] === responseId) { // 第1列存储响应ID,匹配查找 targetRowNum = i + 1; // 表格行号从1开始,转换为实际行号 break; } } if (targetRowNum !== -1) { // 找到已有记录,更新该行数据 dataSheet.getRange(targetRowNum, 1, 1, rowData.length).setValues([rowData]); } else { // 无匹配记录,新增一行 dataSheet.appendRow(rowData); } }
关键说明
- 用
e.response获取当前响应:触发事件时,e对象已包含当前操作的响应数据,比手动获取最后一条响应更准确,还能避免多用户并发提交时的错误。 - 响应ID的唯一性:每个表单响应的ID是固定不变的,编辑操作不会改变ID,因此可以可靠地用来匹配表格中的记录。
- 更新逻辑:通过遍历表格数据找到对应ID的行,执行更新而非新增,彻底解决编辑时重复创建记录的问题。
内容的提问来源于stack exchange,提问作者YS87
相关产品推荐
相关产品推荐

