26
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Microsoft Power AutomateAdvent Calendar 2022

Day 19

Power AutomateとOffice Scriptを利用してメールからデータを抽出する仕組みを作る

Last updated at Posted at 2022-12-18

はじめに

Power Automateの強味として、自動化したクラウドフローの利用が可能です。

image.png
この機能の中で凄いな、と思っているのは 指定されたイベントによってトリガーされる このトリガーの中に、
GmailとOutlookでのメール受信も含まれていることです。
image.png
image.png

今回は 新しいメールが届いたときメールの文面から「正規表現」を使い、必要なデータをExcel Onlineに自動でストックしていく方法を解説したいと思います

注意

本記事では「正規表現」の詳細な内容にまでは触れません。「私が使って便利だな」と感じている表現のみ書きます。
正規表現を使えば、文字列から検索する パターン を指定することでサクっとデータが取り出すことができ、大変便利ですが、奥深い世界であり、正規表現の内容を列挙するだけで立派な書籍が出来上がるほどです。

詳しく学ばれたい方は下記の本を推奨します。

Power Automateで「正規表現」を利用するためには

Power Automateに、メールのテキストを渡し、必要なデータを抽出するためには、この 正規表現 を利用することが効果的です。
しかしながら、正規表現を利用するには、Excel Online Fileに書く Office Script を使う必要があります。

  • 下記の「スクリプトの実行」が正規表現を使って、必要な要素を返すステップに該当しています。
    image.png

私たちのビジネスにおいて、Teamsを中心としたチャットによるタスクの設定などもPower Platformでは可能です。
しかしSaaSを中心に、登録された内容やリマインダーから、メールという媒体から情報をキャッチすることも度々あることも事実です。

定型的にメールに情報が記載されるのであれば、 人の手を介して情報をスプレッドシートにまとめるという行為は、
手間でありミスが起こるポイントでもあります。

今回はそういった転記作業からの脱却にお力添えできればと思い、記事を書かせていただきました。

Goal

今回目指すのは下記の様なExcel Onlineのシートに、メールの情報が自動で転記されることです。

  • 日付
  • 店舗
  • 金額

上記の3要素です。SaaSの製品でもリマインダーとして、このような情報がメールで届く例もあります。
それを見て、Excelに転記するってことは ナンセンス! 今すぐやめましょ!

image.png

具体的な手順

さて、まずはフローを見てみます。

1. 自動化したクラウドフローを構築する

image.png

Microsoft様の製品連携バージョンでお届けします!

Office Script サンプルコード

インターネットに多く挙げられていますが、下記のブログのコードを紹介させてください。

RegExpオブジェクトを作成して、パターンにマッチする文字を返せる汎用的で美しいコードです。
世の中に発信していただいたことに深く敬意を表します。

こちらでも引用をさせてください。

RegularExpressions
function main(workbook: ExcelScript.Workbook, text: string, pattern: string, flags: string): string[] {
  let ptn = new RegExp(pattern, flags);
  return text.match(ptn) ?? [];
}

オフィス スクリプトは TypeScript で書かれており、JavaScript のスーパーセットです。 JavaScript に慣れている場合は、コードの多くが両言語で共通しているため、知識を引き継ぐことができます。

learnの引用になります。Java Scriptの兄弟分のような存在であるようです。
書き方に差異はあるものの、Google Apps Scriptを学んでいたことから馴染みやすい印象を受けます。

ちなみにType Scriptの学習は『サバイバルTypeScript』というこれでもか!というほどの入門コンテンツがあるので学ぶ環境は十分です。

大切なのは・・・自分の気持ちですね・・・


2. Outlookの設定をする

今回は「Outlookの受信トレイ」にメールが届いた場合を想定して進めます。
大切なことですが、メールアプリケーションには**標準で「メールの振り分け」であったり、
「ラベルの付与」といった機能が設けられておりますので、メールアプリケーションの設定
この仕組みでは大切な要素になります。

具体的なフローが起動する仕組み

仕組みの解像度をより高めていきます。
自動化の内容は下記のとおりです。

  1. 【ほげほげPay】利用明細のお知らせというタイトルのメールがOutlookで受信されたとき
  2. 受信したメールの本文から必要な情報を正規表現で抽出し
  3. Excel Onlineのデータに転記する

こちらが今回の自動化の内容になります。

個人のメールアカウントでやるので、少し内容が粗いところもありますが、ご了承ください。

  • 実際に届くメールのイメージ
    image.png

  • Outlookでルールを設定
    image.png
    image.png

OutlookでもGmailでも、このようなメール受信時の対処を設定する機能は充実しています。
また直感的な操作で設定できるため、活用をおススメします。

3. 自動化したクラウドフローを作り込んでいく

