Google Sheets出勤时长统计:需支持列头日期判断的数组公式
解决方案
公式方案(无需辅助列)
直接使用BYROW结合SUMPRODUCT实现逐行计算,无需额外辅助列。假设学生出勤数据位于A2:Z区域,第一行A1:Z1为日期列头,在结果列(比如AA2)输入以下公式即可自动填充所有行:
=BYROW(A2:Z, LAMBDA(row, SUMPRODUCT( --REGEXMATCH(row, "^$|^T$|.*all.*|.*no.*"), IF(WEEKDAY(A1:Z1)=6, 1.33, 0.53) )))
公式说明:
BYROW(A2:Z, LAMBDA(row, ...)):遍历每一行学生数据,对每行单独计算REGEXMATCH(row, "^$|^T$|.*all.*|.*no.*"):判断单元格值是否为空、等于"T"、包含"all"或"no",返回布尔值--:将布尔值转换为1(符合条件)或0(不符合)IF(WEEKDAY(A1:Z1)=6, 1.33, 0.53):根据列头日期判断是否为周五(WEEKDAY返回6代表周五),返回对应课时SUMPRODUCT:将每行的符合条件标记与对应课时相乘后求和,得到该行总时长
脚本方案(适用于复杂批量处理)
如果需要更灵活的逻辑(比如后续扩展规则),可以使用Google Apps Script实现:
- 打开你的表格,点击「扩展程序」→「Apps 脚本」
- 替换默认代码为以下脚本:
function calculateTotalHours() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const dataRange = sheet.getDataRange(); const values = dataRange.getValues(); const headerDates = values[0].map(date => date instanceof Date ? date : null); const result = []; // 遍历学生行(从第二行开始) for (let i = 1; i < values.length; i++) { const row = values[i]; let totalHours = 0; // 遍历每行的出勤单元格 for (let j = 0; j < row.length; j++) { const cellContent = (row[j]?.toString() || "").trim(); // 判断是否符合统计条件 if (cellContent === "" || cellContent === "T" || cellContent.includes("all") || cellContent.includes("no")) { const date = headerDates[j]; // 判断是否为周五,计算对应课时 const hours = date && Utilities.formatDate(date, Session.getScriptTimeZone(), "u") === "6" ? 1.33 : 0.53; totalHours += hours; } } result.push([totalHours]); } // 将结果写入表格最后一列的下方 sheet.getRange(2, sheet.getLastColumn() + 1, result.length, 1).setValues(result); }
- 点击运行按钮,授权后即可自动计算所有学生的总出勤时长并写入新列
脚本说明:
- 自动识别表格中的日期列头,判断每个出勤单元格对应课时
- 支持批量处理所有行,无需手动填充公式
- 可根据需求修改条件判断或课时数值
内容的提问来源于stack exchange,提问作者Beta
相关产品推荐
相关产品推荐

