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

Power Query中'RecursiveExpand'未被识别的原因排查

问题分析与修复方案

报错原因

你遇到的RecursiveExpand未识别错误,根源是函数内部的语法错误导致函数无法正确定义:

  • Table.ColumnsOfType(table, {type list})返回的是列名字符串数组(比如{"fields.comment.comments"}),但代码里错误使用current[Name]去访问不存在的Name属性,这会让函数定义失败,Power Query自然无法识别这个函数名。

修复后的代码

let
    Source = 100,
    JiraIDPerPage = 100,
    GetJson = (maxR, startA) =>
        let 
            Json = Json.Document(
                Web.Contents(
                    #"URI_BASE (2)",
                    [
                    RelativePath = #"URI_PATH (2)" & #"URI_RESOURCE (2)",
                    Content = Json.FromValue(
                        [
                            jql = "project in (" & #"JIRA_PROJECT_KEYS (2)" & ")",
                            fields = {"*all"},
                            maxResults = maxR,
                            startAt = startA
                        ]
                    ),
                    Headers =
                        [
                        Authorization = "Basic " & Binary.ToText(Text.ToBinary(#"USERNAME_TOKEN (2)"), 0),
                        Accept = "application/json",
                        #"Content-Type"="application/json"
                        ]
                    ]
                )
            )
        in  Json,
    GetJiraIDCount = () =>
        let maxResultss  = 0,
            startAtt = 0,
            Json  = GetJson(maxResultss, startAtt),
            Count = Json[#"total"]
        in  Count,
    GetPage = (Index) =>
        let Top   = 100,
            Skip  = Index * 100,
            Json  = GetJson(Top, Skip),
            Value = Json[#"issues"]
        in  Value,
    JiraIDCount = List.Max({ JiraIDPerPage, GetJiraIDCount() }),
    PageCount = Number.RoundUp(JiraIDCount / JiraIDPerPage),
    PageIndices = { 0 .. PageCount - 1 },
    Pages = List.Transform(PageIndices, each GetPage(_)),
    JiraID = List.Union(Pages),
    Table = Table.FromList(JiraID, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(Table, "Column1", {"expand", "id", "self", "key", "fields"}, {"expand", "id", "self", "key", "fields"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Column1",{"expand", "id", "self"}),
    Custom1 = let
    // 递归展开列表列的函数
    RecursiveExpand = (table as table) =>
    let
        // 获取所有列表类型的列名
        listColumns = Table.ColumnsOfType(table, {type list}),
        // 逐个展开列表列
        expandedTable = List.Accumulate(listColumns, table, (state, current) => Table.ExpandListColumn(state, current)),
        // 检查是否还有未展开的列表列
        remainingListColumns = Table.ColumnsOfType(expandedTable, {type list}),
        // 递归调用直到没有列表列
        result = if List.IsEmpty(remainingListColumns) then expandedTable else RecursiveExpand(expandedTable)
    in
        result,
    // 启动递归展开
    expandedTable = RecursiveExpand(#"Removed Columns")
in
    expandedTable
in
    Custom1

关键修正点

  • 将Table.ExpandListColumn(state, current[Name])改为Table.ExpandListColumn(state, current),直接使用Table.ColumnsOfType返回的列名字符串。

可选扩展:同时展开记录列

如果需要完全展开JIRA返回的嵌套记录(比如fields里的子字段),可以修改递归函数,同时处理列表和记录列:

// 扩展版:递归展开所有列表和记录列
RecursiveExpandAll = (table as table) =>
let
    // 获取列表列和记录列
    listColumns = Table.ColumnsOfType(table, {type list}),
    recordColumns = Table.ColumnsOfType(table, {type record}),
    // 先展开所有列表列
    expandedLists = List.Accumulate(listColumns, table, (state, current) => Table.ExpandListColumn(state, current)),
    // 再展开所有记录列(取所有字段)
    expandedRecords = List.Accumulate(recordColumns, expandedLists, (state, current) => 
        let
            cols = Record.FieldNames(Table.FirstValue(state[current]))
        in
            Table.ExpandRecordColumn(state, current, cols, List.Transform(cols, each current & "." & _))),
    // 检查是否还有嵌套的列表或记录列
    remainingLists = Table.ColumnsOfType(expandedRecords, {type list}),
    remainingRecords = Table.ColumnsOfType(expandedRecords, {type record}),
    // 递归调用直到没有嵌套结构
    result = if List.IsEmpty(remainingLists) and List.IsEmpty(remainingRecords) then expandedRecords else RecursiveExpandAll(expandedRecords)
in
    result

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:50:40