【问题标题】:Power Automate Flow - How to get column namesPower Automate Flow - 如何获取列名
【发布时间】:2021-05-11 11:09:44
【问题描述】:

我有一个 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 |
|---------------------------------|

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

【问题讨论】:

  • 您可以使用 John Liu 的 xpath()/xml() hack 来获取列名,但我不确定如何,我可能已经在这里完成了:stackoverflow.com/questions/67295400/…
  • 遗憾的是,没有更强大的“创建 HTML 表”连接器版本,因为它可以生成完美的数据表,无论有多少单独的对象有不同的价值观。我试过这个,它很柔滑:[ { "ELIOT": 1, "ELIOTTA": "a - some string value" }, { "ELIOT": 123, "ELIOTTA": "b - some string value", "ELIOCINA": true }, { "ELIOT": 321, "ELIOTTA": "c - some string value", "Phil": false, "Collins": "oooh baby", "IsOk": 111 } ]
  • 很遗憾,您不能简单地返回一个 HTML 表格以在聊天机器人中显示它

标签: expression power-automate


【解决方案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. 只设置一个键/值:

    • '密钥' - 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 的解释

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> - 定义标题部分的结尾。

    表达式将对此进行 split(),并获取该数组中的第一个条目。

  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>')

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

【讨论】:

  • 难道没有什么方法可以获取json而不必先解析为xml吗?
  • 看起来不是这样,但我想有一天该功能会出现。但是,我制定了一种肮脏的 HTML 方式,我将在其中进行编辑,作为替代方法。
  • 好的,现在已经编辑好了。通过解析 HTML 表格标题实际上很简单:split(replace(replace(first(split(body('Create_HTML_table'), '&lt;/tr&gt;&lt;/thead&gt;')), '&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;', ''), '&lt;/th&gt;', ''), '&lt;th&gt;') 总共需要 3 个步骤。
  • 好的。现在也有完整的 XML 数组。说实话,即使看起来令人生畏的 if/then 嵌套,这绝对是要走的路,因为它不依赖于任何特定的值来计算值。
猜你喜欢
  • 2020-11-24
  • 2022-01-06
  • 2020-07-18
  • 2022-12-16
  • 2020-06-06
  • 2021-09-14
  • 1970-01-01
  • 2023-03-08
  • 2018-07-24
相关资源
最近更新 更多