You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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]对应的表单问题是否正确(若表单有新增/删除问题,需同步调整索引)。

部署步骤

  1. 打开目标谷歌表单,点击右上角「扩展程序」→「Apps 脚本」;
  2. 删除默认代码,粘贴上述修改后的脚本;
  3. 点击左侧「触发器」图标,添加新触发器:
    • 选择函数:onFormSubmit
    • 选择事件源:「表单」
    • 选择事件类型:「表单提交」
  4. 保存并授权触发器权限。

内容的提问来源于stack exchange,提问作者nlw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:01:34