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

Power Query参数化设置月首日星期时Expression.Evaluate报错如何解决

Power Query 星期文本转枚举值报错解决方案

问题描述

在Power Query中需要参数化设置每月首日对应的星期值,参数来自Excel或其他源文件的星期文本,最初尝试使用Expression.Evaluate拼接"Day."+星期文本的方式获取对应枚举数值,代码如下:

let
    txtFirstDayOfMonth = "Monday", // 该参数来自Excel/源文件
    numFirstDayOfMonth = Expression.Evaluate("Day."&txtFirstDayOfMonth)        
in
    numFirstDayOfMonth

预期输出是Day.Monday对应的数值1,实际运行抛出如下错误:

Expression.Error: [1,1-1,11] The name 'Day.Monday' doesn't exist in the current context.
    Details:
    [List]

需求是避免使用类似switch的分支语句实现该功能。

解决方案

方案1:动态解析实现(无需分支)

Expression.Evaluate默认无法识别全局枚举类的成员,只需要给函数补充第二参数#shared即可,#shared包含了当前环境下所有全局标识符的记录,可以正常识别Day枚举的相关成员,修改后的核心代码如下:

Expression.Evaluate("Day."&txtFirstDayOfMonth,#shared)

完整可运行代码:

let
    txtFirstDayOfMonth = "Monday", // 该参数来自Excel/源文件
    numFirstDayOfMonth = Expression.Evaluate("Day."&txtFirstDayOfMonth,#shared)        
in
    numFirstDayOfMonth

运行后即可得到预期输出1。

方案2:多分支匹配实现(稳定性更高)

如果更看重代码运行稳定性,避免动态解析可能带来的异常,也可以用else if分支实现匹配,该写法支持大小写不敏感、缩写匹配,适配不规范的星期文本输入,参考代码如下:

...
#"Added Conditional numFirstDayOfWeek" = Table.AddColumn
(#"Added Custom", "numFirstDayOfWeek", each 
     if Text.Contains(Text.Lower([FirstDayOfWeek]), "su") then 0 
else if Text.Contains(Text.Lower([FirstDayOfWeek]), "mo") then 1 
else if Text.Contains(Text.Lower([FirstDayOfWeek]), "tu") then 2 
else if Text.Contains(Text.Lower([FirstDayOfWeek]), "we") then 3 
else if Text.Contains(Text.Lower([FirstDayOfWeek]), "th") then 4 
else if Text.Contains(Text.Lower([FirstDayOfWeek]), "fr") then 5 
else if Text.Contains(Text.Lower([FirstDayOfWeek]), "sa") then 6 
else 1
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:45:01