ミムチの会社では、メールできた注文確認内容をExcel一覧に転記して管理しているのですが、正直面倒ですぞ。
メールから必要な情報を抽出する作業を、なんとか自動化できませんかな?
OutlookやGmail等で届くメールで、注文確認メールのように決まったフォーマットのメールなら、Power Automateで自動でメール文を抽出して、ExcelやSharePointリストに格納できます!
この記事では、Outlookで受信したメール本文から、特定の文字列を抽出し、SharePointリストに格納、Teams通知する方法を解説します。
- 受信したメール本文の内容を、SharePointリストに格納する全体イメージ
- 特定のメールの受信をトリガーにPower Automateフローを実行する方法
- メール文(テキスト)から特定の文字列を含む値を抽出する方法
YouTube動画で見たいかたは、こちらからどうぞ!
受信したメールをSharePointリストに格納する全体イメージ
PowerAutomateを使って、受信メールをSharePointリストに格納する全体イメージは、以下のようになります。

- OurlookやGmailの受信をトリガーにPower Automateフローを実行
- Power Automateで、メール文から必要な情報を抽出し(②-1)、SharePointリストに登録(②-2)
- SharePointリストに登録した内容を、Teamsで通知
この時のPower Automateフローの全実装は、以下のようになります。

簡単にフローの流れを説明します。
例えば、以下のような注文確認メールを受信したら、それをトリガーにPower Automateフローを自動実行します。
このとき、差出人のメールアドレスや、件名でフィルターをかけてフローを実行することができます。

注文メール等の決まったフォーマットのメール文であれば、Power Automateを使い、中身のデータを抽出することができます。
例えば、受注日付、商品名、数量、税込単価等のデータをそれぞれ抽出し、以下のようにSharePointリストに格納することができます。

SharePointリストに格納すれば、後でPowerBI等でグラフ化して、分析することも簡単です!
SharePointリストの作成方法は、以下の記事を参考にしてください。

その後、Teams等で関係するメンバーに通知をすることもできます。
受注日付や、商品名のデータを取得しているので、Teamsメンバーにも注文の詳細内容を通知したり、例えば金額を100万円以上の場合等、条件を絞って通知することもできます。

全体の流れは分かりましたが、具体的にどうやって、受注日付や、商品名のデータを、PowerAutomateで取得するのですかな?
メール文が改行コードで分割できる場合、改行で分割したデータから必要な部分を取得するだけなので、簡単です!
改行コード等で分割できない場合、決まったフォーマットのテキストから、以下の3つの情報を使い、特定の文字列を取得していきます。
- 取得する値の文字数
- 抽出対象のテキスト
- 取得する値の開始位置
この場合、少しフローが長くなります…
それぞれの方法について、詳細な実装方法を説明していきます。
Outlookで受信したメールをトリガーにPowerAutomateを実行する方法
まずは共通部分として、Outlookメールの受信をトリガーに、Power Automateフローを開始する手順を説明します。
1.トリガーから「Outlook」>「新しいメールが届いたとき(V3)」を選択します。
2.受信するメールを設定し、「件名フィルター」に「ご注文確認メール」と入力します。

件名フィルターや、差出人を設定すると、その条件に当てはまるメールが来たときのみ、フローが実行されるのですな!
これで、Outlookで特定のメールを受信したときをトリガーに、Power Automateフローを実行できます。
メール本文から特定の文字列を抽出し、SharePointリストに登録する方法
Split関数で「改行コード」で区切る方法
Split関数を使い、改行コードで区切ってデータ取得できる場合は、こちらが簡単です。
全体としては、以下のようなフローになります。

1.トリガーは、上記で説明したものと同じ「Outlook」の「新しいメールが届いたとき」を使います(実装済み)。
2.「データ操作」>「作成」アクションを追加し、関数式「fx」で、以下のようなsplit関数式を設定します。

split(triggerOutputs()?['body/bodyPreview'], decodeUriComponent('%0D%0A'))

split関数は、文字列を指定した区切り文字で分割し、アレイ(配列)にすることができます。
ここでは、改行コードでメールの文章を分割しています。
3.一旦フローを保存して、テスト実行してみます。
「作成」アクションの「未加工の出力を表示する」を選択し、関数式で取得されたデータをみてみます。

すると、以下のようにメール文のデータが、改行コードで区切られて、配列データとなっています。
今回はこの内、「受付日付」(要素の3つ目)~「税込単価」(要素の6つ目)までを取得したいです。

4.「SharePoint」>「項目の作成」アクションを追加し、対象のSharePointサイト、リストを選択した後、詳細パラメータで、各列に登録する値を関数(fx)で設定します。

受注日付の場合、以下のように、不要な文字列を削除し、trim関数で空白を削除すればOKです。
trim(replace(outputs('作成:Split関数で改行コードで区切る')
,'受注日付:',''))

他の列も、同様に関数式(fx)を設定していきます。
※実際に取得できた文字列によって、[N]や、replace(値の置換)の設定は変更します
trim(replace(outputs('作成:Split関数で改行コードで区切る')
,'商品名:',''))
int(trim(replace(replace(replace(outputs('作成:Split関数で改行コードで区切る')[6],'税込単価:',''),',',''),'円','')))
int(trim(replace(outputs('作成:Split関数で改行コードで区切る')[5],'数量:','')))
5.フローを実行すると、以下のように、SharePointリストにデータが保存されています。

