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

如何收集Google Form响应并写入另一工作表指定单元格后删除响应表

实现思路
  • 动态关联匹配:不需要依赖响应表固定名称,通过表单实例的getDestinationId()获取绑定的电子表格ID,再遍历电子表格内所有工作表,匹配getFormUrl()返回的地址和当前表单地址,即可精准定位当前表单对应的响应表。
  • 触发逻辑适配批量场景:创建表单时直接为每个表单绑定表单提交可安装触发器,触发后自动执行迁移逻辑,不需要手动配置每个响应表的监听。
  • 可配置映射规则:将源响应列、目标工作表、目标写入列都抽成配置项,批量创建时可针对不同表单单独传参,适配不同业务需求。
  • 解绑删除逻辑:迁移完成后先调用表单的removeDestination()方法解除关联,再删除响应工作表,避免删除时报关联错误。
代码参考

以下代码可直接对接你已有的表单创建逻辑:

1. 表单创建阶段新增触发器绑定逻辑

在你原有创建表单、关联电子表格的代码后,新增以下内容,为每个新建表单自动绑定提交触发事件:

// 这里是你原有创建表单、关联表格的逻辑
// const form = FormApp.create('你的表单名称');
// const targetSS = SpreadsheetApp.openById('你的总电子表格ID');
// form.setDestination(FormApp.DestinationType.SPREADSHEET, targetSS.getId());

// 新增:为当前表单绑定提交触发器,触发后自动执行迁移逻辑
ScriptApp.newTrigger('handleFormSubmit')
  .forForm(form)
  .onFormSubmit()
  .create();

2. 核心提交处理函数

function handleFormSubmit(e) {
  // ========== 可配置项,根据实际需求修改 ==========
  const TARGET_SHEET_NAME = "C"; // 要写入数据的目标工作表名称
  const SOURCE_COLUMNS = [1, 2, 3]; // 从响应表读取的列号,A=1、B=2以此类推
  const TARGET_COLUMNS = [6, 7, 8]; // 写入目标表的对应列号,F=6、G=7以此类推
  // ==============================================

  const currentForm = e.source;
  // 获取表单绑定的电子表格实例
  const bindSSId = currentForm.getDestinationId();
  const ss = SpreadsheetApp.openById(bindSSId);
  
  // 精准匹配当前表单对应的响应表,不依赖表名
  let responseSheet = null;
  const allSheets = ss.getSheets();
  for (const sheet of allSheets) {
    if (sheet.getFormUrl() === currentForm.getEditUrl()) {
      responseSheet = sheet;
      break;
    }
  }
  if (!responseSheet) throw new Error("未匹配到对应响应表");

  // 读取响应表最新提交的对应列数据
  const lastResponseRow = responseSheet.getLastRow();
  const writeValues = SOURCE_COLUMNS.map(col => responseSheet.getRange(lastResponseRow, col).getValue());

  // 写入目标工作表
  const targetSheet = ss.getSheetByName(TARGET_SHEET_NAME);
  if (!targetSheet) throw new Error("目标工作表不存在");
  // 此处默认追加到目标表最后一行,需要写固定行的话可自行修改targetWriteRow的取值
  const targetWriteRow = targetSheet.getLastRow() + 1;
  TARGET_COLUMNS.forEach((col, index) => {
    targetSheet.getRange(targetWriteRow, col).setValue(writeValues[index]);
  });

  // 解绑表单与响应表,删除响应表
  currentForm.removeDestination();
  ss.deleteSheet(responseSheet);
}
使用说明
  • 批量创建不同规则的表单时,可将配置项通过PropertiesService存储,或在绑定触发器时传入参数,不需要为每个表单单独写处理函数。
  • 首次运行需要授权,确保脚本拥有表单和电子表格的编辑权限。
  • 你描述的示例场景可直接使用默认配置,无需修改映射规则即可生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:45:03