You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Adaptive Card向Microsoft Teams发送李克特量表问题并回收答案?需示例及Bot回调方法

实现Microsoft Teams中基于Adaptive Card的李克特量表问答

一、设计李克特量表的Adaptive Card

李克特量表通常包含一组等级选项(如1-5分、非常不同意到非常同意),可通过Adaptive Card的Input.ChoiceSet组件实现,搭配Action.Submit组件让用户提交答案。

示例Adaptive Card JSON

{
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "type": "AdaptiveCard",
  "version": "1.4",
  "body": [
    {
      "type": "TextBlock",
      "text": "请对本次服务满意度进行评分",
      "size": "Medium",
      "weight": "Bolder"
    },
    {
      "type": "Input.ChoiceSet",
      "id": "satisfactionRating",
      "label": "满意度评分",
      "style": "expanded",
      "choices": [
        {
          "title": "非常不满意",
          "value": "1"
        },
        {
          "title": "不满意",
          "value": "2"
        },
        {
          "title": "一般",
          "value": "3"
        },
        {
          "title": "满意",
          "value": "4"
        },
        {
          "title": "非常满意",
          "value": "5"
        }
      ],
      "isRequired": true,
      "errorMessage": "请选择一个评分"
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "title": "提交",
      "data": {
        "action": "submitRating",
        "questionId": "serviceSatisfaction001"
      }
    }
  ]
}
  • 关键说明:
    • id字段用于标识输入项,后续获取答案时需通过该ID取值
    • choices定义李克特量表的等级选项,value可设置为便于统计的数值或字符串
    • data字段可携带自定义元数据(如问题ID、动作类型),方便机器人区分不同提交请求

二、将卡片发送到Microsoft Teams

通过Bot Framework SDK将Adaptive Card作为附件发送给Teams用户,以下是C#和Node.js的简化实现示例:

C# 示例

var cardJson = File.ReadAllText("path/to/your/card.json");
var adaptiveCard = JsonConvert.DeserializeObject<AdaptiveCard>(cardJson);
var attachment = new Attachment
{
    ContentType = AdaptiveCard.ContentType,
    Content = adaptiveCard
};

var reply = MessageFactory.Attachment(attachment);
await turnContext.SendActivityAsync(reply, cancellationToken);

Node.js 示例

const fs = require('fs');
const cardJson = JSON.parse(fs.readFileSync('path/to/your/card.json', 'utf8'));
const reply = {
    attachments: [
        {
            contentType: 'application/vnd.microsoft.card.adaptive',
            content: cardJson
        }
    ]
};

await context.sendActivity(reply);

三、回收答案并回传给机器人

用户点击「提交」按钮后,Teams会将选择的数据发送给机器人,需在机器人的消息处理逻辑中捕获并解析这些数据。

C# 处理提交的答案

在机器人的OnMessageActivityAsync方法中判断并解析卡片提交数据:

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    if (turnContext.Activity.Value != null)
    {
        var submissionData = JsonConvert.DeserializeObject<Dictionary<string, string>>(turnContext.Activity.Value.ToString());
        
        if (submissionData.TryGetValue("satisfactionRating", out var ratingValue))
        {
            var questionId = submissionData["questionId"];
            // 可在此处添加存储答案、生成统计数据等逻辑
            await turnContext.SendActivityAsync($"感谢你的反馈!你选择的评分是:{ratingValue}", cancellationToken: cancellationToken);
        }
    }
    else
    {
        await turnContext.SendActivityAsync("请通过卡片提交你的评分", cancellationToken: cancellationToken);
    }
}

Node.js 处理提交的答案

在机器人的onMessage回调中处理提交数据:

this.onMessage(async (context, next) => {
    if (context.activity.value) {
        const submissionData = context.activity.value;
        const ratingValue = submissionData.satisfactionRating;
        // 可在此处添加存储答案、生成统计数据等逻辑
        await context.sendActivity(`感谢你的反馈!你选择的评分是:${ratingValue}`);
    } else {
        await context.sendActivity("请通过卡片提交你的评分");
    }
    await next();
});

核心要点

  • 用户提交的数据会包含在turnContext.Activity.Value(C#)或context.activity.value(Node.js)中,结构与卡片中定义的输入项ID和data字段完全对应
  • 自定义data字段可帮助区分不同问卷问题,便于后续数据分类统计和业务逻辑处理

内容的提问来源于stack exchange,提问作者Samthrusha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:30:55