将Apps Script从谷歌表格迁移至谷歌表单以避免重复行问题
解决表单提交触发脚本重复行问题(迁移至谷歌表单环境)
原脚本绑定在谷歌表格的onEdit触发器上,导致编辑表单响应时会重复执行插入行逻辑,迁移至谷歌表单的表单提交触发器即可解决——该触发器仅在用户提交新表单时触发,编辑已有响应不会触发。
修改后的适配脚本
function onFormSubmit(e) { // 获取当前表单绑定的谷歌表格 const form = FormApp.getActiveForm(); const ssId = form.getDestinationId(); const ss = SpreadsheetApp.openById(ssId); // 获取表单提交的所有响应数据(按表单问题顺序对应表格列) const itemResponses = e.response.getItemResponses(); // 将响应转换为数组,对应原脚本的rowValues(注意:索引从0开始,与表格列顺序一致) const rowValues = itemResponses.map(response => response.getResponse()); // 原逻辑的判断条件:第22个问题(索引21)不为空,且第18个问题(索引17)不等于"Yes" if (rowValues[21] !== "" && rowValues[17] !== "Yes") { const targetSheet = ss.getSheetByName("UENA"); // 在第2行前插入新行 targetSheet.insertRowBefore(2); const targetRange = targetSheet.getRange(2, 4, 1, rowValues.length); // 写入表单响应数据 targetRange.setValues([rowValues]); // 复制第4行的条件格式和单元格格式到新行 targetSheet.getRange('4:4').copyTo(targetSheet.getRange('2:2'), SpreadsheetApp.CopyPasteType.PASTE_CONDITIONAL_FORMATTING, false); targetSheet.getRange('4:4').copyTo(targetSheet.getRange('2:2'), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); // 按第8列、第7列升序排序 targetSheet.getRange("A2:AD").sort([{column: 8, ascending: true}, {column: 7, ascending: true}]); // 设置B2单元格的数据验证规则 targetSheet.getRange('B2').setDataValidation(SpreadsheetApp.newDataValidation() .setAllowInvalid(false) .requireValueInList(['AA', 'BB', 'CC', 'DD', 'EE', 'FF', 'GG', 'HH', 'II', 'KK', 'LL'], true) .build()); // 在C2插入复选框 targetSheet.getRange('C2').insertCheckboxes(); } }
关键修改说明
- 触发器类型变更:将原表格的
onEdit触发器替换为表单的表单提交触发器,避免编辑响应时重复执行。 - 数据获取方式:从表单事件对象
e.response直接获取提交数据,无需读取表格行,避免编辑时重复读取。 - 索引对应确认:
rowValues的索引与表单问题顺序完全一致,请确认原脚本中rowValues[21]和rowValues[17]对应的表单问题是否正确(若表单有新增/删除问题,需同步调整索引)。
部署步骤
- 打开目标谷歌表单,点击右上角「扩展程序」→「Apps 脚本」;
- 删除默认代码,粘贴上述修改后的脚本;
- 点击左侧「触发器」图标,添加新触发器:
- 选择函数:
onFormSubmit - 选择事件源:「表单」
- 选择事件类型:「表单提交」
- 选择函数:
- 保存并授权触发器权限。
内容的提问来源于stack exchange,提问作者nlw
相关产品推荐
相关产品推荐

