- MS365tips
- PowerAutomate
- お客様事例
PowerAutomate事例:メールの本文を抽出してエクセルに転記
PowerAutomateでメールをエクセルに転記させたいものの、やり方がわからず困っていないでしょうか。
この記事では、実際のお客様事例から、設定方法を解説します。
単にメール本文を転記するだけでなく、
- メール本文内に複数件の情報が入っている場合に、行を分けて転記する方法
- 「契約番号」「お客様名」などの要素ごとにエクセルに転記する方法
が分かります。
ご参考ください。
—この記事の監修者—
ヒョウノモトハル
- 1979年神奈川県生まれ
- 大学卒業後、モラトリアム期間を経て会社員となる
- 経理・総務・管理といったバックオフィスでの経験を積み、2016年から会社の情報システム部門へ転属
- その後2021年にキャリアの経験を活かし、Microsoft365関連の講座でUdemy講師としてデビュー
- 2023年現在、受講生5万人を抱えるベストセラー講師となる
Contents
お客様の悩みと実現したいこと
メールの本文を読まなくても、内容をExcelの一覧上で確認できるようにする。
メールの内容
○○支店宛に下記契約内容が届いておりますのでご確認下さい 【1件目】 (1)契約番号:12345678 (2)お客様:株式会社ABC商事 (3)配信内容:書類不備 (4)回答期限日:2024/02/13 (5)内容詳細:https://gofool.co.jp/unite_test/ 上記内容についてご確認下さい 【2件目】 (1)契約番号:12445566 (2)お客様: hogeデジタル株式会社 (3)配信内容:書類不備 (4)回答期限日:2024/02/17 (5)内容詳細:https://totsuka-unite-com 上記内容についてご確認下さい ・ ・ ・ |
Excelへの転記イメージ
【1件目】の「契約番号」「お客様」「配信内容」・・・で1行
【2件目】の「契約番号」「お客様」「配信内容」・・・で1行と、件ごとに行を分けて転記する。
お客様のお困りごと
- 本社から支店メンバー全員に送信される大量のシステムメールに困っていた
- メールの内容自体は契約に関する重要なものであるが、システムメールのため、支店メンバー全員に送付される
自担当の案件かどうかが、メールを開かないとわからない - その結果、メールが埋もれてしまうことが散見され、納期遅延 や機会損失に繋がってしまう恐れがある
実装内容
PowerAutomateを使って、どのように実現したのかを解説します。
大まかな流れは以下の3つです。
- 新しいメールが届いた時(トリガーの設定)
- 本文抽出のための準備
- 件数の数だけ、本文抽出→Excelへの転記を繰り返す(繰り返し処理)
1.トリガー:新しいメールが届いた時
トリガーは、本社のシステムメールからメールが届いた場合です。
件名など、他の条件による絞り込みは不要だったため、シンプルに差出人だけを指定しました。
差出人 | 本社システムのメールアドレス |
本文抽出のための準備
メール本文を抽出するために、
- HTMLからテキストへの変換
- 件数の数繰り返すための変数の初期化
を行います。
1.HTMLからテキストへの変換
メールはHTML形式で記述されており、そのままだと<b><br/>などの余計なタグも含めて処理されます。
文字列を抽出する上でHTMLタグは不要なので、メール本文をテキストに変換します。
<Content Conversion>の<HTMLからテキスト>を使っています。
(<接続>に<Content Conversion>を追加する必要があります。)
2.件数の数だけ繰り返すための変数の初期化
メール本文内に【1件目】【2件目】等、抽出対象となる情報が複数件含まれています。
この件数分、処理を繰り返すための変数を用意します。
名前 | N件目 |
種類 | 整数 |
値 | 1 |
取得したいのは【1件目】からなので、初期値となる「値」に1を設定しています。
名前はご自身でわかりやすいものであれば、自由に設定してかまいません。
件数の数だけ繰り返す1:繰り返し条件
件数の数だけエクセルへの転記を繰り返すための、繰り返し条件を設定します。
今回のポイントは、本文内に含まれる情報の件数が固定ではないことです。
1件だけの場合もあれば、3件ある場合もあります。
(1件の場合)
○○支店宛に下記契約内容が届いておりますのでご確認下さい 【1件目】 (1)契約番号:12345678 (2)お客様:株式会社ABC商事 (3)配信内容:書類不備 (4)回答期限日:2024/02/13 (5)内容詳細:https://gofool.co.jp/unite_test/ 上記内容についてご確認下さい |
(2件以上の場合)
○○支店宛に下記契約内容が届いておりますのでご確認下さい 【1件目】 (1)契約番号:12345678 (2)お客様:株式会社ABC商事 (3)配信内容:書類不備 (4)回答期限日:2024/02/13 (5)内容詳細:https://gofool.co.jp/unite_test/ 上記内容についてご確認下さい 【2件目】 (1)契約番号:12445566 (2)お客様: hogeデジタル株式会社 (3)配信内容:書類不備 (4)回答期限日:2024/02/17 (5)内容詳細:https://totsuka-unite-com 上記内容についてご確認下さい 【3件目】 (1)契約番号:153535 ・ ・ ・ ・ |
そのため、件数の数だけ、処理を繰り返しています。
繰り返し条件 | 本文(テキスト変換後)が、「N件目」の文字列を含まない 状態になるまで、繰り返す |
「N件目」については、変数N件目の値と、文字列’列目’の結合です。
以下の式で設定しています。
concat(variables(‘N件目’), ‘件目’) |
式 | 行っていること |
---|---|
variables(‘N件目’) | 変数N件目の値を取得 |
concat(variables(‘N件目’), ‘件目’) | 変数N件目の値と文字列「件目」を結合 |
なお、繰り返し処理の最後に、変数「N件目」の値を+1しています。
このように設定することで、メール本文に含まれる「N件目」の数だけ処理を繰り返します。
(例)
1件だけの場合は、「1件目」の文字は含み、「2件目」の文字は含まないので、1回だけ実行される。
2件の場合、「1件目」「2件目」の文字は含み、「3件目」の文字は含まないので、2回繰り返し実行される。
例:1件の場合
【1件目】 (1)契約番号:12345678 (2)お客様:株式会社ABC商事 (3)配信内容:書類不備 (4)回答期限日:2024/02/13 (5)内容詳細:https://gofool.co.jp/unite_test/ 上記内容についてご確認下さい |
変数N件目の値 | 検索される文字列 | 検索される文字列が本文に含まれているか? |
1 | 1件目 | ○* |
2 | 2件目 | ×(繰り返し終了) |
*<Do Until>は正確には「N件目の文字列を含まない」がTrueになったとき、繰り返しが終了します。わかりやすさを優先するため、「検索される文字列が本文に含まれるか」で表現しています。
繰り返し2:繰り返す処理の中身
続いて、繰り返しの中身です。
大まかに、4つの処理を行っています。
- 取得したい要素の位置の取得
- 取得したい要素の取得
- 要素のExcelへの転記
- 変数「N件目」に+1
事例そのままでは項目数が多いので、契約番号とお客様の2つだけのケースで解説します。
取得したい要素の位置の検索
まずは「(1)契約番号」の位置を検索します。
より正確には、本文内のN番目の文字列「(1)契約番号」の開始位置を取得します。
<データ操作>の<作成>アクションに、以下の式を記述します。
アクション名は<契約番号位置検索>とします。
nthIndexOf(body(‘Html_からテキスト’),'(1)契約番号’,variables(‘N件目’)) |
最後の variables(‘N件目’)は、繰り返しの数です。
繰り返し1回目に先頭の「(1)契約番号」の開始位置が、2回目には上から2番目の「(1)契約番号」の開始位置が取得されます。
同じように、アクション<お客様位置検索>を追加し、次の項目「(2)お客様」の開始位置も取得します。
nthIndexOf(body(‘Html_からテキスト’),'(2)お客様’,variables(‘N件目’)) |
取得したい要素の取得
いよいよ、本文から契約番号を取得する<契約番号出力>アクションを作成します。
<データ操作>の<作成>アクションに、以下の式を記述します。
substring(body(‘Html_からテキスト’),add(outputs(‘契約番号位置検索’),8),sub(sub(outputs(‘お客様位置検索’),1),add(outputs(‘契約番号位置検索’),8))) |
少し複雑なので、分けて解説します。
まず、文字の取得にはsubstring関数を使用します。
substringは、①文字列の②指定の位置から、③指定文字数分の文字を取得する関数です。
(例)
substring(‘hello’),3,2) |
→文字列「hello」の3の位置から2文字なので、’lo’が出力される。
*先頭「h」の開始位置は1ではなく、0です。
まず、今回①指定する文字列はメール本文です。htmlからテキストに変換した結果を、入力します。
substring(body(‘Html_からテキスト’),・・・ |
続いて、②開始位置として指定したいのは、「(1)契約番号:」の後ろです。
「(1)契約番号:」の開始位置は<契約番号位置検索>の結果なので、outputs(‘契約番号位置検索’)です。
そこに「(1)契約番号:」の文字数分である8を足します。
substring(body(‘Html_からテキスト’),add(outputs(‘契約番号位置検索’),8),・・・ |
続いて、③取得する文字数です。契約番号が8桁固定であれば、シンプルに8を指定すればOKです。
substring(body(‘Html_からテキスト’),add(outputs(‘契約番号位置検索’),8),8) |
桁数が固定でない場合は、一手間必要です。
今回取得したい文字は、先ほど指定した②開始位置から、次の項目の開始位置-1までです。
文字数は、②開始位置と、次の項目の開始位置-1の差で求められます。
例えば、②開始位置が「40」、<お客様位置検索-1>が「50」だとすると差10が、契約番号の文字数です。
式にすると、以下となります。
subは引き算、addは足し算を行う関数です。
sub(sub(outputs(‘お客様位置検索’),1),add(outputs(‘契約番号位置検索’),8)) |
これをsubstringの最後に加えます。
substring(body(‘Html_からテキスト’),add(outputs(‘契約番号位置検索’),8),sub(sub(outputs(‘お客様位置検索’),1),add(outputs(‘契約番号位置検索’),8))) |
上記の式で契約番号を取得できます。
項目の数だけ、位置検索と出力処理をそれぞれ作成します。
変える必要があるのは、outputsの中身と、+する文字数です。(以下,★部分)
substring(body(‘Html_からテキスト’),add(outputs(‘★出力項目の位置検索アクション名’),8),sub(sub(outputs(‘★次の項目の位置検索アクション名’),1),add(outputs(‘★出力項目の位置検索アクション名’),★項目の文頭の文字数))) |
「項目文頭の文字数」とは「(1)契約番号:」や「(2)お客様:」の文字数のことです。
なお、最後の項目については、次の項目が存在しません。そのため、次の項目の代わりに文字列「上記内容」の位置を取得し、同じように記述します。
<上記内容位置検索>の処理内容
nthIndexOf(body(‘Html_からテキスト’),’上記内容’,variables(‘N件目’)) |
最終項目を出力する処理内容(今回は<お客様出力>)
substring(body(‘Html_からテキスト’),add(outputs(‘お客様位置検索’),7),sub(sub(outputs(‘上記内容位置検索’),1),add(outputs(‘お客様位置検索’),7))) |
エクセルへの転記
抽出した項目をエクセルに転記します。
エクセルに項目数分の列を持ったテーブルを作成します。
あらかじめタイトル行を作成し範囲選択した状態で、<挿入>タブの<テーブル>を選択するとスムーズです。
Excelの<表に行を追加>アクションから、転記先のExcelを指定し、各列に、対応する出力アクションの結果を記述します。
具体的には、契約番号には<契約番号出力>の出力を、お客様には<お客様出力>の出力を選択します。
変数「件数N」に+1
最後に、変数「件数N」に+1するアクションを追加します。
繰り返しの最後に「件数N」に+1することによって、2回目の繰り返し時には「2件目」の文字列が検索され、3回目の繰り返し時に「3件目」の文字列が検索されます。
+1をしないと、ずっと「1件目」を検索してしまい、繰り返しが終了しない無限ループ状態になるので注意しましょう。
以上で設定完了です。
情報を2件含んだメールを受信すると、2行Excelに追加されます。
「契約番号」「お客様」も正しく抽出できました。
Microsoft365の運用にお困りではありませんか?
株式会社uniteでは、Microsoft365のすべてのアプリを対象に、法人様向けの運用サポートを行っています。
- 社内メール⇒teamsへの円滑な移行と利用率UP施策
- SharePointのドキュメントライブラリを活用したファイル管理
- ExcelやAccessで作成された既存の社内ツールをPowerAppsへリニューアル
- 手作業で行っている業務をPowerAutomateで自動化
等、MS365を利用した業務改善のお手伝いをさせて頂いております。
ご予算、サポート範囲については完全オーダーメードでサポート対応をしておりますので、お気軽にご相談ください。