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

Power Query员工任务排期重叠问题处理求助

问题解决:Power Query标记员工任务重叠状态

问题场景

现有员工任务排期表,员工工作时段为7:00-15:00,部分员工存在任务重叠情况(如员工123456的三个任务:7:00-11:00 Break、10:00-13:00 Job Order、12:00-15:00 Waiting,中间任务与前后任务均重叠)。需添加Flag列,标记任务为Overlap(重叠)或Not Overlap(非重叠),原代码执行时出现错误:

Expression.Error: We cannot convert the value null to type Logical. Details: Value= Type=[Type]

错误原因分析

原代码存在两个核心问题:

  1. 变量作用域冲突:Table.SelectRows中使用[Index]<=[Index]-1时,内部的[Index]指向当前行的索引,导致筛选结果为空,List.Min/List.Max返回null,无法转换为逻辑值触发错误。
  2. 重叠判断逻辑不准确:原条件未能正确识别任务与前后任务的重叠关系,无法覆盖任务同时与前后任务重叠的场景。

正确解决方案

核心思路:按员工ID分组,在组内处理任务重叠判断(重叠仅发生在同一员工的任务之间),步骤如下:

  1. 按Employee ID分组,保留组内所有任务数据
  2. 组内按Task Start升序排序
  3. 添加自定义列,判断当前任务是否与上一个任务或下一个任务重叠
  4. 展开分组数据,得到最终结果

完整Power Query M代码

let
    Source = 你的数据源, // 替换为实际数据源
    // 按员工ID分组,保留组内任务表
    #"Grouped by Employee" = Table.Group(Source, {"Employee ID"}, {{"Tasks", each _, type table [Employee ID=text, Tasks=text, Task Start=datetime, Task End=datetime]}}),
    // 对每个员工的任务表进行处理:排序+标记重叠
    #"Added Overlap Flag" = Table.AddColumn(#"Grouped by Employee", "Flagged Tasks", each 
        let
            // 组内按任务开始时间升序排序
            SortedTasks = Table.Sort([Tasks], {{"Task Start", Order.Ascending}}),
            // 获取任务数量
            TaskCount = Table.RowCount(SortedTasks),
            // 添加索引列,方便定位前后任务
            AddedIndex = Table.AddIndexColumn(SortedTasks, "RowIndex", 0, 1),
            // 添加Flag列
            AddedFlag = Table.AddColumn(AddedIndex, "Flag", each 
                let
                    CurrentStart = [Task Start],
                    CurrentEnd = [Task End],
                    // 判断是否与上一个任务重叠
                    OverlapWithPrev = if [RowIndex] > 0 then CurrentStart < AddedIndex{[RowIndex]-1}[Task End] else false,
                    // 判断是否与下一个任务重叠
                    OverlapWithNext = if [RowIndex] < TaskCount - 1 then CurrentEnd > AddedIndex{[RowIndex]+1}[Task Start] else false
                in
                    // 只要与前或后任务重叠,标记为Overlap,否则为Not Overlap
                    if OverlapWithPrev or OverlapWithNext then "Overlap" else "Not Overlap"
            ),
            // 移除临时索引列
            RemovedIndex = Table.RemoveColumns(AddedFlag, {"RowIndex"})
        in
            RemovedIndex
    ),
    // 展开标记后的任务表
    #"Expanded Flagged Tasks" = Table.ExpandTableColumn(#"Added Overlap Flag", "Flagged Tasks", {"Tasks", "Task Start", "Task End", "Flag"}, {"Tasks", "Task Start", "Task End", "Flag"}),
    // 整理列顺序(可选,按需求调整)
    #"Reordered Columns" = Table.ReorderColumns(#"Expanded Flagged Tasks", {"Employee ID", "Tasks", "Task Start", "Task End", "Flag"})
in
    #"Reordered Columns"

结果验证

执行上述代码后,将得到符合需求的输出:

Employee IDTasksTask StartTask EndFlag
123456Break2/12/23 7:00 AM2/12/23 11:00 AMNot Overlap
123456Job Order2/12/23 10:00 AM2/12/23 1:00 PMOverlap
123456Waiting2/12/23 12:00 PM2/12/23 3:00 PMNot Overlap
123654Job Order2/12/23 7:00 AM2/12/23 3:00 PMNot Overlap

内容的提问来源于stack exchange,提问作者Ahmed_Abdelkader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:15:24