Power Automate メールが届いたときにTeamsに投稿
特定のメールが届いた時にTeamsで通知を受け取りたい
メールが届いたときにTeamsのチャネルに転送して投稿したいとき、用意されているテンプレートを使用して簡単にフローを作成することができます。
ついでに、本文のプレビューではなく、確認したい項目を取り出して投稿し、メールを開かなくても内容を把握できるようにカスタマイズしたいと思います。
以下のテンプレートを使用します
電子メールをチャネルに転送する
特定のアドレス宛ての新しいメールをチャネルに投稿します。

テンプレートのままで投稿されると以下のようなメッセージになります。

Workflows 経由の {フロー所有者の名前} {投稿日時}
メールが届いたよ {あて先}
件名
From: {送信元}
本文のプレビュー
Adaptive Card

{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.2",
"body": [
{
"type": "TextBlock",
"text": "You have a new email from @{triggerOutputs()?['body/toRecipients']}",
"wrap": true,
"size": "ExtraLarge",
"weight": "Bolder"
},
{
"type": "TextBlock",
"text": "@{replace(triggerOutputs()?['body/subject'], '"', '\"')}",
"weight": "Bolder",
"size": "Medium"
},
{
"type": "TextBlock",
"text": "From: @{triggerOutputs()?['body/from']}",
"wrap": true,
"weight": "Lighter",
},
{
"type": "TextBlock",
"text": "@{replace(triggerOutputs()?['body/bodyPreview'],'"', '\"')}",
"isSubtle": true,
"wrap": true
}
]
}
「新しいメールが届いたよ」っていうメッセージとか、送信元のアドレスあたりは必要ないので投稿されるメッセージから消します。こういう風にしたい。

塗りつぶしで分かりにくくなっていますが、
件名
【項目1】○○○○
【項目2】○○○○
【項目3】○○○○
みたいになるように作りこんでいきます。
最終的にこうなります。
全体図

手順
編集画面から
-
トリガーの[新しいメールが届いたとき]のアクションは、転送したいメールの内容に合わせて適当に設定します

-
本文を入れる変数を初期化します

変数を初期化する
| プロパティ | 必須 | 価値 | 説明設定 |
|---|---|---|---|
| 名前 | イエス | <variable-name> | 初期化する変数名 |
| タイプ | 有効 | <variable-type> | 変数のデータ型 |
| 値 | 無効 | <start-value> | 変数の初期値 |
アクションを追加するには
追加したい箇所の ⊕ マークをクリックして、アクションの追加を選ぶと追加できます。

目当てのアクションを探します。候補が沢山あるので、
ランタイムから[組み込み]に☑を入れて絞り込みます。

組み込み→Variable→変数を初期化する

- if文を追加して、メールの本文の形式によって処理を分岐します
条件分岐を追加するには
⊕ マークをクリックして→並列分岐の追加・アクションの追加(どちらを選んでも同じです。)

組み込み→Control→使いたいアクションを選びます。
今回は、条件です。

本文がHTMLだったら、という条件式を作ります。

値を選択するときは、表示数を増やしてスクロールすると出てきます。


- HTMLだったら、HTMLをテキストに変換します
Trueの中にアクションを追加します。
コンテンツに、最初に取得したメッセージの本文を入れます。

HTMLからテキストに変換するアクションを追加するには
検索すると見つけやすい位置に出てきます。ランタイムを標準で絞り込むと一番上に出てきますね。
標準→Content Conversion→Htmlからテキスト

- 変換されたテキストを変数に代入します
テキストに変換したプレーンテキストコンテンツを、変数の本文に入れます。
式で書くとこんな感じ。
本文 = プレーンテキストコンテンツ

変数の設定を追加するには
組み込み→Variable→変数の設定

ここまでが、HTMLだった場合の処理で、次が、テキストだった場合の処理になります。
6.テキストだったら、そのまま変数に代入します
Falseの中にアクションを追加します。

ここでif文の分岐を抜けて共通のフローに戻ります。
[部分文字列]アクションを追加します。
部分文字列を追加するには
組み込み→Text Functions→部分文字列


- 取り出したい項目を特定します
本文は、変数をそのまま使用します。
開始位置・長さは、fxから関数を挿入します。

