请求编写Google Apps Script拆分Google Form多组响应为独立行
Google Apps Script 拆分表单响应为多行数据
需求场景
你的Google Form结构如下:
- 第1部分:仅日期输入项
- 第2至13部分:每组包含
Colour、Size、Age、City、Another? [是/否],选「是」进入下一组,选「否」提交表单
提交后的响应会存入Responses工作表,列是重复的字段(比如Colour 1、Size 1...Colour 12、Size 12),未填写的组对应列为空。需要将每组有效(非空)的Colour/Size/Age/City数据拆分为独立行,每行保留提交的Timestamp和Date,并追加到新的Data工作表中。
实现脚本
打开Google表格,点击「扩展程序」→「Apps脚本」,粘贴以下代码:
function splitFormResponses() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const responsesSheet = ss.getSheetByName("Responses"); const dataSheet = ss.getSheetByName("Data") || ss.insertSheet("Data"); // 初始化Data表头(如果不存在) if (dataSheet.getLastRow() === 0) { dataSheet.appendRow(["Timestamp", "Date", "Colour", "Size", "Age", "City"]); } const responsesData = responsesSheet.getDataRange().getValues(); const headerRow = responsesData[0]; const processedCol = headerRow.indexOf("已处理") === -1 ? responsesSheet.getLastColumn() + 1 : headerRow.indexOf("已处理") + 1; // 遍历每一条提交记录(跳过表头) for (let i = 1; i < responsesData.length; i++) { const row = responsesData[i]; const timestamp = row[0]; const date = row[1]; const isProcessed = row[processedCol - 1]; // 跳过已处理的记录 if (isProcessed) continue; // 处理12组重复字段(第2到13部分) const newRows = []; for (let group = 1; group <= 12; group++) { // 定位当前组的列索引(假设表头命名为"Colour 1"、"Size 1"等) const colourCol = headerRow.indexOf(`Colour ${group}`); const sizeCol = headerRow.indexOf(`Size ${group}`); const ageCol = headerRow.indexOf(`Age ${group}`); const cityCol = headerRow.indexOf(`City ${group}`); // 如果列不存在,跳过当前组 if (colourCol === -1) break; const colour = row[colourCol]; // 以Colour为空判断是否为无效组 if (!colour) continue; // 组装新行数据 newRows.push([ timestamp, date, colour, row[sizeCol] || "", row[ageCol] || "", row[cityCol] || "" ]); } // 将有效数据追加到Data表 if (newRows.length > 0) { dataSheet.getRange(dataSheet.getLastRow() + 1, 1, newRows.length, newRows[0].length).setValues(newRows); } // 标记当前记录为已处理,避免重复运行时重复处理 responsesSheet.getRange(i + 1, processedCol).setValue("是"); } // 如果是首次添加"已处理"列,设置表头 if (headerRow.indexOf("已处理") === -1) { responsesSheet.getRange(1, processedCol).setValue("已处理"); } SpreadsheetApp.getUi().alert("数据拆分完成!"); }
关键说明
- 表头命名匹配:脚本假设
Responses表的表头是Timestamp、Date、Colour 1、Size 1...Colour 12、Size 12这样的格式,如果你的表头命名不同,需要修改indexOf里的字符串(比如如果是「颜色 1」就改成"颜色 1")。 - 重复处理防护:脚本会在
Responses表新增「已处理」列,标记已处理的记录,避免重复运行时重复拆分数据。 - 有效组判断:脚本以
Colour字段是否为空作为判断组是否有效的依据,你可以根据需求改成其他字段(比如Size)。 - 自动创建Data表:如果
Data表不存在,脚本会自动创建并添加表头。
使用方法
- 保存脚本,命名为
SplitFormResponses - 点击脚本编辑器的运行按钮,首次运行需要授权权限
- 运行完成后,查看
Data表即可看到拆分后的多行数据
内容的提问来源于stack exchange,提问作者WarrenG
相关产品推荐
相关产品推荐

