如何按机器、班次、周数条件对横向排班表进行工时求和
一、Excel 公式解决方案
先约定通用表格结构(可根据你实际的行列范围修改对应参数):
- 表头行(第1行):A1=姓名、B1=所属班次、C1=操作机器编号,D1:Z1为周数标注(比如D1=40)
- 数据行(第2~100行):D2:Z100区域存储对应人员在对应周的工时数值
方案1:Office 365/2021 动态数组公式(无需按三键触发)
=SUM(FILTER(FILTER(D2:Z100,(B2:B100=目标班次)*(C2:C100=目标机器编号)),D1:Z1=目标周数))
对应你的示例场景(班次为1、机器编号为300、周数为40),公式写法为:=SUM(FILTER(FILTER(D2:Z100,(B2:B100=1)*(C2:C100=300)),D1:Z1=40))
方案2:兼容所有Excel版本的SUMPRODUCT写法
之前计算报错大概率是没有匹配行列双维度的条件,正确写法如下:
=SUMPRODUCT((B2:B100=目标班次)*(C2:C100=目标机器编号)*(D1:Z1=目标周数)*D2:Z100)
对应你的示例场景,公式写法为:=SUMPRODUCT((B2:B100=1)*(C2:C100=300)*(D1:Z1=40)*D2:Z100)
注意:三个布尔条件相乘会自动转为1/0数值,只有同时满足三个条件的工时会被计入求和,不要用全列引用避免多余无效计算。
二、TypeScript 实现方案
下面是可直接运行的通用求和函数,也可以适配Office Script直接操作Excel数据:
// 定义单条排班数据的类型 interface ScheduleItem { 姓名: string; 所属班次: number; 操作机器编号: number | string; // 键为周数,值为对应周的工时 周工时: Record<number, number>; } /** * 按班次、机器编号、周数三个条件求和工时 * @param scheduleList 排班数据数组 * @param targetShift 目标班次 * @param targetMachine 目标机器编号 * @param targetWeek 目标周数 * @returns 符合条件的总工时 */ function calcTotalWorkHours( scheduleList: ScheduleItem[], targetShift: number, targetMachine: number | string, targetWeek: number ): number { return scheduleList.reduce((total, item) => { if ( item.所属班次 === targetShift && item.操作机器编号 === targetMachine && item.周工时[targetWeek] !== undefined ) { return total + item.周工时[targetWeek]; } return total; }, 0); } // 示例调用,对应你的测试场景输出结果为8 const testData: ScheduleItem[] = [ { 姓名: "张三", 所属班次: 1, 操作机器编号: 300, 周工时: {40: 3, 41: 5} }, { 姓名: "李四", 所属班次: 1, 操作机器编号: 300, 周工时: {40: 5, 41: 4} }, { 姓名: "王五", 所属班次: 2, 操作机器编号: 300, 周工时: {40: 6, 41: 2} }, ]; console.log(calcTotalWorkHours(testData, 1, 300, 40));
如果是对接Excel的Office Script,只需把读取到的单元格内容组装为上述
ScheduleItem数组,调用函数即可直接得到结果。
内容的提问来源于stack exchange,提问作者Fawn Shupp
相关产品推荐
相关产品推荐

