Power Automate Flow - 如何获取列名

问题描述 投票:0回答:1

我有一个 Power Automate Flow,我想在其中查询表数据并将表数据返回给聊天机器人(Power Virtual Agent),包括行数据和列名称。我知道如何访问返回的行数据,但 我还如何获取列标题名称? 我正在连接到 Kusto(Azure 数据资源管理器)以将表格数据返回到我的流程,然后我将返回的值解析为一个字符串,即使用 markdown 格式化,因此可以在聊天机器人上以表格格式显示。这个流程 需要是动态的,这样即使返回了一组不同的列,它也会始终有效。假设我传递了要执行的查询:

let TestTable = datatable(ColumnName1:int, ComumnName2:string) 
[
   1, "some string value"
];
TestTable

然后数据像这样返回给 Flow:

[
  {
    "ColumnName1": 1,
    "ColumnName2": "some string value"
  }
]

当返回数据时,我想我可以通过遍历结果主体或值并使用类似这样的表达式来获取列标题名称:

string(fieldName(variables('index')))

这样我就可以将字段/列标题名称解析为字符串。这样我就可以向用户动态显示包括列标题的行数据,而不仅仅是行数据。

|---------------------------------|
| ColumnName1 |    ColumnName2    |
|---------------------------------|
| 1           | some string value |
|---------------------------------|

我在网上搜索了如何获取这样的列名,但我似乎找不到任何东西。

expression power-automate
1个回答
0
投票

方法 1 - 使用 xpath()/xml() 获取标题

xpath() 单个标题

我已经把它画出来了,因为它允许你单独选择和处理每个标题,而不是普通方法的包罗万象的性质。

所以,如果你使用我在评论中提到的 John Liu 的

xpath()
/
xml()
hack,但将它提炼成一个表达式,你可以使用这个来选择列名:

xpath(xpath(xml(json(concat('{ "root": ', string(variables('arrayVAR')[0]), ' }'))), '/root/*')[0], 'name(/*)')

假设您知道有多少列,您对每一列执行此表达式,每次将最后一个数字加一。但是,我将在一秒钟内编辑我认为会占任意数量列的内容。

但本质上,要获取列名,它会将 json 转换为 XML,然后查询名称值,即字段名称。

这还假设不存在空值,空值通常不包含在 JSON 对象中。因此,您需要确认每次发送的数据都是所有字段,并且即使它们为空,它们也会转换为 JSON。

xpath() 标题数组

使用您提供的数据示例作为基础,并制作更多条目进行测试,我已经确认此 Select 操作将提供所有标题的数组。

假设 arrayVAR 包含数据。

  1. Select 操作的“From”值设置为:

    xpath(xml(json(concat('{ "root": { "columns": ', string(variables('arrayVAR')), ' } }'))), '/root/columns/*')
    
  2. 只设置一个键/值:

    • 'Key' -
      columnName
    • '价值' -
      if(startsWith(string(xpath(item(), 'name(/*)')), '_x003'), if(equals(length(string(xpath(item(), 'name(/*)'))), 7), substring(string(xpath(item(), 'name(/*)')), 5, 1), concat(substring(string(xpath(item(), 'name(/*)')), 5, 1), substring(string(xpath(item(), 'name(/*)')), 7))), string(xpath(item(), 'name(/*)')))

就是这样。一整套标题是你的。

如果/那么的解释

这么长的 if/then 语句的原因是万一你的任何标题都是数字。当数字是 XML 中字段名称的值(我猜是正常值)时,它将它们列为

_x003#_
。另外,如果你是两位数或更多,那么它会把任何东西放在下划线 (
_x003#_#
) 之后的第一个数字之后。

因此,如果您的列标题为“

5
”,则报告的值为“
_x0035_
”。如果您的列标题为“
555
”,则报告的值为“
_x0035_55
”。

这个表达式解决了这个问题。

方法 2 - 肮脏的 HTML 表格技巧

基本上,使用“Create HTML table”操作(它巧妙地从任何具有值的字段中提取所有标题)流程使用以下表达式将该 HTML 的标题行解析为标题数组

表情

split(replace(replace(first(split(body('Create_HTML_table'), variables('headCloseVAR'))), variables('headOpenVAR'), ''), variables('headEndVAR'), ''), variables('headSplitVAR'))

我这样做是使用变量来确定流程将

split()
replace()
,但是,一旦我为变量赎罪,将编辑更长(甚至更脏)的表达式。

变量

  1. headCloseVAR -

    </tr></thead>
    - 定义标题部分的结尾。

    表达式将在此基础上拆分(),并获取该数组中的第一个条目。

  2. headOpenVAR -

    <table><thead><tr><th>
    - 标题部分的开始。

    这是第一次替换,只是被删除了。

  3. headEndVAR -

    </th>
    - 单个标题的结尾。

    这些中的每一个也被删除,因为它们是多余的。

  4. headSplitVAR -

    <th>
    - 单个标题的开始。

    由于流程删除了其中的第一个,如果它拆分其余部分,它将创建一个完美的标题数组。

流量

最小化

您可以使用这个表达式一次性创建一个新数组:

split(replace(replace(first(split(body('Create_HTML_table'), '</tr></thead>')), '<table><thead><tr><th>', ''), '</th>', ''), '<th>')

这行得通,但是在函数字符串中使用符号总是碰碰运气,所以我总是先用字符串变量进行测试。另外,它提供了一种更容易理解逻辑的方法。

© www.soinside.com 2019 - 2024. All rights reserved.