Expression.Evaluate 是如何运作的?

How Expression.Evaluate works?

如何在 Power Query 中参数化月份的第一天?

这样试过(Expression.Evaluate + Day.Monday),但是报错:

let
    txtFirstDayOfMonth = "Monday", // this parameter comes from Excel/Source file
    numFirstDayOfMonth = Expression.Evaluate("Day."&txtFirstDayOfMonth)        
in
    numFirstDayOfMonth

预计产量:

numFirstDayOfMonth =  1   // numFirstDayOfMonth = Day.Monday

实际输出:

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

P.S。想要避免使用 switch 语句进行黑客攻击。

答案(摘要)

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

然而,正如 Jeroen Mostert 在评论中提到的那样,可能最好使用 switchelse if 构造来达到这个目的(只要有power 查询中没有 switch 语句)。类似于:

...
#"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
)

您关于每月第一天的命名法让我感到困惑,但是要 return 您对 Expression.Evaluate 的预期值,您需要定义环境。如上所写,Expression.Evaluate 看不懂Day.。所以我们使用 #shared 关键字添加全局环境的记录(其中包括@JeroenMostert 引用的记录字段,但添加到函数中似乎更简单)。

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

将 return txtFirstDayOfMonth 的工作日编号,其中这是工作日名称。

有许多博客更详细地介绍了环境变量。请参阅 Chris Webb 的 this 以获得更多启发。

但是,如果我这样做,我可能只是制作一个 List 工作日并使用 List.PositionOf 函数来 return 数字。并添加一些代码以避免拼写错误、大写等问题——也许只看前三个字母。