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

Power Query自定义函数报错:Token ')' expected问题求助

问题解决:Power Query函数报错“Token ')' expected”

错误原因分析

你的代码里最直接的语法错误是let块中的步骤分隔符缺失:在TransformColumn函数定义的结尾(in #"Added Date")之后,没有添加逗号,导致Power Query无法识别后续的TransformedColumns步骤,从而抛出“预期Token ')'”的语法错误。

除此之外,代码还存在两个逻辑问题:

  • TransformColumn函数每次都基于原始Source表处理,会导致每转换一列就生成一个包含所有列的新表,最后用Table.FromColumns合并时会丢失非日期列,且逻辑混乱;
  • 儒略日期转换逻辑有误:Date.From(Text.From(FullYear))无法直接生成有效日期,且计算日历时应该用DayOfYear - 1作为Date.AddDays的参数(因为1月1日是当年第1天,无需额外加天数)。

修正后的代码

TransformDates = (TableName as text, DateColumns as list) =>
let
    // 连接SQL数据库并加载数据
    Source = Sql.Database("Server Hidden", "RepJDE", [Query="SELECT * FROM " & TableName]),
    
    // 定义单列转换逻辑(基于传入的表而非全局Source)
    TransformColumn = (inputTable as table, columnName as text) =>
    let
        // 拆分儒略日期:格式为CYYDDD(C=世纪码,YY=世纪内年份,DDD=年内天数)
        #"Split Column by Position" = Table.SplitColumn(inputTable, columnName, Splitter.SplitTextByPositions({0,1,3,6}), {"CenturyCode", "YearInCentury", "DayOfYear"}),
        #"Changed To Integer" = Table.TransformColumnTypes(#"Split Column by Position",{{"CenturyCode", Int64.Type}, {"YearInCentury", Int64.Type}, {"DayOfYear", Int64.Type}}),
        // 计算完整年份并生成当年1月1日基准日期
        #"Added Base Date" = Table.AddColumn(#"Changed To Integer", "BaseDate", each 
            let
                fullYear = 1900 + [CenturyCode] * 100 + [YearInCentury],
                baseDate = Date.From(DateTime.FromText(Text.From(fullYear) & "-01-01"))
            in
                baseDate),
        // 加上偏移天数得到公历日期(减1是因为1月1日是当年第1天)
        #"Calculated Gregorian Date" = Table.AddColumn(#"Added Base Date", columnName & "_Gregorian", each 
            Date.AddDays([BaseDate], [DayOfYear] - 1)),
        // 清理临时列
        #"Removed Temp Columns" = Table.RemoveColumns(#"Calculated Gregorian Date", {"CenturyCode", "YearInCentury", "DayOfYear", "BaseDate"})
    in
        #"Removed Temp Columns",

    // 遍历日期列,在同一个表上逐步应用转换
    TransformedTable = List.Accumulate(DateColumns, Source, (currentTable, colName) => TransformColumn(currentTable, colName))
in
    TransformedTable

关键修正点说明

  • 修复语法错误:在TransformColumn步骤结尾添加逗号,确保let块步骤分隔符合语法要求;
  • 调整列转换逻辑:将TransformColumn改为接收当前表作为参数,用List.Accumulate遍历日期列,在同一个表上逐步转换,保留所有非日期列;
  • 修正日期转换逻辑:
    • 正确拆分儒略日期(适配CYYDDD格式);
    • 通过DateTime.FromText生成合法的当年1月1日基准日期;
    • 使用DayOfYear - 1计算偏移天数,保证日期转换准确;
    • 添加临时列清理步骤,避免生成冗余数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:22:43