• MS365tips
  • PowerAutomate
  • お客様事例

PowerAutomate事例:メールの本文を抽出してエクセルに転記

PowerAutomateでメールをエクセルに転記させたいものの、やり方がわからず困っていないでしょうか。
この記事では、実際のお客様事例から、設定方法を解説します。

単にメール本文を転記するだけでなく、

  • メール本文内に複数件の情報が入っている場合に、行を分けて転記する方法
  • 「契約番号」「お客様名」などの要素ごとにエクセルに転記する方法

が分かります。
ご参考ください。 

—この記事の監修者—

ヒョウノモトハル

  • 1979年神奈川県生まれ
  • 大学卒業後、モラトリアム期間を経て会社員となる
  • 経理・総務・管理といったバックオフィスでの経験を積み、2016年から会社の情報システム部門へ転属
  • その後2021年にキャリアの経験を活かし、Microsoft365関連の講座でUdemy講師としてデビュー
  • 2023年現在、受講生5万人を抱えるベストセラー講師となる

お客様の悩みと実現したいこと

メールの本文を読まなくても、内容をExcelの一覧上で確認できるようにする。

メールの内容

○○支店宛に下記契約内容が届いておりますのでご確認下さい

【1件目】
(1)契約番号:12345678
(2)お客様:株式会社ABC商事
(3)配信内容:書類不備
(4)回答期限日:2024/02/13
(5)内容詳細:https://unite-365.co.jp/
上記内容についてご確認下さい

【2件目】
(1)契約番号:12445566
(2)お客様: hogeデジタル株式会社
(3)配信内容:書類不備
(4)回答期限日:2024/02/17
(5)内容詳細:https://totsuka-unite-com
上記内容についてご確認下さい


Excelへの転記イメージ

【1件目】の「契約番号」「お客様」「配信内容」・・・で1行
【2件目】の「契約番号」「お客様」「配信内容」・・・で1行と、件ごとに行を分けて転記する。

お客様のお困りごと

  • 本社から支店メンバー全員に送信される大量のシステムメールに困っていた
  • メールの内容自体は契約に関する重要なものであるが、システムメールのため、支店メンバー全員に送付される
    自担当の案件かどうかが、メールを開かないとわからない
  • その結果、メールが埋もれてしまうことが散見され、納期遅延 や機会損失に繋がってしまう恐れがある

実装内容

PowerAutomateを使って、どのように実現したのかを解説します。
大まかな流れは以下の3つです。

  1. 新しいメールが届いた時(トリガーの設定)
  2. 本文抽出のための準備
  3. 件数の数だけ、本文抽出→Excelへの転記を繰り返す(繰り返し処理)

1.トリガー:新しいメールが届いた時

トリガーは、本社のシステムメールからメールが届いた場合です。
件名など、他の条件による絞り込みは不要だったため、シンプルに差出人だけを指定しました。

差出人本社システムのメールアドレス

本文抽出のための準備

メール本文を抽出するために、

  1. HTMLからテキストへの変換
  2. 件数の数繰り返すための変数の初期化

を行います。

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://unite-365.co.jp/
上記内容についてご確認下さい

(2件以上の場合)

○○支店宛に下記契約内容が届いておりますのでご確認下さい

【1件目】
(1)契約番号:12345678
(2)お客様:株式会社ABC商事
(3)配信内容:書類不備
(4)回答期限日:2024/02/13
(5)内容詳細:https://unite-365.co.jp/
上記内容についてご確認下さい

【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://unite-365.co.jp/
上記内容についてご確認下さい
変数N件目の値検索される文字列検索される文字列が本文に含まれているか?
11件目○*
22件目×(繰り返し終了)

*<Do Until>は正確には「N件目の文字列を含まない」がTrueになったとき、繰り返しが終了します。わかりやすさを優先するため、「検索される文字列が本文に含まれるか」で表現しています。

繰り返し2:繰り返す処理の中身

続いて、繰り返しの中身です。
大まかに、4つの処理を行っています。

  1. 取得したい要素の位置の取得
  2. 取得したい要素の取得
  3. 要素のExcelへの転記
  4. 変数「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を利用した業務改善のお手伝いをさせて頂いております。
ご予算、サポート範囲については完全オーダーメードでサポート対応をしておりますので、お気軽にご相談ください。