You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

谷歌表格:如何合并数据集为缺失训练日填充0出勤值?

解决Google Sheets合并全量训练日与出勤统计的问题

我明白你遇到的问题了——你需要把全量训练日(周三、周五)和实际出勤统计结合起来,补全那些无出勤记录的日期为0,这样出勤率计算才准确。之前用QUERY直接拼接数组出错,是因为数组拼接要求两个数据集的行数完全一致,而不是按日期关联,咱们换个思路来解决:

方法一:用ARRAYFORMULA+VLOOKUP实现左匹配补0

这个方法以你Scratch工作表的全量训练日为基础,逐个查找对应日期的出勤人数,找不到的自动填充0,步骤如下:

  1. 先确认你的全量训练日在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 DateSkaters
2018-05-042
2018-05-090
2018-05-121

这样就能正确统计所有训练日的出勤情况,不会再因为缺失日期导致出勤率误算。

为什么你之前的QUERY数组方法报错?

你用{Records!A2:B, Scratch!B2:B}是按列拼接两个数组,这种操作要求两个数组的行数完全相同——比如Records有982行,Scratch有999行,行数不匹配就会触发Function ARRAY_ROW parameter 2 has mismatched row size错误。这种拼接方式是把两行位置相同的数据拼在一起,而不是按日期关联,所以不适合你的场景。

可选:用脚本编辑器实现(进阶)

如果你更倾向于用代码解决,Google Apps Script的思路很清晰:

  1. 读取Scratch工作表的所有训练日,存入数组
  2. 读取Records工作表的日期和姓名,统计每个日期的出勤人数(用对象存储键值对:日期→人数)
  3. 循环遍历全量训练日数组,匹配统计结果,无匹配则设为0
  4. 将最终结果写入目标工作表

示例代码片段(大概逻辑):

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:57:47