如何用Google Apps Script实现Google表单修改生成新记录
解决Google表单修改响应时生成新记录的问题
默认情况下,Google表单修改已提交的响应时,只会更新关联电子表格中的原有行,且不会触发onFormSubmit触发器。要实现修改响应时生成新记录,需要换用电子表格编辑触发器来监听行修改事件,具体方案如下:
核心思路
表单修改响应本质是修改了关联工作表的对应行,通过监听该工作表的编辑事件,捕获修改后的行数据并追加到目标工作表,即可生成新记录。
修正后的代码
function onEdit(e) { // 配置参数 const sourceSheetName = "表单响应1"; // 表单默认关联的工作表名称,需替换为实际名称 const targetSheetName = "TabB"; const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = spreadsheet.getSheetByName(sourceSheetName); const targetSheet = spreadsheet.getSheetByName(targetSheetName); // 过滤非目标工作表的编辑,以及表头行(假设表头在第1行) if (e.source.getSheetName() !== sourceSheetName || e.range.getRow() === 1) { return; } // 获取被修改行的完整数据 const editedRow = sourceSheet.getRange(e.range.getRow(), 1, 1, sourceSheet.getLastColumn()).getValues()[0]; // 追加修改后的行数据到目标工作表 targetSheet.appendRow(editedRow); }
关键说明
- 触发器类型:使用
onEdit简单触发器,无需手动创建,只要代码保存在关联的电子表格脚本编辑器中,就会在表格编辑时自动触发,包括表单修改响应导致的行更新。 - 范围过滤:通过判断编辑的工作表名称和行号,确保只处理表单响应工作表的内容行,避免无关编辑触发脚本。
- 数据获取:获取修改行的完整数据(而非仅修改的单元格),保证新记录包含所有表单字段。
进阶优化(可选)
如果需要避免首次提交时重复追加记录(首次提交也会触发onEdit),可以添加标记列实现过滤:
- 在表单关联工作表新增一列(比如“已同步”),默认值为
FALSE。 - 修改代码,追加记录后将该列设为
TRUE,后续修改时直接追加:
function onEdit(e) { const sourceSheetName = "表单响应1"; const targetSheetName = "TabB"; const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = spreadsheet.getSheetByName(sourceSheetName); const targetSheet = spreadsheet.getSheetByName(targetSheetName); const syncColIndex = sourceSheet.getLastColumn(); // 假设新增的“已同步”列是最后一列 if (e.source.getSheetName() !== sourceSheetName || e.range.getRow() === 1) { return; } const editedRow = sourceSheet.getRange(e.range.getRow(), 1, 1, sourceSheet.getLastColumn()).getValues()[0]; const isSynced = editedRow[syncColIndex - 1]; // 数组索引从0开始 // 首次提交时同步并标记,修改时直接同步 if (!isSynced) { targetSheet.appendRow(editedRow); sourceSheet.getRange(e.range.getRow(), syncColIndex).setValue(true); } else { targetSheet.appendRow(editedRow); } }
内容的提问来源于stack exchange,提问作者Simon Rook
相关产品推荐
相关产品推荐