上記の準備が完了したら、クラウドフローの活用も着々と進めることができます。
- Power Automateのトリガー
image.png

Power Automate側でも何のメールが届いたか、上記の通り設定することができます。
Outlook側での設定をおススメしましたが、全部Power Automateで管理したい、という場合は
好みで細かく設定するところを決めれば良いでしょう。

このトリガーでメールを取得した際に手に入る戻り値は多いです。
image.png

この中で使う値は「本文のプレビュー」@{triggerBody()?['bodyPreview']}になります。
他にも戻り値がありますが、この値の特徴は、メールのプレーンテキストが取得できることです。

image.png

HTML形式で評価されたテキストの場合、<body>~~のようにタグが多くあり、利用しづらい特徴があります。
プレーンテキストであれば、自分が実際に見るメールの文字そのものを評価して活用することができるので、
こちらの利用を私はお勧めいたします。

そのうえで、走らせる次のステップはこちらです
image.png

Office Scriptが実際に起動しているものですね。
正規表現は

(?<=支払金額\s+)\d.*(?=円)

上記が該当します。
フラグの「g:グローバルマッチ」です。
文字列の最後まで検索を繰り返します。複数該当した場合は、配列で値を返す、ということです。

サンプルのメールを実際に送ると、正規表現により、オブジェクトで返されます。
image.png

ここまで来たら活用の道が見えてきましたね!


クラウドフロー全体像

今回のフローで取得したいのは

  • ご利用日時
  • ご利用店舗
  • 支払金額

この三点です。
image.png

取得したものをこちらに転記します。
image.png

今、私が思いつく方法は、2パターンです。

1. 都度、正規表現を使って実現するパターン

image.png

最後に転記しやすいように配列に結果を格納して、Excelの転記に使っています。
またOffice Scriptのデータを取得する際は、今回の場合グローバルマッチを正規表現で採用していることから
「スクリプトの実行」の戻り値は配列になっています。

データを取得する際には添え字にインデックスが必要です。

警告
Office Scriptをフローに加える際は実行時間に注意してください。
今回の例でも約10秒近くかかります。

今回の正規表現の例です。

// スクリプトの実行 日時
(?<=ご利用日時\s+)\d.*
// スクリプトの実行 店舗
(?<=ご利用店舗  ).*
// スクリプトの実行 支払金額
(?<=支払金額\s+)\d.*(?=)

フローの結果

Excelのテーブルに無事転記することができました。
image.png

このフローの問題点

Power Automateの中で内容が冗長になること、実行時間がかかることから、
Office Scriptの実行を何度もPower Automateの中に入れるということは悪手である可能性があります。

よりスマートな書き方を目指すのであれば、一度Office Scriptにデータを渡した際に、
欲しいデータがまとめて取得できるこの方がスマートといえましょう。


2. Office Scriptで必要なデータをまとめて取得するパターン

せっかくコードを書くのであれば、スクリプト内でほしいデータをまとめて取得できたほうがスマートです。
サンプルとして今回書いた例をご紹介します。

RegularExpressions2
function main(workbook: ExcelScript.Workbook, text: string) {
  let result = {};
  let regex: string[] = [];

  regex = text.match(/(?<=ご利用日時\s+)\d.*/g);
  if (regex != null) { result["date"] = regex[0];}
  else { result["date"] = "null"; }

  regex = text.match(/(?<=ご利用店舗  ).*/g);
  if (regex != null) { result["shop"] = regex[0];}
  else { result["shop"] = "null"; }

  regex = text.match(/(?<=支払金額\s+)\d.*(?=)/g);
  if (regex != null) { result["payment"] = regex[0];}
  else { result["payment"] = "null"; }

  return result;
}

お願い
コードはドンドン修正してください🙇

この例でフローを実行してみます。

image.png

戻り値がオブジェクトで出力されました✨

フロー実行時間も圧倒的に短縮されます!
image.png

  • Excelの結果
    image.png

Office Scriptの活用でメールが情報自動収集ツールに化ける!
とても素敵です!!

本当におススメ技なので紹介させていただきました!

最後に!

登壇やTwitterなどいろいろ動いてますので、TwitterをFollowしてくださると嬉しいです!
記事のいいね!もHappyです!!

終わりに

検証をしていく中で、Outlookの本文のプレビュー機能でテキストが全て拾えているのか怪しい場面がありました。
その場合は本文を取得してScriptの中で文字列のタグ情報を正規表現で除去することをお勧めします。

タグをキレイにするコード
  // argvが引数の場合、このreplaceで変更が可能かと!
  let text = argv.replace(/(<([^>]+)>)/g, '');

最後までお読みいただきありがとうございました🙇🙇

26
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?