Logic Apps中如何通过HTTP请求体动态定义CSV表结构并获取项值?
Logic App动态定义列映射并生成CSV的解决方案
问题场景
通过Logic App实现从指定SharePoint站点列表获取数据,将内容导出为CSV存入Blob存储;其中站点名称、列表名称、列映射规则均通过HTTP请求体动态传入。请求体结构如下:
{ "listName" : "The list name", "siteAddress" : "SharepointSiteAddress", "columns" : { "Email": " @item()?['Employee']?['Email']", "Region": " @item()?['Region']?['Value']" } }
直接将columns字段传入Select操作的Map时,输出结果中列值为传入的表达式字符串,而非SharePoint列表项的实际值。
核心原因
Logic App会将请求体中的表达式字符串视为纯文本,不会自动解析执行表达式逻辑,因此无法获取到列表项的真实数据。
解决方案
步骤1:解析HTTP请求体
添加Parse JSON操作,输入为HTTP请求的body,使用以下Schema确保columns字段被正确解析:
{ "type": "object", "properties": { "listName": { "type": "string" }, "siteAddress": { "type": "string" }, "columns": { "type": "object", "additionalProperties": { "type": "string" } } } }
步骤2:动态解析表达式并生成映射(二选一)
方法一:消耗型计划专用(使用evaluate()函数)
在获取SharePoint列表项的操作后,添加Select操作:
- From选择SharePoint返回的列表项,表达式为
body('Get_items')?['value'] - 切换Map到文本模式(点击右上角
</>图标),输入以下表达式:
@{ let columnMap = body('Parse_JSON')?['columns']; createObject( foreach(keys(columnMap), (colName) => { return { "key": colName, "value": evaluate(replace(columnMap[colName], '@item()', 'item')) } } ) ) }
该表达式会遍历所有传入的列映射,通过evaluate()函数解析表达式字符串,并将@item()替换为Select循环中的当前项item,从而获取真实值。
方法二:全计划通用(使用Liquid模板)
- 添加Compose操作,输入以下内容,将列表项和列映射组合为一个对象:
{ "items": @body('Get_items')?['value'], "columns": @body('Parse_JSON')?['columns'] }
- 添加Transform JSON to JSON操作,选择Liquid模板,模板内容如下:
[ {% for item in items %} { {% for colName, expr in columns %} "{{ colName }}": {{ expr | replace: "@item()", "item" }} {% if forloop.last == false %},{% endif %} {% endfor %} } {% if forloop.last == false %},{% endif %} {% endfor %} ]
模板会遍历每个列表项,将表达式中的@item()替换为Liquid变量item,解析后生成包含真实值的对象数组。
步骤3:生成CSV并保存到Blob
将上述步骤的输出(Select或Liquid转换后的结果)传入Create CSV table操作,再将生成的CSV内容传入Create blob操作,指定Blob存储路径完成保存。
内容的提问来源于stack exchange,提问作者panikkos
相关产品推荐
相关产品推荐

