Power Query多列批量应用自定义计算函数问题排查
问题分析与解决方案
你的代码核心问题出在参数传递错误和转换逻辑格式不符要求,具体如下:
- 调用
ApplyCalculation时用了_[Column1],这是无效引用,应该取当前要处理的数值列对应的值 Record.TransformFields的参数格式错误,它需要的是{字段名, 转换函数}的列表结构,而非[Name=..., Value=...]的格式- 最终只生成了嵌套的计算列,没有展开为可见的独立列,导致看起来计算未生效
修正后的完整代码
let // 定义计算函数(原逻辑无需修改) ApplyCalculation = (value, Percentage1, Percentage2) => if value > 1 then ((value - 1) * Percentage1) + 1 else 1 - ((1 - value) * Percentage2), Source = #"Rates Table", #"Merged Queries" = Table.NestedJoin(Source, {"MONTH"}, #"Contract Details", {"Month"}, "Contract Details", JoinKind.Inner), #"Expanded Contract Details" = Table.ExpandTableColumn(#"Merged Queries", "Contract Details", {"Percentage 1", "Percentage 2"}, {"Percentage 1", "Percentage 2"}), #"Reordered Columns" = Table.ReorderColumns(#"Expanded Contract Details",{"DNO", "MONTH", "DATE", "Percentage 1", "Percentage 2", "1", "2", "3"}), // 批量生成计算列的核心逻辑 // 1. 定义要处理的数值列名列表(示例为"1"到"3",实际改为"1"到"50"即可) ValueColumns = List.Transform({1..3}, each Text.From(_)), // 2. 对每行应用计算,生成包含所有计算后字段的记录 AddCalculatedRecords = Table.AddColumn(#"Reordered Columns", "Calculated", each Record.TransformFields( _, List.Transform(ValueColumns, (colName) => {colName & "_Calculated", (currentValue) => ApplyCalculation(_[colName], [Percentage 1], [Percentage 2])} ) ) ), // 3. 展开所有计算后的列,使其成为独立可见列 ExpandedCalculated = Table.ExpandRecordColumn(AddCalculatedRecords, "Calculated", List.Transform(ValueColumns, each _ & "_Calculated")) in ExpandedCalculated
关键修正点说明
- 参数传递修正:用
_[colName]获取当前行对应数值列的值,替代原错误的_[Column1] - Record.TransformFields格式修正:每个转换项改为
{新字段名, 转换函数}的格式,确保计算函数能正确接收参数 - 展开计算列:新增
Table.ExpandRecordColumn步骤,将嵌套在"Calculated"列中的计算结果展开为独立列,直接呈现生效后的数值
如果要处理50列,仅需把代码中的{1..3}修改为{1..50}即可,无需调整其他逻辑。
内容的提问来源于stack exchange,提问作者Benedict Landauer
相关产品推荐
相关产品推荐

