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 在评论中提到的那样,可能最好使用 switch
或 else 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 数字。并添加一些代码以避免拼写错误、大写等问题——也许只看前三个字母。
如何在 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 在评论中提到的那样,可能最好使用 switch
或 else 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 数字。并添加一些代码以避免拼写错误、大写等问题——也许只看前三个字母。