🌀

Power Automate メールが届いたときにTeamsに投稿

2023/12/08に公開

特定のメールが届いた時にTeamsで通知を受け取りたい

メールが届いたときにTeamsのチャネルに転送して投稿したいとき、用意されているテンプレートを使用して簡単にフローを作成することができます。

ついでに、本文のプレビューではなく、確認したい項目を取り出して投稿し、メールを開かなくても内容を把握できるようにカスタマイズしたいと思います。


以下のテンプレートを使用します

電子メールをチャネルに転送する
特定のアドレス宛ての新しいメールをチャネルに投稿します。

テンプレート

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

そのまま

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

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】○○○○

みたいになるように作りこんでいきます。

最終的にこうなります。

全体図

全体図


手順

編集画面から

  1. トリガーの[新しいメールが届いたとき]のアクションは、転送したいメールの内容に合わせて適当に設定します
    When a new email arrives (V3)

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

変数

変数を初期化する
プロパティ 必須 価値 説明設定
名前 イエス <variable-name> 初期化する変数名
タイプ 有効 <variable-type> 変数のデータ型
無効 <start-value> 変数の初期値

https://learn.microsoft.com/ja-jp/power-automate/create-variable-store-values?tabs=classic-designer#initialize-a-variable

アクションを追加するには

追加したい箇所の ⊕ マークをクリックして、アクションの追加を選ぶと追加できます。

アクションの追加

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

Variable

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

変数を初期化する

  1. if文を追加して、メールの本文の形式によって処理を分岐します
条件分岐を追加するには

⊕ マークをクリックして→並列分岐の追加・アクションの追加(どちらを選んでも同じです。)

並列分岐の追加

組み込み→Control→使いたいアクションを選びます。

今回は、条件です。

条件

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

if文

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

表示数を増やす

HTMLです

  1. HTMLだったら、HTMLをテキストに変換します

Trueの中にアクションを追加します。
コンテンツに、最初に取得したメッセージの本文を入れます。

HTMLからテキスト

HTMLからテキストに変換するアクションを追加するには

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

Content Conversion→HTMLからテキスト

  1. 変換されたテキストを変数に代入します

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

本文 = プレーンテキストコンテンツ

変数の設定

変数の設定を追加するには

組み込み→Variable→変数の設定

変数の設定

ここまでが、HTMLだった場合の処理で、次が、テキストだった場合の処理になります。

6.テキストだったら、そのまま変数に代入します

Falseの中にアクションを追加します。

Htmlからテキスト

ここでif文の分岐を抜けて共通のフローに戻ります。

[部分文字列]アクションを追加します。

部分文字列を追加するには

組み込み→Text Functions→部分文字列

Text Functions

部分文字列

  1. 取り出したい項目を特定します

本文は、変数をそのまま使用します。
開始位置・長さは、fxから関数を挿入します。

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`.

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#nthIndexOf

長さを求めるには、sub関数を使用します。

sub関数について

sub

1 番目の数値から 2 番目の数値を減算して、結果を返します。

sub(<minuend>, <subtrahend>)

パラメーター 必須 Type 説明
<minuend> はい 整数または浮動小数点数 subtrahend を引く数値
<subtrahend> はい 整数または浮動小数点数 minuend から引く数値
戻り値 Type 説明
<result> 整数または浮動小数点数 1 番目の数値から 2 番目の数値を減算した結果
使用例
sub(10.3, .3) // Returns `10`.

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#sub

例)こんな風になっている文字列から【項目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))

ここに入力します。

ここに入力する

  1. 変数に抽出した文字を代入

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

まとめる

  1. 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
        }
    ]
}
  1. 保存してテストします。

  2. テストする際に、初回は手動でメールを送信する必要がありますが、
    2回目以降は、「自動→最近使用したトリガーで。」を使うと、
    メール送信が不要になってテストが楽になります。

テスト→自動

おしまい。


あとがき

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

Discussion