谷歌表格:如何合并数据集为缺失训练日填充0出勤值?
解决Google Sheets合并全量训练日与出勤统计的问题
我明白你遇到的问题了——你需要把全量训练日(周三、周五)和实际出勤统计结合起来,补全那些无出勤记录的日期为0,这样出勤率计算才准确。之前用QUERY直接拼接数组出错,是因为数组拼接要求两个数据集的行数完全一致,而不是按日期关联,咱们换个思路来解决:
方法一:用ARRAYFORMULA+VLOOKUP实现左匹配补0
这个方法以你Scratch工作表的全量训练日为基础,逐个查找对应日期的出勤人数,找不到的自动填充0,步骤如下:
- 先确认你的全量训练日在
Scratch!B2:B(从B2开始,无表头),然后在新工作表的A1单元格输入以下完整公式:
={"Session Date", "Skaters"; ARRAYFORMULA( IF( Scratch!B2:B="",, { Scratch!B2:B, IFERROR(VLOOKUP(Scratch!B2:B, QUERY(Records!A2:B, "SELECT Col1, COUNT(Col2) WHERE Col1 IS NOT NULL GROUP BY Col1"), 2, FALSE), 0) } ) )}
公式拆解:
{"Session Date", "Skaters"; ...}:手动设置表头,和后面的数据集按行拼接ARRAYFORMULA:批量处理Scratch里的所有日期行,不用下拉填充IF(Scratch!B2:B="",, ...):跳过Scratch列中的空行VLOOKUP(...):用Scratch的日期去匹配QUERY统计出的出勤结果(你原来的出勤统计逻辑)IFERROR(..., 0):把找不到匹配的日期(无出勤记录)的结果转为0
用你的数据示例测试,最终会得到:
| Session Date | Skaters |
|---|---|
| 2018-05-04 | 2 |
| 2018-05-09 | 0 |
| 2018-05-12 | 1 |
这样就能正确统计所有训练日的出勤情况,不会再因为缺失日期导致出勤率误算。
为什么你之前的QUERY数组方法报错?
你用{Records!A2:B, Scratch!B2:B}是按列拼接两个数组,这种操作要求两个数组的行数完全相同——比如Records有982行,Scratch有999行,行数不匹配就会触发Function ARRAY_ROW parameter 2 has mismatched row size错误。这种拼接方式是把两行位置相同的数据拼在一起,而不是按日期关联,所以不适合你的场景。
可选:用脚本编辑器实现(进阶)
如果你更倾向于用代码解决,Google Apps Script的思路很清晰:
- 读取
Scratch工作表的所有训练日,存入数组 - 读取
Records工作表的日期和姓名,统计每个日期的出勤人数(用对象存储键值对:日期→人数) - 循环遍历全量训练日数组,匹配统计结果,无匹配则设为0
- 将最终结果写入目标工作表
示例代码片段(大概逻辑):
function mergeAttendanceData() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const scratchSheet = ss.getSheetByName('Scratch'); const recordsSheet = ss.getSheetByName('Records'); const targetSheet = ss.getSheetByName('MergedData'); // 自己创建目标表 // 获取全量训练日 const allDates = scratchSheet.getRange('B2:B').getValues().flat().filter(date => date !== ''); // 统计Records的出勤人数 const attendanceStats = {}; const recordsData = recordsSheet.getRange('A2:B').getValues(); recordsData.forEach(row => { const date = row[0]; if (date) { attendanceStats[date] = (attendanceStats[date] || 0) + 1; } }); // 生成最终结果(含表头) const finalData = [['Session Date', 'Skaters']]; allDates.forEach(date => { finalData.push([date, attendanceStats[date] || 0]); }); // 写入目标表 targetSheet.clearContents(); targetSheet.getRange(1, 1, finalData.length, finalData[0].length).setValues(finalData); }
这个脚本可以一键生成合并后的数据集,适合数据量较大或者需要定期更新的场景。
内容的提问来源于stack exchange,提问作者chooban
相关产品推荐
相关产品推荐

