将MessageCard类型Teams Webhook适配至Power Automate指定工作流
问题背景
微软2024年7月3日宣布弃用Office 365连接器,所有现有连接器将于2024年10月1日停止服务。我们原本通过Teams Webhook发送MessageCard格式的工单通知到Teams频道,切换到Power Automate的「收到Webhook请求时发布到频道」工作流后,触发Send_each_adaptive_card动作报错:
Action 'Send_each_adaptive_card' failed: The execution of template action 'Send_each_adaptive_card' failed: the result of the evaluation of 'foreach' expression '@triggerOutputs()?['body']?['attachments']' is of type 'Null'. The result must be a valid array.
报错核心原因是该工作流默认期望接收包含attachments数组的AdaptiveCard格式请求体,但原MessageCard结构中没有这个字段。尝试修改foreach表达式未成功,现寻求两种方向的解决方案:是否能通过修改schema或调整foreach表达式直接解析MessageCard,还是必须转换请求体格式。
解决方案
方案1:调整foreach表达式兼容MessageCard
无需修改schema,直接修改Send_each_adaptive_card动作的foreach表达式,通过逻辑判断兼容无attachments字段的MessageCard:
将原表达式:
@triggerOutputs()?['body']?['attachments']
替换为:
@if(empty(triggerOutputs()?['body']?['attachments']), createArray(createObject('contentType', 'application/vnd.microsoft.card.adaptive', 'content', triggerOutputs()?['body'])), triggerOutputs()?['body']?['attachments'])
逻辑说明:如果触发输出中的attachments为空,就把传入的MessageCard内容包装成符合工作流要求的AdaptiveCard附件数组;如果已有合法的attachments数组,则直接使用原数据。
方案2:转换请求体为AdaptiveCard格式(长期推荐)
如果希望完全适配Power Automate工作流的默认逻辑,避免后续潜在兼容性问题,建议直接将原MessageCard转换为AdaptiveCard格式。以下是转换后的标准示例:
{ "type": "message", "attachments": [ { "contentType": "application/vnd.microsoft.card.adaptive", "content": { "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.0", "msteams": { "width": "Full" }, "body": [ { "type": "TextBlock", "text": "{Title}", "weight": "bolder", "size": "medium", "wrap": true }, { "type": "TextBlock", "text": "{Body}", "wrap": true } ] } } ] }
只需要将原MessageCard中的标题、正文内容替换到示例中的{Title}和{Body}占位符位置即可。
内容的提问来源于stack exchange,提问作者Mitchell Hein

