如何在Google Sheets中将重复行的有效数据合并至首行?
在Google Sheets中将重复行的非重复数据合并为单行
我有一个表格,多数列存在重复数据,但并非所有列都是如此,想把所有有效数据移至首行。以下是示例数据:
| 学生ID | 年级 | 姓氏 | 名字 | 课时 | 课程 | 教师 |
|---|---|---|---|---|---|---|
| 123456 | 9 | Smith | John | 1 | Spanish | Sanchez, L. |
| 123456 | 9 | Smith | John | 2 | English | King, A. |
| 123456 | 9 | Smith | John | 3 | PE | Washington, M. |
| 123456 | 9 | Smith | John | 4 | Math | Daniel, C. |
期望的最终效果:
| 学生ID | 年级 | 姓氏 | 名字 | 课时 | 课程 | 教师 | 课时 | 课程 | 教师 | 课时 | 课程 | 教师 | 课时 | 课程 | 教师 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 123456 | 9 | Smith | John | 1 | Spanish | Sanchez, L. | 2 | English | King, A. | 3 | PE | Washington, M. | 4 | Math | Daniel, C. |
之前尝试清理数据删除最后三行,只保留了首行,达不到预期效果,需要Google Sheets的解决方案。
解决方案
方法1:单学生场景快速处理
假设原数据位于A1:G5(A1为表头,A2:G5为数据行):
- 生成合并表头:在空白区域(如A10)输入公式,重复「课时、课程、教师」表头:
重复次数 = 该学生的总行数 - 1,此例中为3次。={A1:D1, E1:G1, E1:G1, E1:G1, E1:G1} - 生成合并数据行:在A11单元格输入公式,将课程数据横向追加到基础信息后:
={A2:D2, FLATTEN(E2:G5)}
方法2:多学生批量处理
如果表格包含多个学生数据,可批量生成结果:
- 提取唯一学生基础信息:在A10单元格输入公式,自动列出所有不重复的学生信息:
=UNIQUE(A2:D5) - 批量展开课程数据:在E10单元格输入数组公式,自动匹配每个学生的所有课程数据并横向展开:
=ARRAYFORMULA(IFERROR(FLATTEN(VLOOKUP(A10:A, {A2:A, E2:G}, {2,3,4}, FALSE)))) - 补充表头:根据每个学生的课程数量,重复「课时、课程、教师」表头即可。
方法3:自动化脚本(适用于大数据量)
若数据量较大,可通过Apps Script自动处理:
- 打开Google Sheets,点击「扩展程序」→「Apps 脚本」。
- 删除默认代码,粘贴以下脚本:
function mergeRows() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const data = sheet.getDataRange().getValues(); const header = data[0]; const merged = {}; // 按学生ID分组,合并课程数据 for (let i = 1; i < data.length; i++) { const id = data[i][0]; if (!merged[id]) { merged[id] = data[i].slice(0,4); // 保留前4列基础信息 } merged[id] = merged[id].concat(data[i].slice(4)); // 追加后3列课程数据 } // 生成新表头:基础表头 + 重复的课程表头 const maxCourses = Math.max(...Object.values(merged).map(row => (row.length-4)/3)); const newHeader = header.slice(0,4).concat(...Array(maxCourses).fill(header.slice(4))); // 将结果写入新工作表 const newSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(); newSheet.appendRow(newHeader); Object.values(merged).forEach(row => newSheet.appendRow(row)); } - 点击运行,授权后即可自动生成合并后的表格。
内容的提问来源于stack exchange,提问作者ralexg
相关产品推荐
相关产品推荐

