如何获取指定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("所有表单数据合并完成!"); }
使用指南
- 打开Google Apps脚本编辑器:随便打开一个Google表格/表单,点击顶部菜单「工具」→「脚本编辑器」
- 粘贴上述代码:如果已经有汇总表,把代码里的
"你的汇总表ID"替换成你自己的表格ID;没有的话直接用默认的新建逻辑 - 运行函数:点击编辑器顶部的运行按钮,第一次运行会要求授权,按照提示完成授权即可(授权是安全的,因为脚本只访问你自己的Drive数据)
注意事项
- 如果你的表单数量非常多(比如几百个),单次运行可能会超时(Google Apps脚本单次运行最长6分钟),可以考虑分批处理,比如在循环里加个计数器,每处理50个就暂停一下
- 响应表格默认取第一个工作表,如果你的表单响应存在其他工作表,需要修改
getSheets()[0]为对应的索引或名称 - 可以根据自己的需求调整汇总表的格式,比如添加条件格式、筛选器等
内容的提问来源于stack exchange,提问作者user1058551
相关产品推荐
相关产品推荐

