给你一个可以看懂的简单M代码,我加了备注在里面,希望能帮到你,考虑到了重复打卡和漏打卡情况(前提当天至少有一个任何打卡记录),你可以看附件:
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
更改的类型 = Table.TransformColumnTypes(源,{{"考勤时间", type time}, {"打卡时间", type time}, {"考勤日期", type date}}),
逆透视 = Table.UnpivotOtherColumns(更改的类型, {"姓名", "部门", "考勤日期"}, "属性", "值"),
已添加自定义1 = Table.AddColumn(逆透视, "早晚", each if [值]<#time(8,1,0) then "早" else if [值]>#time(16,50,0) then "晚" else "非常规"),
//以上为区分早晚打卡,举例如果上班没打卡,下班打了两次卡,如果不区分,系统很有可能会认为晚上第一次打卡为上班打卡
解决重复打卡 = Table.Distinct(已添加自定义1, {"姓名","部门", "考勤日期","属性","早晚"}),
//以上为解决重复打卡问题
合并 = Table.AddColumn(解决重复打卡 , "合并", each [属性]&[早晚]),
删除的其他列 = Table.SelectColumns(合并,{"姓名", "部门", "考勤日期", "值", "合并"}),
已透视列 = Table.Pivot(删除的其他列, List.Distinct(删除的其他列[合并]), "合并", "值"),
//主代码已经结束,下面是辅助信息,但是你有了打卡早和考勤早,再要打卡和考勤时间,感觉多余了
复制的列 = Table.DuplicateColumn(已透视列, "考勤时间早", "考勤时间早 - 复制"),
复制的列1 = Table.DuplicateColumn(复制的列, "打卡时间早", "打卡时间早 - 复制"),
重命名的列 = Table.RenameColumns(复制的列1,{{"考勤时间早 - 复制", "考勤时间"}, {"打卡时间早 - 复制", "打卡时间"}}),
重排序的列 = Table.ReorderColumns(重命名的列,{"姓名", "部门", "考勤日期", "考勤时间", "打卡时间", "考勤时间早", "打卡时间早", "考勤时间晚", "打卡时间晚"})
in
重排序的列
|