Google Spreadsheet同ID多行合并(不同列结果)技术咨询
Google Sheets:合并相同ID的多行到对应列
需求说明
将ID列值一致的多行数据合并,把原各行的对应字段(如姓名、年龄)分配到合并后单行的不同列中(例如同一ID下的第1条数据对应姓名1、年龄1,第2条对应姓名2、年龄2)。
解决方案1:公式实现(适合小数据集)
假设源数据在A:C列(A=ID,B=姓名,C=年龄),合并结果从E列开始:
- 提取唯一ID
在E2输入:
=UNIQUE(A2:A)
自动生成不重复的ID列表。
- 提取对应字段到多列
- 提取第1条数据的姓名(F2):
=INDEX(FILTER(B:B, A:A=E2), 1)
- 提取第1条数据的年龄(G2):
=INDEX(FILTER(C:C, A:A=E2), 1)
- 提取第2条数据的姓名(H2):
=IFERROR(INDEX(FILTER(B:B, A:A=E2), 2), "")
- 提取第2条数据的年龄(I2):
=IFERROR(INDEX(FILTER(C:C, A:A=E2), 2), "")
按需向下/向右填充公式,INDEX的第二个参数对应数据的序号,IFERROR用于处理无数据的情况,返回空值。
如果需要将同ID的字段用分隔符合并到同一列(如姓名用逗号分隔),可使用:
=TEXTJOIN(", ", TRUE, FILTER(B:B, A:A=E2))
解决方案2:Google Apps Script(适合大数据集)
用脚本自动生成结构化的合并结果:
- 打开工作表,点击「扩展程序」→「Apps 脚本」
- 替换默认代码为以下内容:
function mergeRowsByID() { const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const allData = activeSheet.getDataRange().getValues(); const headerRow = allData[0]; const groupedData = {}; // 按ID分组数据 for (let i = 1; i < allData.length; i++) { const currentID = allData[i][0]; if (!groupedData[currentID]) { groupedData[currentID] = [currentID]; } // 添加姓名、年龄到分组 groupedData[currentID].push(allData[i][1], allData[i][2]); } // 生成新表头 const maxItems = Math.max(...Object.values(groupedData).map(row => (row.length - 1) / 2)); const newHeader = ["ID"]; for (let num = 1; num <= maxItems; num++) { newHeader.push(`姓名${num}`, `年龄${num}`); } // 整理输出数据,补全空值 const outputData = [newHeader]; Object.values(groupedData).forEach(row => { while (row.length < newHeader.length) { row.push(""); } outputData.push(row); }); // 创建新工作表并写入结果 const resultSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("合并结果"); resultSheet.getRange(1, 1, outputData.length, outputData[0].length).setValues(outputData); }
- 点击运行,授权后会自动生成名为「合并结果」的工作表,包含最终合并数据。
内容的提问来源于stack exchange,提问作者JPashs
相关产品推荐
相关产品推荐

