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

Power Query基于列值调用自定义函数新增列失效问题求解

问题原因
  • 你传入固定值的代码可运行,本质是Table.AddColumn的第三参数如果不是函数类型,会直接将该常量值填充到整列。此时MyFunction("B")仅在查询刷新时执行1次,不存在逐行传参的上下文冲突,不能作为逐行计算逻辑的参考。
  • 原逐行写法失效的核心原因有两个:
    • 隐式each语法的作用域混乱:each是Power Query的简化语法糖,默认用_代表当前行记录,嵌套调用MyFunction和Expression.Evaluate时,很容易出现字段引用指向错误,拿不到当前行[ColumnX]的实际值。
    • 计算环境缺失:Expression.Evaluate仅传入#shared全局环境时,如果自定义函数返回的M公式包含当前表的列引用(比如示例中的[Column10] * [Column11]),计算时找不到对应列的上下文,会直接触发报错。
解决方法

直接替换为显式声明行参数的写法即可,该写法明确绑定当前行上下文,可避免作用域识别问题:

= Table.AddColumn(#"Tipo Alterado", "Formula", (currentRow) => 
    let
        // 读取当前行参数,调用自定义函数拿到M公式文本
        formulaText = MyFunction(currentRow[ColumnX]),
        // 合并全局环境与当前行记录作为计算上下文
        runEnv = Record.Combine({#shared, currentRow}),
        // 执行公式计算得到结果
        result = Expression.Evaluate(formulaText, runEnv)
    in
        result
)
补充优化
  • 如果自定义函数返回的M公式不涉及当前表的列引用,仅调用全局查询或返回固定值,可以简化写法,同时强制转换传入参数类型,避免类型不匹配报错:
= Table.AddColumn(#"Tipo Alterado", "Formula", (currentRow) => 
    Expression.Evaluate(MyFunction(Text.From(currentRow[ColumnX])), #shared)
)
  • 如果仍存在偶发计算错误,可以在新增列步骤外层套Table.Buffer(),强制Power Query先加载前序步骤的表数据,避免延迟计算导致的传参异常。

内容的提问来源于stack exchange,提问作者Matheus Assumpção Solinho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:36:26