開始位置を求めるには、nthIndexOf関数を使用します。
nthIndexOf関数について
nthIndexOf
文字列内での部分文字列の n 番目の出現箇所の開始位置またはインデックス値を返します。
nthIndexOf('<text>', '<searchText>', <occurrence>)
| パラメーター | 必須 | Type | 説明 |
|---|---|---|---|
| <text> | はい | String | 検索する部分文字列を含む文字列 |
| <searchText> | はい | String | 検索する部分文字列 |
| <occurrence> | はい | Integer | 検索する部分文字列の "n" 番目の出現箇所を示す数値。 ocurrence が負の場合は、末尾から検索を開始します。 |
| 戻り値 | Type | 説明 |
|---|---|---|
| <index-value> | Integer | 指定された部分文字列の n 番目の出現箇所の開始位置またはインデックス値。 部分文字列が見つからない、または部分文字列の出現回数が n 未満の場合は、-1 を返します。 |
nthIndexOf('123456789123465789', '1', 1) // Returns `0`.
nthIndexOf('123456789123465789', '1', 2) // Returns `9`.
nthIndexOf('123456789123465789', '12', 2) // Returns `9`.
nthIndexOf('123456789123465789', '6', 4) // Returns `-1`.
長さを求めるには、sub関数を使用します。
sub関数について
sub
1 番目の数値から 2 番目の数値を減算して、結果を返します。
sub(<minuend>, <subtrahend>)
| パラメーター | 必須 | Type | 説明 |
|---|---|---|---|
| <minuend> | はい | 整数または浮動小数点数 | subtrahend を引く数値 |
| <subtrahend> | はい | 整数または浮動小数点数 | minuend から引く数値 |
| 戻り値 | Type | 説明 |
|---|---|---|
| <result> | 整数または浮動小数点数 | 1 番目の数値から 2 番目の数値を減算した結果 |
sub(10.3, .3) // Returns `10`.
例)こんな風になっている文字列から【項目3】を取得するには、【項目3】の頭の部分の位置と文字数を求める必要があります。
【項目1】~~~~~
【項目2】~~~~~
【項目3】~~~~~
【項目4】~~~~~
【項目5】~~~~~
開始位置:【項目3】の位置
nthIndexOf(検索対象, 検索文字, "n"番目の出現箇所)
↓
nthIndexOf(variables('本文'),'【項目3】',1)
長さ:次の項目の頭 - 開始位置 = 文字数
【項目4】の頭 - 【項目3】の頭 = 【項目3】全体の文字数
sub(【項目4】,【項目3】)
↓
sub(nthIndexOf(variables('本文'),'【項目4】',1),nthIndexOf(variables('本文'),'【項目3】',1))
ここに入力します。

- 変数に抽出した文字を代入
取り出した文字を、変数の本文にまとめて入れます。
改行してValueに入れると、投稿される内容も改行されて表示されます。

- Adaptive Card
You have a new email from~とかFrom:~は今回は必要ないので消しました。
本文のプレビューが入っている箇所を変数の本文に差し替えて完成です。

{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.2",
"body": [
- {
- "type": "TextBlock",
- "text": "You have a new email from @{triggerOutputs()?['body/toRecipients']}",
- "wrap": true,
- "size": "ExtraLarge",
- "weight": "Bolder"
- },
{
"type": "TextBlock",
"text": "@{replace(triggerOutputs()?['body/subject'], '"', '\"')}",
"weight": "Bolder",
"size": "Medium"
},
- {
- "type": "TextBlock",
- "text": "From: @{triggerOutputs()?['body/from']}",
- "wrap": true,
- "weight": "Lighter",
- },
{
"type": "TextBlock",
- "text": "@{replace(triggerOutputs()?['body/bodyPreview'],'"', '\"')}",
+ "text": "@{variables('本文')}",
"isSubtle": true,
"wrap": true
}
]
}
Adaptive Card

{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.2",
"body": [
{
"type": "TextBlock",
"text": "@{replace(triggerOutputs()?['body/subject'], '"', '\"')}",
"weight": "Bolder",
"size": "Medium"
},
{
"type": "TextBlock",
"text": "@{variables('本文')}",
"isSubtle": true,
"wrap": true
}
]
}
-
保存してテストします。
-
テストする際に、初回は手動でメールを送信する必要がありますが、
2回目以降は、「自動→最近使用したトリガーで。」を使うと、
メール送信が不要になってテストが楽になります。

おしまい。
あとがき
メールの受信をトリガーに自動で実行されるので、一度作ってしまえば後は楽で良いですね。
Discussion