特定の文字列を検索して区切る方法
上記のように、split関数を使って、改行コード等、特定の文字列で分割できない場合は、以下の方法で必要な箇所を抽出します。
1.メールの本文等は、HTML形式になっており、このまま扱うとHTMLタグが入ってしまいます(<div>等)。
そのため、「Htmlからテキスト」アクションを選択し、コンテンツには動的コンテンツで、「新しいメールが届いたとき(V3)の本文」を入れます。

例として、以下のようなメール本文から、受注日付の値「2022/10/25」を取得する方法を解説します。

(1)決まったフォーマットの開始位置を検索
はじめに、決まったフォーマットとなる「受注日付:」の開始位置を検索します。

1.「テキストの位置の検索」アクションを選択し、以下の設定をします。
- テキスト:「Htmlからテキスト」で取得した本文
- 検索テキスト:受注日付:
2.同様に「商品名:」の開始位置も検索します。
※受注日付の値を取得する場合、「受注日付:」と「商品名:」の開始位置が必要です

3.そのほかの項目の値も取得したい場合、以下のようにアクションを追加します。

(2)取得する値の開始位置を設定
次に受注日付の値「2022/10/25」の開始位置を設定します。

1.「変数を初期化する」アクションを追加し、以下のように設定します。
- 名前:任意の名前(Textposition_date等)
- 種類:整数
- 値:以下の関数式を設定
- add(<受注日付の開始位置>, 5)
※<受注日付の開始位置>は、①で設定した「テキストの位置の検索」の結果を、動的コンテンツで選択します。

むむ・・・これは何をしているのですかな?
テキストの位置の検索」で検索された位置は「受注日付:」の「受」の位置になります。
add関数を使って、実際に取得したい値「2022/10/25」の「2」の位置を設定しています。
なるほど!
「受注日付:」と5文字あるから、5を足した値が、「2022/10/25」の開始位置になるのですな!
2.同様に、他の値の開始位置を取得する場合は、以下のように設定していきます。

(3)取得する値の文字列の長さを設定
次に「受注日付」の取得する値「2022/10/25」の文字列の長さを特定します。

1.「変数を初期化する」アクションを追加し、以下のように設定します。
- 名前:任意の名前(Textlen_date等)
- 種類:整数
- 値:以下の関数式を設定
- sub(<商品名の開始位置>, <受注日付の値の開始位置>)
※<商品名の開始位置>は①で設定した「テキストの位置の検索」の結果を、動的コンテンツで選択します。
※<受注日付の値の開始位置>は②で設定した「変数を初期化する」の変数を、動的コンテンツで選択します。

難しいですぞ・・・これはどういうことですかな?
「2022/10/25」の文字列の長さを、①の「商品名:」の開始位置から、②の「2022/10/25」の開始位置を引くことで、算出しています。
なるほどですぞ!
「受注日付」の値が必要なら、その値が終わった次の「商品名:」の開始位置も必要ということですな!
2.同様に、他の値の文字列の長さを取得する場合は、以下のように設定していきます。

(4)取得する値を設定
次に、取得する値を取得します。
1.「部分文字列」アクションを追加し、以下のように設定します。
- テキスト:「Htmlからテキスト」の結果
- 開始位置:②で設定した「取得する値の開始位置」を選択
- 長さ:③で設定した「取得する値の文字列の長さ」を選択

2.同様に、他の値の部分文字列も取得します。
(5)SharePointリストの各列に、取得した値のデータを追加
最後に、SharePointリストの各列に取得した値を設定し、レコードを追加します。
1.「SharePoint>項目の作成」アクションを追加し、以下のように設定します。
- サイトのアドレス:SharePointサイトをドロップダウンで選択
- リスト名:SharePointリストをドロップダウンで選択
- 各列:④で取得した「部分文字列」を各列に設定

これで、受信メールの本文から文字列を取得し、SharePointリストに登録することができました。
SharePointリストに登録した内容を、Teamsで通知する方法
さらに、Teamsで通知をします。
1.「Teams>チャットまたはチャネルでメッセージを投稿する」アクションを追加し、以下のように設定します。

特定の人にメンションしたい場合、コードをクリックして以下のように入力します。

これで、Power Automateでの実装は完了です。
最後に
この記事では、Outlookで受信した決まったフォーマットのメールから、特定の文字列を抽出し、SharePoitnリストに格納、Teams通知をする方法を紹介しました。
注文メール等の決まったフォーマットのメールであれば、受注日付、商品名等メール本文の必要なデータを取得し、SharePointリストに自動で追加することが可能です。
split関数で改行コードで、分割できる場合は、分割してから必要なデータを取得しましょう。
特定の文字列を抽出するには、以下の3つの情報が必要です。
- 抽出対象のテキスト
- 取得する値の開始位置
- 取得する値の文字数
抽出したデータは、SharePointリストに登録したり、Teamsで通知したりすることができます。
SharePointリストに登録しておけば、後からPower BIでレポート化し、分析することも簡単なので、是非試してみてください!
