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

如何获取指定Gmail账号创建的所有Google Forms并关联响应表格合并数据?

解决方案:批量获取Google Forms并合并响应数据

我明白你遇到的问题——单独用FormApp只能逐个处理表单,而之前用DriveApp筛选没成功大概率是MIME类型用错了。下面给你一套完整的解决思路和代码,能一次性搞定所有表单的响应数据合并:

核心步骤说明

  • 正确筛选所有Google Forms:Drive里的Google Forms有专属的MIME类型,用这个才能精准筛选到所有你创建的表单
  • 关联响应表格:通过表单ID打开表单后,直接提取关联的响应表格ID
  • 合并数据到汇总表:统一处理表头和数据行,给每条数据打上来源表单的标签,避免混乱

完整代码实现

function mergeFormResponses() {
  // 1. 筛选Drive中所有Google Forms文件
  const forms = DriveApp.getFilesByType(MimeType.GOOGLE_FORMS);
  
  // 2. 初始化汇总表格:有就打开,没有就新建
  let summarySheet;
  try {
    // 替换成你已有的汇总表ID(可选),没有的话注释掉这行,用下面的新建逻辑
    summarySheet = SpreadsheetApp.openById("你的汇总表ID").getSheetByName("汇总数据");
  } catch (e) {
    // 自动创建汇总表格和工作表
    const newSpreadsheet = SpreadsheetApp.create("Forms响应汇总表");
    summarySheet = newSpreadsheet.getActiveSheet();
    summarySheet.setName("汇总数据");
  }
  
  let hasWrittenHeader = false; // 标记是否已写入表头
  
  // 3. 遍历每个表单处理数据
  while (forms.hasNext()) {
    const formFile = forms.next();
    const formId = formFile.getId();
    const formName = formFile.getName();
    
    try {
      // 打开当前表单
      const form = FormApp.openById(formId);
      // 获取关联的响应表格ID
      const destinationId = form.getDestinationId();
      
      // 跳过未关联响应表格的表单
      if (!destinationId) {
        console.log(`⚠️ 表单「${formName}」未设置响应表格,已跳过`);
        continue;
      }
      
      // 打开响应表格的第一个工作表(默认响应存在第一个表)
      const responseSheet = SpreadsheetApp.openById(destinationId).getSheets()[0];
      const allData = responseSheet.getDataRange().getValues();
      
      // 跳过无响应数据的表单
      if (allData.length === 0) {
        console.log(`ℹ️ 表单「${formName}」暂无响应数据,已跳过`);
        continue;
      }
      
      // 处理表头:仅第一次写入时添加表头,同时追加「来源表单」列
      if (!hasWrittenHeader) {
        allData[0].unshift("来源表单");
        summarySheet.getRange(1, 1, 1, allData[0].length).setValues([allData[0]]);
        hasWrittenHeader = true;
      } else {
        // 后续表单跳过表头行
        allData.shift();
      }
      
      // 给每条数据添加来源表单名称,方便溯源
      allData.forEach(row => row.unshift(formName));
      
      // 将数据写入汇总表的下一行
      const nextEmptyRow = summarySheet.getLastRow() + 1;
      summarySheet.getRange(nextEmptyRow, 1, allData.length, allData[0].length).setValues(allData);
      
      console.log(`✅ 已成功导入表单「${formName}」的${allData.length}条数据`);
      
    } catch (error) {
      console.log(`❌ 处理表单「${formName}」时出错:${error.message}`);
    }
  }
  
  // 处理完成后弹出提示
  SpreadsheetApp.getUi().alert("所有表单数据合并完成!");
}

使用指南

  1. 打开Google Apps脚本编辑器:随便打开一个Google表格/表单,点击顶部菜单「工具」→「脚本编辑器」
  2. 粘贴上述代码:如果已经有汇总表,把代码里的"你的汇总表ID"替换成你自己的表格ID;没有的话直接用默认的新建逻辑
  3. 运行函数:点击编辑器顶部的运行按钮,第一次运行会要求授权,按照提示完成授权即可(授权是安全的,因为脚本只访问你自己的Drive数据)

注意事项

  • 如果你的表单数量非常多(比如几百个),单次运行可能会超时(Google Apps脚本单次运行最长6分钟),可以考虑分批处理,比如在循环里加个计数器,每处理50个就暂停一下
  • 响应表格默认取第一个工作表,如果你的表单响应存在其他工作表,需要修改getSheets()[0]为对应的索引或名称
  • 可以根据自己的需求调整汇总表的格式,比如添加条件格式、筛选器等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:54:09