FyneDeskの通知をMicrosoft Teamsに送信する
チケットが作成、コメント、またはステータス変更されるたびに、Teamsチャンネルにメッセージを受け取りましょう。FyneDeskがイベントをWebhookに送信し、短いPower AutomateフローがそれをTeamsのメッセージに変換します。以下のステップを順番に進めてください。約10分で完了します。
仕組み
FyneDeskは、各イベント(新しいチケット、新しいコメントなど)を小さなJSONデータパケットとして、指定したURLに送信します。Microsoft Teamsはそのパケットをそれ自体で表示することはありません。Power Automateフローがデータを受け取り、メッセージとして投稿する必要があります。
これが、テストで「正常に送信されました」と表示されるのにTeamsには何も表示されない理由です。Power Automateはリクエストを受け取った瞬間に202 Acceptedと返すため、「成功」はMicrosoftがデータを受信したことを意味するだけです。メッセージが投稿されたかどうかについては何も示しません。パート3で投稿ステップを追加すると、メッセージが表示されます。
始める前に
- 通知を表示したいMicrosoft Teamsのチームとチャンネル、そしてTeamsに投稿できるライセンスを持つPower Automateアカウント。
- FyneDeskのWebhookへの管理者アクセス(管理者設定 → 詳細設定 → Webhook。設定 → 接続 → Webhookからもアクセスできます)。
- 約10分。既製のテンプレートからフローを構築し、そのURLをFyneDeskに貼り付け、メッセージを投稿するステップを1つ追加します。
設定する
これは、私たちのチームが端から端まで使っているとおりの手順です。シンプルで読みやすいテキストメッセージが生成されます。(メッセージに各イベントタイプの名前を付けたい、または書式付きのカードがよいですか? 下記の高度なオプションをご覧ください。)
パート1 — テンプレートからフローを作成する
make.powerautomate.comにアクセスしてサインインします。左メニューでTemplatesを選び、検索ボックスにwebhookと入力し、Send webhook alerts to a channelを開きます。プレーンなもので、「(TEST)」バージョンではありません。Continueをクリックします(求められたら再度サインインします)。
テンプレートは、Teams → Microsoft Teamsを接続し、Webhook URLを生成することを示します。Createをクリックする前に、通知を投稿したいTeamとChannelを設定してください。これは見落としやすく、重要です。
TeamとChannelを選び、Createをクリックします。フローが開いたら、Editをクリックして編集を開始します。
パート2 — URLをFyneDeskに渡す
フローで、最初のボックス「When a Teams webhook request is received」をクリックし、表示されるHTTP URLをコピーします。
次に、FyneDeskで管理者設定 → 詳細設定 → Webhookに移動し、Webhookを追加をクリックします:
- 後で識別できる名前を付けます(例: Microsoft Teams)。
- Power AutomateのURLをエンドポイントURLに貼り付けます(HTTPSリンクである必要があります)。
ticket.createdのチェックを入れたままにします。始めるにはこれだけで十分です。(後でイベントを追加できます。)- 保存をクリックします。
パート3 — 何を投稿するかをフローに指定する
これが見落としやすいステップです。そして、これこそがテストで「送信されました」と表示されるのにTeamsには何も表示されない理由です。
1. あらかじめ作られた2つのステップを削除します。 テンプレートはInitialize variableアクション(場合によっては2つ)とAttachments is null条件を追加します。両方を削除します。各ステップの…をクリックし、Deleteを選びます。これらを残しておくと、「AdaptiveCard」エラーがトリガーされます。
2. 投稿アクションを追加します。 トリガーの下の+をクリックし、Post message in a chat or channel(Microsoft Teamsコネクタ)を選びます。ドロップダウンを設定します:
| フィールド | 設定する値 |
|---|---|
| Post as | Flow bot |
| Post in | Channel |
| Team | あなたのチーム |
| Channel | 通知を表示したいチャンネル |
3. メッセージを構築します。 Messageボックス内をクリックし、青いfx(Insert expression)ボタンをクリックし、下記の式をそのまま貼り付け、Addをクリックします。
concat('New ticket ', triggerBody()?['data']?['ticket_number'], ' - ', triggerBody()?['data']?['title'], ' | Status: ', triggerBody()?['data']?['status'], ' | Priority: ', triggerBody()?['data']?['priority'], ' | https://fynedesk.ai/tickets/', string(triggerBody()?['data']?['id']))
4. 保存します。 Save(右上)をクリックします。「Your flow is ready to go.」と表示されるはずです。
- 式は必ずfxボタンで挿入してください。プレーンテキストとして入力したり、
@{ }で囲んだりしないでください。 - 途中でCopilotボックスを使った場合は、保存する前にそのステップのCommentフィールドをクリアしてください。そこに長いメモ(256文字を超えるもの)があると、保存が静かにブロックされます。
パート4 — テスト
FyneDeskで実際のチケットを作成または更新します。数秒以内にTeamsチャンネルにメッセージが表示されます。
pingパケットを送信するため、テストメッセージはまばらに見えます(ほとんどのフィールドが空白です)。これは想定どおりです。本当の確認は、実際のチケットを作成またはコメントして、チャンネルを見ることです。
任意: すべてのイベントにラベルを付ける、またはカードを投稿する
上記の式は常に「New ticket」で始まります。メッセージにイベント名(新しいコメント、ステータス変更など)を付けたい場合や、書式付きのカードがよい場合は、以下のオプションのいずれかを使います。設定は同じで、Message式だけが変わります。
FyneDeskが送信する内容
Webhookは4つのイベントを購読できます。各パケットの形は次のとおりです(値は例です)。
ticket.created
{
"event": "ticket.created",
"timestamp": "2026-05-30T22:19:59",
"organization": { "id": 173, "name": "SafePACS" },
"data": {
"id": 6381,
"ticket_number": "INC004736",
"title": "Printer not working",
"description": "The 3rd floor printer is offline",
"status": "New",
"priority": "Medium",
"ticket_type": "Incident",
"source": "Email",
"created_at": "2026-05-30T22:19:59"
}
}ticket.updatedとticket.status_changedは、上記と同じ形に加えて、updated_at、assigned_to、assigned_team_idを使用します。
ticket.commented — ここではフィールド名がわずかに異なることに注意してください:
{
"event": "ticket.commented",
"timestamp": "2026-05-30T22:19:59",
"organization": { "id": 173, "name": "SafePACS" },
"data": {
"ticket_id": 6381,
"ticket_number": "INC004736",
"ticket_title": "Printer not working",
"ticket_status": "New",
"content": "Any update on this?",
"comment_id": 8809,
"is_internal": false
}
}coalesce(...)を使って、異なるフィールド名の間でフォールバックするため、単一のフローですべてのイベントタイプをカバーできます。これらを使うには、FyneDeskのWebhookで追加のイベントにチェックを入れます(パート2)。
オプションA — より充実したテキストメッセージ
単一の式の代わりに、以下のレイアウトをMessageボックスに入力します。〈プレースホルダー〉でないものはすべて、自分で入力するプレーンテキストです。各〈プレースホルダー〉について、fxボタンをクリックし、表から対応する式を貼り付け、Addをクリックします。
〈eventLabel〉 〈ticketNumber〉
〈title〉
Status: 〈status〉 • Priority: 〈priority〉
〈message〉
Open in FyneDesk: 〈link〉| プレースホルダー | fx式ボックスに貼り付ける内容 |
|---|---|
| 〈eventLabel〉 | if(equals(triggerBody()?['event'],'ticket.created'),'🎫 New ticket',if(equals(triggerBody()?['event'],'ticket.commented'),'💬 New comment',if(equals(triggerBody()?['event'],'ticket.status_changed'),'🔄 Status changed','✏️ Ticket updated'))) |
| 〈ticketNumber〉 | triggerBody()?['data']?['ticket_number'] |
| 〈title〉 | coalesce(triggerBody()?['data']?['title'],triggerBody()?['data']?['ticket_title'],'(no title)') |
| 〈status〉 | coalesce(triggerBody()?['data']?['status'],triggerBody()?['data']?['ticket_status'],'-') |
| 〈priority〉 | coalesce(triggerBody()?['data']?['priority'],'-') |
| 〈message〉 | coalesce(triggerBody()?['data']?['content'],triggerBody()?['data']?['description'],'') |
| 〈link〉 | concat('https://fynedesk.ai/',if(equals(triggerBody()?['data']?['ticket_type'],'Service Request'),'requests/','tickets/'),string(coalesce(triggerBody()?['data']?['id'],triggerBody()?['data']?['ticket_id']))) |
オプションB — 書式付きのカード
カードがよいですか? アクションPost card in a chat or channelを使い、以下をAdaptive Cardフィールドに貼り付けます。同じ式を使うため、同じデータをより整ったレイアウトで表示できます。
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.2",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"text": "@{if(equals(triggerBody()?['event'],'ticket.created'),'🎫 New ticket',if(equals(triggerBody()?['event'],'ticket.commented'),'💬 New comment',if(equals(triggerBody()?['event'],'ticket.status_changed'),'🔄 Status changed','✏️ Ticket updated')))} @{triggerBody()?['data']?['ticket_number']}"
},
{
"type": "TextBlock",
"text": "@{coalesce(triggerBody()?['data']?['title'],triggerBody()?['data']?['ticket_title'],'(no title)')}",
"wrap": true
},
{
"type": "FactSet",
"facts": [
{ "title": "Status", "value": "@{coalesce(triggerBody()?['data']?['status'],triggerBody()?['data']?['ticket_status'],'-')}" },
{ "title": "Priority", "value": "@{coalesce(triggerBody()?['data']?['priority'],'-')}" }
]
},
{
"type": "TextBlock",
"text": "@{coalesce(triggerBody()?['data']?['content'],triggerBody()?['data']?['description'],'')}",
"wrap": true
}
],
"actions": [
{
"type": "Action.OpenUrl",
"title": "Open in FyneDesk",
"url": "@{concat('https://fynedesk.ai/',if(equals(triggerBody()?['data']?['ticket_type'],'Service Request'),'requests/','tickets/'),string(coalesce(triggerBody()?['data']?['id'],triggerBody()?['data']?['ticket_id'])))}"
}
]
}トラブルシューティング
メッセージがまだ表示されない — よくある対処法
「AdaptiveCard」エラーが出る、またはフローは実行されるのに投稿されない。 テンプレートのあらかじめ作られたInitialize variableとAttachments is nullのステップが原因です。両方を削除し(パート3、ステップ1)、代わりに単一のPost message in a chat or channelアクションでメッセージを投稿します。
フローが保存できない。 途中でCopilotを試した場合は、そのステップのCommentフィールドをクリアしてください。256文字を超えるメモは、保存を静かにブロックします。
実際のチケット操作の後もTeamsに何もない。 Power Automateでフローを開き、Run history(28日間のログ)を確認します。各FyneDeskイベントは実行を表示するはずです。実行がまったくない場合は、FyneDeskのWebhookがこのフローのURLに向いていないか、そのイベントを購読していないことを意味します。FyneDeskで再確認してください。実行が「Failed」と表示される場合は、ステップでエラーが発生しています。1つをクリックしてどれかを確認します。通常は、TeamまたはChannelが選択されていない、またはフローの所有者がPower Automateライセンスを持っていないことが原因です。
メッセージは投稿されるが、一部のフィールドが空白。 イベントによって異なるフィールドを持ちます(たとえば、コメントにはpriorityがありません)。高度なオプションのcoalesce(...)式は適切にフォールバックするため、空白はそのイベントにそのフィールドが含まれていなかったことを意味するだけです。
式に赤いエラーが表示される。 一部のトリガータイプは、本文をtriggerBody()ではなくtriggerOutputs()?['body']として公開します。triggerBody()でエラーが出る場合は、入れ替えてください。たとえば、triggerOutputs()?['body']?['data']?['ticket_number']のようにします。
セキュリティについての注記
Power AutomateのURLには秘密の署名(sig=...の部分)が含まれています。URL全体をパスワードのように扱い、共有しないでください。FyneDeskは、フロー内で信頼性を検証したい場合に備えて、すべてのリクエストにX-FyneDesk-Signatureヘッダー(HMAC-SHA256)で署名します。ただしこれは任意であり、メッセージを流すために必須ではありません。
よくある質問
FyneDeskでは「正常に送信されました」と表示されますが、Teamsには何も表示されません。なぜですか?
「正常に送信されました」は、Microsoftがデータを受信したことを意味するだけです。Power Automateはリクエストを受け取った瞬間に202 Acceptedと返します。これはメッセージが投稿されたことを意味しません。Teamsは生のJSONをそれ自体で表示することはありません。フローには、それを書式設定して投稿するPost message in a chat or channelアクションが必要です。
どのPower Automateテンプレートを使うべきですか?
Templatesを開き、webhookを検索し、Send webhook alerts to a channelを選びます。プレーンなもので、「(TEST)」バージョンではありません。これにより、FyneDeskに貼り付けるWebhook URLが生成され、投稿先のTeamとチャンネルを選択できます。
なぜ「AdaptiveCard」エラーが出るのですか、またはなぜフローは投稿されないのですか?
テンプレートには、あらかじめ作られた2つのステップ、Initialize variableアクションとAttachments is null条件が含まれており、これらがAdaptiveCardのエラーを引き起こします。両方を削除し、独自のメッセージ式を持つ単一のPost message in a chat or channelアクションを追加してください。
FyneDeskはPower AutomateなしでTeamsに投稿できますか?
はい。FyneDeskには現在、チケット通知カードをチャンネルに直接投稿するネイティブのMicrosoft Teamsアプリがあり、ProプランとBusinessプランで利用でき、構築するフローは不要です。このページのWebhook + Power Automateの方法は引き続き機能し、書式や振り分けを完全に制御したい場合に役立ちます。
どのチケットイベントをTeamsに送信できますか?
FyneDeskのWebhookは、ticket.created、ticket.updated、ticket.status_changed、ticket.commentedを送信できます。推奨される設定ではticket.createdを使用します。高度な式はこれら4つすべてを自動的に処理するため、1つのフローですべてのイベントをカバーできます。