アダプティブ カードの [ TaskFetchAction ] ボタンを使用して、Microsoft Teams ボットからダイアログ (TeamsJS v1.x のタスク モジュールと呼ばれます) を呼び出します。 ダイアログでは、ユーザーのポップアップ ウィンドウを開いて、複雑なフォームやマルチステップ ワークフローに最適な対話が提供されます。
ダイアログを呼び出す方法は 2 つあります。
- 新しい呼び出しメッセージ
task/fetch:task/fetchでアダプティブ カードのAction.Executeカード アクションを使用すると、HTML またはアダプティブ カードベースのダイアログがボットから動的にフェッチされます。 - ディープ リンク URL: ダイアログにディープ リンク構文を使用すると、アダプティブ カードの
Action.OpenUrlカードアクションを使用できます。 ディープ リンク URL では、ダイアログ URL またはアダプティブ カード本文は、task/fetchに対するサーバーラウンド トリップを回避するために既に認識されています。
重要
各 url および fallbackUrl は、HTTPS 暗号化プロトコルを実装する必要があります。
注:
Teams クライアント v1 では、ダイアログはタスク モジュールと呼ばれます。 場合によっては、同義語で使用される場合があります。
ダイアログ 起動ツールを作成する
ボットからダイアログを呼び出すには、 TaskFetchAction ボタンを含むアダプティブ カードを送信します。 各ボタンには、ボットが返すダイアログ コンテンツを決定するために使用するデータが含まれています。
警告
Teams、Outlook、Microsoft 365 ドメインの Web バージョンを含む Microsoft のクラウド サービスは、 *.cloud.microsoft ドメインに移行しています。 サポートされている Microsoft 365 Web クライアント ホストでアプリが引き続きレンダリングされるように、できるだけ早く次の手順を実行します。
TeamsJS ライブラリを v.2.19.0 以降に更新します。 新しいドメインで警告が表示されないようにするには、
microsoftTeams.app.initialize()を呼び出す必要があります。 TeamsJS の最新リリースの詳細については、「 Microsoft Teams JavaScript クライアント ライブラリ」を参照してください。アプリの コンテンツ セキュリティ ポリシー (CSP) ヘッダーを定義している場合は、 frame-ancestors ディレクティブを更新して、
*.cloud.microsoftドメインを含めます。 移行中に下位互換性を確保するには、CSP ヘッダーに既存のframe-ancestors値を保持します。 この方法により、既存および将来の Microsoft 365 ホスト アプリケーションの両方でアプリが引き続き動作し、以降の変更の必要性が最小限に抑えられます。
アプリの CSP ヘッダーの frame-ancestors ディレクティブで次のドメインを更新します。
https://*.cloud.microsoft
次の手順では、 task/fetchを使用してダイアログ (TeamsJS v1.x のタスク モジュールと呼ばれます) を呼び出す方法について説明します。
この画像は、購入
Action.Executeカードアクションを持つアダプティブ カードを示しています。typeプロパティの値はtask/fetchであり、残りのdataオブジェクトを選択できます。ボットは、
card.actionアクティビティを受け取ります。 Teams SDK では、OnAdaptiveCardActionハンドラーを使用してこれを処理します。 詳細については、「 アクションの実行」を参照してください。ボットは、
ActionResponseオブジェクトを作成し、それを返します。 応答のスキーマの詳細については、 タスク/送信に関する説明を参照してください。 次のコードは、ラッパー オブジェクトに埋め込まれた TaskInfo オブジェクト を含む応答本文の例を示しています。{ "task": { "type": "continue", "value": { "title": "Task module title", "height": 500, "width": "medium", "url": "https://contoso.com/msteams/taskmodules/newcustomer", "fallbackUrl": "https://contoso.com/msteams/taskmodules/newcustomer" } } }task/fetchイベントとそのボットの応答は、Microsoft Teams JavaScript クライアント ライブラリ (TeamsJS) のmicrosoftTeams.tasks.startTask()関数に似ています。Microsoft Teamsダイアログが表示されます。
次のセクションでは、ダイアログの結果を送信する方法の詳細を説明します。
ダイアログの結果を送信する
ユーザーがダイアログを終了すると、結果がアプリに送信されます。 申請のしくみは、ダイアログ コンテンツ タイプによって異なります。
-
アダプティブ カード (TaskInfo.カード): ユーザーが [
Action.Submit] ボタンを選択すると、Teams によってダイアログ送信イベントがアプリに送信されます。 ダイアログ送信ハンドラーは、カードからフォーム データを受け取ります。 C# で、[TaskSubmit]属性を使用します。 TypeScript で、app.on('dialog.submit', ...)を使用します。 Python では、@app.on_dialog_submitを使用します。 -
Web ページ (TaskInfo.url): Web ページは TeamsJS クライアント ライブラリから
microsoftTeams.tasks.submitTask(formData)を呼び出します。これにより、アプリで同じダイアログ送信イベントがトリガーされます。
ダイアログ送信イベントを処理する
ユーザーがダイアログを送信すると、ボットは task/submit 呼び出しメッセージを受け取ります。 応答する場合は、いくつかのオプションがあります。
| 応答の種類 | シナリオ |
|---|---|
| 応答なし | 最も単純な応答は、まったく応答がないことです。 ボットは、ユーザーがダイアログで終了したときに応答する必要はありません。 |
MessageTask |
Teams では、ダイアログのポップアップ メッセージ ボックスにメッセージが表示されます。 |
ContinueTask |
アダプティブ カードのシーケンスをウィザードまたはマルチステップ エクスペリエンスで連結できます。 |
次のタブは、.NET、TypeScript、Python でダイアログ送信イベントを処理する方法を示しています。
using System.Text.Json;
using Microsoft.Teams.Api.TaskModules;
using Microsoft.Teams.Apps;
using Microsoft.Teams.Apps.Activities.Invokes;
using Microsoft.Teams.Apps.Annotations;
using Microsoft.Teams.Common.Logging;
[TaskSubmit]
public async Task<Microsoft.Teams.Api.TaskModules.Response> OnTaskSubmit([Context] Tasks.SubmitActivity activity, [Context] IContext.Client client, [Context] ILogger log)
{
var data = activity.Value?.Data as JsonElement?;
if (data == null)
{
log.Info("[TASK_SUBMIT] No data found in the activity value");
return new Microsoft.Teams.Api.TaskModules.Response(
new Microsoft.Teams.Api.TaskModules.MessageTask("No data found in the activity value"));
}
var submissionType = data.Value.TryGetProperty("submissiondialogtype", out var submissionTypeObj) && submissionTypeObj.ValueKind == JsonValueKind.String
? submissionTypeObj.ToString()
: null;
string? GetFormValue(string key)
{
if (data.Value.TryGetProperty(key, out var val))
{
if (val is JsonElement element)
return element.GetString();
return val.ToString();
}
return null;
}
switch (submissionType)
{
case "simple_form":
var name = GetFormValue("name") ?? "Unknown";
await client.Send($"Hi {name}, thanks for submitting the form!");
return new Microsoft.Teams.Api.TaskModules.Response(
new Microsoft.Teams.Api.TaskModules.MessageTask("Form was submitted"));
default:
return new Microsoft.Teams.Api.TaskModules.Response(
new Microsoft.Teams.Api.TaskModules.MessageTask("Unknown submission type"));
}
}
複数ステップのダイアログ チェーン
送信ハンドラーから ContinueTask 応答を返すことで、アダプティブ カードを複数ステップ ウィザードに連結できます。 各ステップは新しいカードを返し、最後のステップはダイアログを閉じるMessageTaskを返します。
using System.Text.Json;
using Microsoft.Teams.Api;
using Microsoft.Teams.Api.TaskModules;
using Microsoft.Teams.Cards;
// Add these cases to your OnTaskSubmit method
case "webpage_dialog_step_1":
var nameStep1 = GetFormValue("name") ?? "Unknown";
var nextStepCardJson = $$"""
{
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{
"type": "TextBlock",
"text": "Email",
"size": "Large",
"weight": "Bolder"
},
{
"type": "Input.Text",
"id": "email",
"label": "Email",
"placeholder": "Enter your email",
"isRequired": true
}
],
"actions": [
{
"type": "Action.Submit",
"title": "Submit",
"data": {"submissiondialogtype": "webpage_dialog_step_2", "name": "{{nameStep1}}"}
}
]
}
""";
var nextStepCard = JsonSerializer.Deserialize<AdaptiveCard>(nextStepCardJson)
?? throw new InvalidOperationException("Failed to deserialize next step card");
var nextStepTaskInfo = new TaskInfo
{
Title = $"Thanks {nameStep1} - Get Email",
Card = new Attachment
{
ContentType = new ContentType("application/vnd.microsoft.card.adaptive"),
Content = nextStepCard
}
};
return new Response(new ContinueTask(nextStepTaskInfo));
case "webpage_dialog_step_2":
var nameStep2 = GetFormValue("name") ?? "Unknown";
var emailStep2 = GetFormValue("email") ?? "No email";
await client.Send($"Hi {nameStep2}, thanks for submitting the form! We got that your email is {emailStep2}");
return new Response(new MessageTask("Multi-step form completed successfully"));
Bot Framework カード アクションと Adaptive Card Action.Submit アクション
Bot Framework カード アクションのスキーマは、アダプティブ カードのAction.Submitアクションとは異なり、ダイアログを呼び出す方法も異なります。
Action.Submitの data オブジェクトにはmsteams オブジェクトが含まれているため、カード内の他のプロパティと干渉しません。 次の表は、各カード アクションの例を示しています。
| Bot Framework カード アクション | Adaptive Card Action.Submit アクション |
|---|---|
{ |
{ |
コード サンプル
| サンプルの名前 | 説明 | .NET | Node.js | マニフェスト | Python |
|---|---|---|---|---|---|
| ダイアログ サンプル bots-V4 | このサンプル アプリでは、Bot Framework v4 を使用してダイアログ (TeamsJS v1.x のタスク モジュールと呼ばれます) を使用する方法を示します。 | 表示 | 表示 | 該当なし | 表示 |
関連項目
Platform Docs