Attendance Generator - 考勤统计生成器
自动从钉钉打卡记录生成考勤统计Excel
配置
- Telegram接收者ID: 5996697634
功能
- 读取钉钉导出的打卡Excel
- 计算每天工时和加班
- 按模板格式输出Excel
使用方式
1. 获取打卡记录
用户从钉钉导出考勤打卡Excel,发给AI
2. 生成统计
告诉AI:
请生成考勤统计
AI会自动:
- 读取打卡Excel
- 按规则计算
- 生成统计Excel
- 发送到Telegram
3. 输出格式
Excel表格格式:
- 第0行:员工名字(每个名字占3列)
- 后续行:日期 | 考勤 | 加班
| 列 | 内容 |
|---|---|
| A列 | 日期 (2026-02-01) |
| B列 | 考勤 (满8填8,不足填实际) |
| C列 | 加班 (超过8小时的部分) |
技术细节
Excel读取方式
// 必须用cell方式读取原始单元格,不能用JSON方式
function getCell(r, c) {
return ws[XLSX.utils.encode_cell({r:r, c:c})]?.v;
}
列到日期映射
| 列号 | 日期 |
|---|---|
| 6 | 1号 |
| 7 | 2号 |
| ... | ... |
| 33 | 28号 |
工时计算
function parseTimes(t) {
// t 格式: "08:00\n12:00\n13:30\n17:30"
// 第1行:上午上班时间
// 第2行:上午下班时间
// 第3行:下午上班时间
// 最后1行:下午下班时间
const times = t.split('\n').map(x => x.trim()).filter(x => x);
// 上午工时 = 第2行 - 第1行
// 下午工时 = 最后1行 - 第3行
// 总工时 = 上午 + 下午
}
加班判断规则
1. 遍历所有有打卡的天数
2. 统计实际上班天数
3. 前22天(按实际上班顺序):
- 工时 >= 8小时 → 考勤填8,加班=工时-8
- 工时 < 8小时 → 考勤填实际,加班=0
4. 第23天起:
- 全天算加班 → 考勤填实际,加班=实际
特殊情况
- 春节/周末没打卡 → 日期列出来,时间留空
- 连班情况 → 自动计算(下午上班到下班的时间)
输入文件格式
钉钉导出的Excel结构:
- Sheet名:打卡时间
- 第0行:标题(统计日期)
- 第1行:报表生成时间
- 第2行:表头(姓名、考勤组、部门...)
- 第3行:日期行(日、2、3、4...)
- 第4行开始:员工数据
输出示例
| 员工 | 日期 | 考勤 | 加班 |
|---|---|---|---|
| 陈雅婷 | 2026-02-01 | 8 | 0.5 |
| 陈雅婷 | 2026-02-02 | 8 | 1.5 |
| ... | ... | ... | ... |
注意事项
- 读取方式:必须用cell方式
ws[XLSX.utils.encode_cell({r, c})]?.v - 日期映射:列6=1号,列7=2号...列33=28号
- 工时计算:上午(第2行-第1行) + 下午(最后1行-第3行)
- 22天分界:按实际上班天数算,不是固定1-22号
调用示例
# 手动运行
cd ~/.openclaw/workspace-feishu
node << 'EOF'
// 考勤生成脚本
EOF
依赖
- xlsx (npm包)
- Excel文件路径:飞书/Telegram收到的打卡Excel
常见问题
Q: 为什么只有8天数据?
A: 用JSON方式读取丢失了数据,必须用cell方式
Q: 日期对不上?
A: 检查列到日期的映射是否正确
Q: 加班计算不对?
A: 检查工时计算逻辑,特别是连班情况