如何在Google Sheets中合并多年度Athletic.net赛事数据表格?
合并Athletic.net多年度田径赛事数据表格
问题背景
已通过ImportHTML工具成功导入2021、2022、2023三个年度的独立田径赛事表格,但现有表格结构(如下示例)导致同类赛事合并困难,每个表格还包含运动员姓名、年级及成绩数据(示例未展示):
现有导入表格结构示例
| 2023年赛事 | 2022年赛事 | 2021年赛事 |
|---|---|---|
| 100 meter | 60 meter | 100 meter |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 100 meter | 200 meter |
| 200 meter | 1 | 1 |
| 1 | 2 | 2 |
| 2 | 3 | 400 meter |
| 3 | 4 | 1 |
| 400 meter | 200 meter | 2 |
| 1 | 1 | 3 |
| 2 | 2 | 4 |
| 3 | 3 | 1600 meter |
期望合并后的表格格式
| 赛事 |
|---|
| 60 meter |
| 1 |
| 2 |
| 100 meter |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| ... |
解决步骤
拆分各年度数据列:把每个年度的列数据单独提取,以Google Sheets为例,用公式导出到独立区域:
- 提取2023年数据:
=FILTER(A:A, A:A<>"") - 提取2022年数据:
=FILTER(B:B, B:B<>"") - 提取2021年数据:
=FILTER(C:C, C:C<>"")
- 提取2023年数据:
识别赛事标题行:赛事标题带斜体格式,可通过单元格格式特征(或关键词如"meter")筛选出所有赛事标题行,标记为分组依据。
按赛事分类整理数据:新建工作表,先列出所有唯一赛事名称,再对应收集三个年度里该赛事的成绩、运动员信息行,依次追加到赛事标题下方。
批量合并自动化(可选):数据量大时用脚本实现自动化,以下是Google Apps Script简化示例:
function mergeTrackData() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName("原始数据"); const targetSheet = ss.getSheetByName("合并后数据"); targetSheet.clear(); // 获取各列非空数据 const col2023 = sourceSheet.getRange("A:A").getValues().filter(row => row[0] !== ""); const col2022 = sourceSheet.getRange("B:B").getValues().filter(row => row[0] !== ""); const col2021 = sourceSheet.getRange("C:C").getValues().filter(row => row[0] !== ""); const allData = [...col2023, ...col2022, ...col2021]; const eventGroups = {}; let currentEvent = ""; // 按赛事分组数据 allData.forEach(row => { const cellValue = row[0].toString(); if (cellValue.includes("meter") || cellValue.includes("mile")) { currentEvent = cellValue; if (!eventGroups[currentEvent]) eventGroups[currentEvent] = []; } else if (currentEvent) { eventGroups[currentEvent].push(cellValue); } }); // 写入合并后的数据 let rowIndex = 1; targetSheet.getRange(rowIndex, 1).setValue("赛事"); rowIndex++; Object.keys(eventGroups).forEach(event => { targetSheet.getRange(rowIndex, 1).setValue(event).setFontStyle("italic"); rowIndex++; eventGroups[event].forEach(data => { targetSheet.getRange(rowIndex, 1).setValue(data); rowIndex++; }); }); }
- 验证与调整:合并完成后检查各赛事下的信息完整性,调整格式匹配预期样式。
内容的提问来源于stack exchange,提问作者seth_marie
相关产品推荐
相关产品推荐

