在自适应卡片中显示数组中的数据

自适应卡片是一种多功能工具,可用于在 Copilot Studio 中创建交互式且引人入胜的对话,并可用于显示一系列项目。 在本文中,为简单起见,我们在一个新主题中生成该方案,并使用一个硬编码示例。 不过,您可以通过 Power Automate 从更动态的来源获取数据,比如 SharePoint 列表。

使用任务列表初始化变量

在此方案中,您有一个数组中的任务列表,并且您希望在代理中显示这些任务。

  1. 例如,在 Copilot Studio 中创建一个主题,并将其命名为“显示任务”。

  2. 触发器节点上,使用“我的任务”和“显示任务”作为触发短语。

  3. 选择触发器节点下方的添加节点图标 ,选择变量管理,然后选择设置变量值

  4. 选中设置变量下的复选框,然后选择新建

  5. 选择新变量(例如 Var1),显示变量属性面板。

  6. 将变量重命名为有意义的名称,例如 EmployeeTaskList

  7. 目标值字段中粘贴以下 JSON 文字:

    {
        "employeeName": "Alice",
        "employeeID": "E12345",
        "employeeDepartment": "HR",
        "employeeTasks": [
            {
                "taskID": "T001",
                "taskDescription": "Review employee benefits",
                "dueDate": "2025-10-15"
            },
            {
                "taskID": "T002",
                "taskDescription": "Conduct new hire orientation",
                "dueDate": "2025-09-30"
            },
            {
                "taskID": "T003",
                "taskDescription": "Update HR policies",
                "dueDate": "2025-11-05"
            }
        ]
    }
    

将 JSON 文本解析到表中

若要将 JSON 字符串转换为稍后可在自适应卡片中使用的表,必须对其进行分析。

  1. 选择设置变量值节点下方的添加节点图标 ,选择变量管理解析值。 此节点用于解析来自上一个节点的变量。

  2. 对于解析值,选择前一个节点中的变量,在本例中为 EmployeeTaskList

  3. 对于数据类型

    1. 选择来自示例数据,然后选择从示例 JSON 获取架构

    2. 在打开的编辑器中,粘贴相同的 JSON 字符串,然后选择确认。 示例数据将自动生成架构和数据类型。

  4. 对于另存为,选择创建新变量

  5. 选择新变量,并将其重命名为 TaskTable

    “解析值”节点的屏幕截图。

在自适应卡片中显示数据

要在自适应卡片中显示数据,请使用消息节点

  1. 选择添加,并从下拉菜单中选择自适应卡

  2. 选择媒体部分以显示自适应卡属性面板。

  3. 在右侧的自适应卡属性面板中,选择 </> 编辑 JSON下拉菜单并将其更改为公式

  4. 粘贴以下代码。

    {
      type: "AdaptiveCard",
      version: "1.5",
      body: [
        {
          type: "TextBlock",
          text: "Employee Information",
          weight: "bolder",
          size: "large"
        },
        {
          type: "TextBlock",
          text: "Employee Name: " & Topic.TaskTable.employeeName,
          separator: true
        },
        {
          type: "TextBlock",
          text: "Employee ID: " & Topic.TaskTable.employeeID,
          separator: true
        },
        {
          type: "TextBlock",
          text: "Department: " & Topic.TaskTable.employeeDepartment,
          separator: true
        },
        {
          type: "TextBlock",
          text: "Tasks",
          weight: "bolder",
          size: "medium",
          separator: true
        },
        {
          type: "Container",
          items: 
            ForAll(Topic.TaskTable.employeeTasks,
              {
                type: "TextBlock",
                text: "- Task ID: " & taskID & ", Description: " & taskDescription & ", Due Date: " & dueDate ,
                wrap: true
              }
          )
        }
      ]
    }
    

    注意公式是如何通过使用 Topic.TaskTable.employeeName 这样的表达式来引用记录属性的。 还请注意,它使用 Container 元素和 items 属性在自适应卡片上显示数组项。 items 属性接受元素数组作为其值。 使用 'ForAll' 函数在自适应卡片中显示数组中的每个元素。 引用 Topic.TaskTable.employeeTasks 数组允许访问其每个属性。

根据 YAML 代码生成相同的示例方案

如果想快速创建本示例主题,可以创建一个空白主题,打开代码编辑器,然后用以下代码替换默认的 YAML 代码。

kind: AdaptiveDialog
beginDialog:
  kind: OnRecognizedIntent
  id: main
  intent:
    displayName: Untitled
    triggerQueries:
      - array

  actions:
    - kind: SetVariable
      id: setVariable_uFs69M
      variable: Topic.EmployeeTaskList
      value: "{ \"employeeName\": \"Alice\", \"employeeID\": \"E12345\", \"employeeDepartment\": \"HR\", \"employeeTasks\": [ { \"taskID\": \"T001\", \"taskDescription\": \"Review employee benefits\", \"dueDate\": \"2023-10-15\" }, { \"taskID\": \"T002\", \"taskDescription\": \"Conduct new hire orientation\", \"dueDate\": \"2023-09-30\" }, { \"taskID\": \"T003\", \"taskDescription\": \"Update HR policies\", \"dueDate\": \"2023-11-05\" } ] }"

    - kind: ParseValue
      id: 58zKdp
      variable: Topic.TaskTable
      valueType:
        kind: Record
        properties:
          employeeDepartment: String
          employeeID: String
          employeeName: String
          employeeTasks:
            type:
              kind: Table
              properties:
                dueDate: String
                taskDescription: String
                taskID: String

      value: =Topic.EmployeeTaskList

    - kind: SendActivity
      id: sendActivity_oNXY1r
      activity:
        attachments:
          - kind: AdaptiveCardTemplate
            cardContent: |-
              ={
                type: "AdaptiveCard",
                version: "1.5",
                body: [
                  {
                    type: "TextBlock",
                    text: "Employee Information",
                    weight: "bolder",
                    size: "large"
                  },
                  {
                    type: "TextBlock",
                    text: "Employee Name: " & Topic.TaskTable.employeeName,
                    separator: true
                  },
                  {
                    type: "TextBlock",
                    text: "Employee ID: " & Topic.TaskTable.employeeID,
                    separator: true
                  },
                  {
                    type: "TextBlock",
                    text: "Department: " & Topic.TaskTable.employeeDepartment,
                    separator: true
                  },
                  {
                    type: "TextBlock",
                    text: "Tasks",
                    weight: "bolder",
                    size: "medium",
                    separator: true
                  },
                  {
                    type: "Container",
                    items: 
                      ForAll(Topic.TaskTable.employeeTasks,
                        {
                          type: "TextBlock",
                          text: "- Task ID: " & taskID & ", Description: " & taskDescription & ", Due Date: " & dueDate ,
                          wrap: true
                        }
                    )
                  }
                ]
              }