如何在Power Query中用公式定义列筛选当日需执行的任务?
如何用Power Query筛选Excel中当日需执行的任务
我有一份Excel源文档,包含任务列表及各工作日任务执行时间列,希望创建新文档整合多源数据,现需筛选出当日需执行的任务。我编写了一段Power Query代码,用dayname返回日期的前三个字母(对应源文档表头),尝试筛选该列非空值,同时提供了示例源数据与周二的预期结果。
原代码如下:
let Source = Excel.Workbook(File.Contents("C:\\document.xlsx"), null, true), Table1_Table = Source{[Item="Table1",Kind="Table"]}[Data], dayname= Text.Start(Date.DayOfWeekName(),3), #"Changed Type" = Table.TransformColumnTypes(Table1_Table,{{"Task", type text}, {"Mon", type any}, {"Tue", type any}, {"Wed", type any}, {"Thu", type any}, {"Fri", type any}, {"Sat", type datetime}, {"Sun", type datetime}}), #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([dayname] <> null)) in #"Filtered Rows"
示例源数据
| task | mon | tue | wed |
|---|---|---|---|
| First | 6 am | 6 am | |
| other | 5 am | 5 am | 5 am |
| xxx | 7 am | 8 am | 9 am |
周二的预期结果
| task | today |
|---|---|
| other | 5 am |
| xxx | 8 am |
原代码存在的问题
- 动态列引用错误:
[dayname]无法正确引用变量dayname对应的列,Power Query中需用Record.Field(_, dayname)来根据变量名获取列值。 - 筛选条件不完整:仅判断
<> null无法排除空文本(Excel空白单元格常为空文本而非null)。 - 类型转换不合理:示例中的时间格式(如"6 am")不是标准datetime类型,设为datetime会导致解析错误。
- 未匹配预期结果结构:原代码未移除多余列,也未将当日列重命名为"today"。
修正后的代码
let Source = Excel.Workbook(File.Contents("C:\\document.xlsx"), null, true), Table1_Table = Source{[Item="Table1",Kind="Table"]}[Data], // 指定英文区域确保星期缩写与表头一致,避免本地化差异 dayname = Text.Start(Date.DayOfWeekName(DateTime.LocalNow(), "en-US"), 3), // 统一将时间列设为文本类型,适配am/pm格式 #"Changed Type" = Table.TransformColumnTypes(Table1_Table,{{"Task", type text}, {"Mon", type text}, {"Tue", type text}, {"Wed", type text}, {"Thu", type text}, {"Fri", type text}, {"Sat", type text}, {"Sun", type text}}), // 同时排除null和空文本,筛选当日有任务的行 #"Filtered Rows" = Table.SelectRows(#"Changed Type", each not (Record.Field(_, dayname) = null or Record.Field(_, dayname) = "")), // 仅保留Task和当日列 #"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows", {"Task", dayname}), // 将当日列重命名为"today",匹配预期结果 #"Renamed Columns" = Table.RenameColumns(#"Removed Other Columns", {{dayname, "today"}}) in #"Renamed Columns"
关键修正说明
- 使用
Record.Field(_, dayname)实现动态列的正确引用。 - 筛选条件同时检查null和空文本,确保所有空白任务都被排除。
- 统一时间列为文本类型,避免格式解析错误。
- 增加移除多余列和重命名步骤,完全匹配预期结果的结构。
- 给
Date.DayOfWeekName指定"en-US"区域,确保星期缩写(如Tue)与表头一致,不受系统语言设置影响。
内容的提问来源于stack exchange,提问作者Brtrnd
相关产品推荐
相关产品推荐

