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

Power BI对接CRM JSON API:提取每行列表多记录字段方案

Power BI对接CRM JSON API:提取userDefinedFields字段并映射到原记录行(含错误处理)

已完成CRM API分页数据获取,但无法将每条记录中userDefinedFields数组的name-value键值对提取为原记录的字段,同时需要处理该列表为空的异常情况。


API响应示例

{
  "items": [
    {
      "id": "RECORD-001",
      "name": "客户A",
      "userDefinedFields": [
        {"name": "客户等级", "value": "VIP"},
        {"name": "跟进频率", "value": "每周"}
      ]
    },
    {
      "id": "RECORD-002",
      "name": "客户B",
      "userDefinedFields": []
    },
    {
      "id": "RECORD-003",
      "name": "客户C",
      "userDefinedFields": [
        {"name": "所属行业", "value": "互联网"}
      ]
    }
  ],
  "nextPageToken": "TOKEN-001"
}

代码迭代过程

版本1:基础分页获取(未处理自定义字段)

仅实现分页拉取数据,userDefinedFields仍为数组格式,无法直接作为字段使用:

let
    BaseUrl = "https://your-crm-api.com/records",
    GetPage = (OptionalToken as nullable text) =>
        let
            Url = if OptionalToken = null then BaseUrl else BaseUrl & "?pageToken=" & OptionalToken,
            Response = Json.Document(Web.Contents(Url)),
            Items = Response[items],
            NextToken = try Response[nextPageToken] otherwise null
        in
            [Items = Items, NextToken = NextToken],
    Pages = List.Generate(
        () => GetPage(null),
        each [NextToken] <> null,
        each GetPage([NextToken]),
        each [Items]
    ),
    CombinedRecords = List.Combine(Pages)
in
    CombinedRecords

版本2:尝试提取自定义字段(无错误处理)

尝试将userDefinedFields转为记录,但未处理空数组场景,会触发报错导致数据集加载失败:

// 在CombinedRecords后追加代码
    ExpandUDF = Table.FromRecords(CombinedRecords),
    ConvertUDF = Table.AddColumn(ExpandUDF, "UDF_Record", each Record.FromList(List.Transform([userDefinedFields], each _[value]), List.Transform([userDefinedFields], each _[name])))
in
    ConvertUDF

版本3:最终可用代码(含错误处理)

通过错误捕获处理空数组,同时统一提取所有自定义字段并展开,保证数据结构一致性:

let
    BaseUrl = "https://your-crm-api.com/records",
    GetPage = (OptionalToken as nullable text) =>
        let
            Url = if OptionalToken = null then BaseUrl else BaseUrl & "?pageToken=" & OptionalToken,
            Response = Json.Document(Web.Contents(Url)),
            Items = Response[items],
            NextToken = try Response[nextPageToken] otherwise null
        in
            [Items = Items, NextToken = NextToken],
    Pages = List.Generate(
        () => GetPage(null),
        each [NextToken] <> null,
        each GetPage([NextToken]),
        each [Items]
    ),
    CombinedRecords = List.Combine(Pages),
    // 转换为表结构
    ConvertToTable = Table.FromRecords(CombinedRecords),
    // 将userDefinedFields转为记录,空数组返回空记录避免报错
    CreateUDFRecord = Table.AddColumn(ConvertToTable, "UDF_Record", 
        each try Record.FromList(
            List.Transform([userDefinedFields], each _[value]),
            List.Transform([userDefinedFields], each _[name])
        ) otherwise Record.Empty),
    // 收集所有出现过的自定义字段名,统一展开
    ExpandUDF = Table.ExpandRecordColumn(CreateUDFRecord, "UDF_Record", 
        List.Distinct(List.Combine(List.Transform(CreateUDFRecord[UDF_Record], Record.FieldNames))),
        List.Distinct(List.Combine(List.Transform(CreateUDFRecord[UDF_Record], Record.FieldNames)))
    ),
    // 清理临时列
    CleanUp = Table.RemoveColumns(ExpandUDF, {"userDefinedFields", "UDF_Record"})
in
    CleanUp

关键处理说明

  • 用try...otherwise Record.Empty捕获空数组场景,避免报错中断加载
  • 通过List.Distinct(List.Combine(...))遍历所有记录的自定义字段名,确保展开时不会遗漏任何字段
  • 展开后缺失字段自动填充null,保证全量数据结构一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:15:09