RPAの入門として、UiPathの使い方を紹介していきます。今回は、複数の受信メールから指定したデータを抽出する処理を自動化したいと思います。データの抽出には正規表現(パターンマッチング)を使用します。
【初心者歓迎・RPA個人講座】RPAを一から学ぶITスクール
受信メールの作成
先ずは、下記のようなメールを受信トレイに3つ用意します。各メールで、予約内容のデータを適当に変更しておいてください。今回は、メール本文から以下のデータを抽出することにします。
- 予約番号
- 日付
- 開始時刻
- 終了時刻
- 利用料金
メールの本文
「会議室」をご利用頂き、ありがとうございます。 以下の内容でご予約を承りました。 ------------------------- 【予約内容】 ●予約番号:14321 ●日時 :2020/8/7 13:00~15:00 ●会議室 :大会議室 ●利用人数:5名 ●利用料金:¥15,000(税込) ------------------------- 株式会社First
受信トレイにはダミーメールも2つ入れておきます。なお、メール本文はHTMLメールではなく、テキストメール(プレーンテキスト)にしてください。
出力ファイルの作成
メールから抽出したデータを保存するために、下記のようなExcelファイルを作成しておきます。ファイル名は「リスト.xlsx」、シート名は「リスト」としました。
UiPathのワークフロー構築
【Step.1】Mainワークフローを開く
ワークフローを構築していくために、画面左下の「Activities」タブを選択し、画面中央の「Open Main Workflow」をクリックします。
【Step.2】パスワード情報の設定
メール取得の設定を行う前に、設定で必要になるパスワード情報を準備します。画面左側のアクティビティ検索窓に「password」と入力します。表示された「Get Password」アクティビティをワークフロー内にドラッグ&ドロップします。
アクティビティのプロパティ設定を行います。パスワード(Password)には、使用するメールアドレスのパスワード情報を入力します。パスワードは暗号化され、*印でマスクされます。パスワードを保存する変数名(Result)には、「password」という名称の変数を新規作成してセットします。
なお、今回は動作確認のために一時的に「Get Password」アクティビティを使用しました。ただし、「Get Password」アクティビティでの永続的なパスワード管理は非推奨のようです。詳細はこちらの公式サイトの内容をご確認ください。
【Step.3】受信メールを取得する
受信トレイにあるメール(複数)を取得します。メールを取得するアクティビティには幾つか種類がありますが、今回は「Get IMAP Mail Messages」を使用します。画面左側のアクティビティ検索窓に「mail」と入力します。表示された「Get IMAP Mail Messages」を、「Get Password」の下にドラッグ&ドロップしましょう。
下表の通り、アクティビティのプロパティ設定を行います。
プロパティ項目 | 入力値 | 備考 |
---|---|---|
MailFolder | "Inbox" | 取得先のフォルダを指定します。デフォルトの受信トレイの場合は「Inbox」を指定します。 |
Port | 993 | ポート番号です。Gmailを使用する際は993を設定します。 |
Server | "imap.gmail.com" | サーバー情報です。Gmailを使用する際は、imap.gmail.comを設定します。 |
"xxxx@xx" | あなたのメールアドレスです。xxxxには適切な値を入力してください。 | |
Password | password | メールアドレスのパスワードです。変数passwordを設定します。 |
OnlyUnread Messages | チェックなし | 未読メールのみ取得する設定です。今回は既読メールを取得するので、チェックを外します。 |
Top | 10 | 取得するメールの件数です。今回は受信トレイの一番上から10件の既読メールを取得します。 |
Messages | mailList | 取得したメール(複数)を保存する変数です。新たな変数mailListを新規作成してセットします。 |
今回はGmailの受信メールを取得しますが、他のメールサーバーを使用する際は、ポート番号やサーバー情報などを適宜変更してください。なお、Gmailの受信メールをIMAPで取得する場合は、一時的に下記の設定を行ってください。この設定でセキュリティレベルが低下するため、動作確認が終わった後は、必ず設定を元に戻すことを忘れないでください。
【Step.4】出力ファイルを開く
データの保存先のExcelファイルを開くために、「Excel Application Scope」アクティビティを使用します。画面左側のアクティビティ検索窓に「excel」と入力します。表示された「Excel Application Scope」を、「Get IMAP Mail Messages」の下にドラッグ&ドロップします。
続けて、アクティビティのプロパティ設定を行います。フォルダアイコンをクリックして、出力ファイル(リスト.xlsx)を指定します。以降は、「Excel Application Scope」のDoコンテナ内に、実行したい処理を追加していきます。
【Step.5】受信メールを1件ずつ処理
受信メールを1件ずつ取り出して、順にデータを抽出していきたいです。変数mailListに保存されたメールを1件ずつ取り出すために、「For Each」アクティビティを使用します(※「For Each Row」と間違わないように)。
画面左側のアクティビティ検索窓に「foreach」と入力します。表示された「For Each」を、Doコンテナ内にドラッグ&ドロップします。
続けて、アクティビティのプロパティ設定を行います。繰り返すデータ(Values)には、「mailList」を入力します。変数mailListに保存されたメールから1件ずつ取り出し、順に変数itemに代入され、「For Each」のBodyコンテナ内で変数itemの値を参照することができます。
なお、「For Each」アクティビティを使う場合は、繰り返すデータ(Values)のタイプを指定する必要があります。タイプ(TypeArgument)のプルダウンリストから「Browse for Types…」をクリックすると、タイプの設定画面が表示されます。
「Type Name:」の入力欄に、「System.Net.Mail.MailMessage」と入力すると、「MailMessage」タイプが表示されます。これを選択して、「OK」ボタンをクリックしましょう。これで、繰り返すデータ(Values)のタイプを「MailMessage」に設定することができました。
【Step.6】受信メールリストの確認
下図を見てください。
「For Each」では、各メールが変数itemに代入されます。各メールの題名や本文などを取得するには、下記のように記述します。最後のToString()はデータの型を文字列に変換するメソッドです。この辺りは深く気にせずに、おまじないと思って割り切りましょう。
送信者 → item.From.ToString() 題名 → item.Subject.ToString() 本文 → item.Body.ToString()
【Step.7】メールの題名を取得
各メールの題名を取得するには、「item.Subject.ToString()」と記述します。以降の処理で、このメールの題名を何度も使用する場合は、変数を新規作成して、題名を保存しておくことを勧めます。また、適切な名前の変数に保存することで、ワークフローの可読性を高めることもできます。
変数を新規作成して、何かしらの値を保存するには、「Assign」アクティビティを使用します。画面左側のアクティビティ検索窓に「assign」と入力します。表示された「Assign」を、「For Each」のBodyコンテナ内にドラッグ&ドロップします。
アクティビティのプロパティ設定を行います。変数名(To)には、「mailTitle」という名称の変数を新規作成してセットします。保存する値(Value)には、「item.Subject.ToString()」を入力します。これで、メールの題名は、変数mailTitleに保存されました。
【Step.8】受信メールの条件分岐
今回は、メールの題名が「会議室の予約完了のお知らせ」に完全一致したメールのみ処理します。ダミーメールは処理しません。処理を条件分岐させるには、「If」アクティビティを使用します。画面左側のアクティビティ検索窓に「if」と入力します。表示された「If」を、「assign」の直下にドラッグ&ドロップします。
アクティビティのプロパティ設定を行います。「Condition」には任意の条件式を入力します。下記の式を入力してください。
mailTitle = "会議室の予約完了のお知らせ"
「If」アクティビティは、左側「Then」と右側「Else」に分かれています。これは、「Condition」に記載した条件式を満たす場合は、左側の「Then」に設定した処理が実行されます。条件式を満たさない場合は、右側の「Else」に設定した処理が実行されます。
今回は、条件式を満たすメールのデータを抽出します。従って、以降では、データを抽出する処理を左側(Then)に追加していきます。右側(Else)には特に処理を設定する必要はありません。
【Step.9】メールの本文を取得
各メールの本文を取得するには、「item.Body.ToString()」と記述します。メールの題名と同様に、変数に保存しておきましょう。画面左側のアクティビティ検索窓に「assign」と入力します。表示された「Assign」を、「if」アクティビティのThenコンテナ内にドラッグ&ドロップします。
アクティビティのプロパティ設定を行います。変数名(To)には、「mailText」という名称の変数を新規作成してセットします。保存する値(Value)には、「item.Body.ToString()」を入力します。これで、メールの本文は、変数mailTextに保存されました。
【Step.10】正規表現でデータを抽出
では、メール本文から以下のデータを抽出していきます。説明は後回しにして、先にワークフローを作ってしまいます。正規表現(パターンマッチング)の詳細については、Step.11で解説しますのでご安心ください。
- 予約番号
- 日付
- 開始時刻
- 終了時刻
- 利用料金
「予約番号」の抽出
メールの本文から「予約番号」を抽出します。画面左側のアクティビティ検索窓に「match」と入力します。表示された「Matches」アクティビティを「Assign」の下にドラッグ&ドロップしましょう。
下表の通り、「Matches」アクティビティのプロパティを設定します。
プロパティ項目 | 入力値 | 備考 |
---|---|---|
Input | mailText | 検索の対象となる文字列です。メールの本文が保存されている変数mailTextを設定します。 |
Pattern | "\r\n●予約番号:(.*)\r\n" | 検索する文字列です。正規表現で記載します。 |
Result | number | 検索された文字列を保存する変数です。変数numberを新規作成してセットします。 |
「日付」「開始時刻」「終了時刻」の抽出
メールの本文から「日付」「開始時刻」「終了時刻」を抽出します。「Matches」アクティビティを「Assign」の下にドラッグ&ドロップしましょう。
下表の通り、「Matches」アクティビティのプロパティを設定します。
プロパティ項目 | 入力値 | 備考 |
---|---|---|
Input | mailText | 検索の対象となる文字列です。メールの本文が保存されている変数mailTextを設定します。 |
Pattern | "\r\n●日時 :(.*) (.*)~(.*)\r\n" | 検索する文字列です。正規表現で記載します。 |
Result | dateTime | 検索された文字列を保存する変数です。変数dateTimeを新規作成してセットします。 |
「利用料金」の抽出
メールの本文から「利用料金」を抽出します。「Matches」アクティビティを「Assign」の下にドラッグ&ドロップしましょう。
下表の通り、「Matches」アクティビティのプロパティを設定します。
プロパティ項目 | 入力値 | 備考 |
---|---|---|
Input | mailText | 検索の対象となる文字列です。メールの本文が保存されている変数mailTextを設定します。 |
Pattern | "\r\n●利用料金:¥(.*)(税込)\r\n" | 検索する文字列です。正規表現で記載します。 |
Result | price | 検索された文字列を保存する変数です。変数priceを新規作成してセットします。 |
【Step.11】正規表現の解説
では、Step.10で登場した「Matches」アクティビティで使用する正規表現(Pattern)を解説していきます。先ずは、下図を見てください。
正規表現とは、文字列を検索する際のパターンの書き方です。メール本文を正規表現で検索した結果、検索がヒットした文字列が一ヶ所だけだと仮定すると、ヒットした文字列は、「変数名(0)」で取得することができます。検索が複数ヒットした場合は、N個目にヒットした文字列は「変数名(N-1)」で取得できます。
次は、正規表現のパターンと、実際に検索でヒットした文字列の関係を解説していきます。
「予約番号」のパターン
メール本文の予約番号は、「\r\n●予約番号:(.*)\r\n」というパターンで取得できます。下図を見てください。
正規表現のマッチングの精度を上げるために、検索対象(●予約番号:xxxxx)の前後に改行文字が存在すると考えて取り扱います。正規表現ではWindows環境の改行文字は「\r\n」と表記します。
予約番号の数字は、各メールによって変化します。そこで、これらの数字は、任意の文字が0個以上連続する文字列「.*」と表記します。「.」は任意の1文字を表します。「*」は直前の文字が0個以上連続する文字列を表します。
なお、「.*」などを括弧()で括ることにより、後にGroupsメソッドで値を前から順に取り出すことができます。Groups(0)はヒットした全体の文字列が取得できます。各メールに対して、実際に取得されるデータは下記のようになります。
number(0).Groups(0) → \r\n●予約番号:14321\r\n number(0).Groups(1) → 14321
「日付」「開始時刻」「終了時刻」のパターン
メール本文の日時に関する情報は、「\r\n●日時 :(.*) (.*)~(.*)\r\n」というパターンで取得できます(※空白を含む)。下図を見てください。
正規表現のマッチングの精度を上げるために、検索対象(●日時 :yyyy/m/d hh:mm~hh:mm)の前後に改行文字が存在すると考えて取り扱います。正規表現ではWindows環境の改行文字は「\r\n」と表記します。
日付や時刻の数字は、各メールによって変化します。そこで、これらの数字は、任意の文字が0個以上連続する文字列「.*」と表記します。「.」は任意の1文字を表します。「*」は直前の文字が0個以上連続する文字列を表します。
なお、「.*」などを括弧()で括ることにより、後にGroupsメソッドで値を前から順に取り出すことができます。Groups(0)はヒットした全体の文字列が取得できます。各メールに対して、実際に取得されるデータは下記のようになります。
dateTime(0).Groups(0) → \r\n●日時 :2020/8/7 13:00~15:00\r\n dateTime(0).Groups(1) → 2020/8/7
dateTime(0).Groups(2) → 13:00
dateTime(0).Groups(3) → 15:00
「利用料金」のパターン
メール本文の利用料金は、「\r\n●利用料金:¥(.*)(税込)\r\n」というパターンで取得できます。下図を見てください。
正規表現のマッチングの精度を上げるために、検索対象(●利用料金:¥x,xxx(税込))の前後に改行文字が存在すると考えて取り扱います。正規表現ではWindows環境の改行文字は「\r\n」と表記します。
利用料金の数字は、各メールによって変化します。そこで、これらの数字は、任意の文字が0個以上連続する文字列「.*」と表記します。「.」は任意の1文字を表します。「*」は直前の文字が0個以上連続する文字列を表します。
なお、「.*」などを括弧()で括ることにより、後にGroupsメソッドで値を前から順に取り出すことができます。Groups(0)はヒットした全体の文字列が取得できます。各メールに対して、実際に取得されるデータは下記のようになります。
price(0).Groups(0) → \r\n●利用料金:¥15,000(税込)\r\n price(0).Groups(1) → 15,000
【Step.12】出力用のテーブルの作成
メール本文から必要なデータを抽出することができました。最後に、これらのデータを出力ファイルに書き込みます。ただし、データの数が多いため、セルに一つずつ書き込むと結構な時間がかかってしまいます。そこで、事前に出力用のテーブルを作成しておき、一括でファイルに書き込めるようにしたいと思います。
出力用のテーブルを作成するには、「Build Data Table」アクティビティを使用します。面左側のアクティビティ検索窓に「data」と入力します。表示された「Build Data Table」を、「Matches」の下にドラッグ&ドロップします。
アクティビティのプロパティ設定を行います。先ずは、作成したテーブルを保存する変数名(DataTable)に、「table」という名称の変数を新規作成してセットします。次に、「DataTable」ボタンをクリックすると、テーブルの設定画面が表示されます。
出力するデータは5つなので、テーブルに列を5つ用意します。今回は値だけを出力するので、列名は適当で構いません。テーブルの中身は後で追加するため、今は空のままで問題ありません。ここでは、列情報のみ設定した空のテーブルを作っておきます。
【Step.13】行データの追加
Step.12で作成した空のテーブルに、行データを追加します。行データの追加は、「Add Data Row」アクティビティを使用します。「Add Data Row」を、「Build Data Table」の下にドラッグ&ドロップします。
アクティビティのプロパティ設定を行います。追加先のテーブル(DataTable)には、「table」を入力します。追加する行データ(ArrayRow)には、下記の式を入力します。これで、5列の一次元配列をテーブルに追加することができます。
{number(0).Groups(1), dateTime(0).Groups(1), dateTime(0).Groups(2), dateTime(0).Groups(3), price(0).Groups(1)}
【Step.14】出力ファイルへのテーブル書き込み
ワークフローの最後に、出力ファイル(リスト.xlsx)にテーブルを書き込む処理を追加します。なお、今回は、書き込む位置を指定せずに、ファイルの一番下にテーブルを書き込むようにします。画面左側のアクティビティ検索窓に「excel」と入力します。表示された「Append Range」アクティビティを、「Add Data Row」の直下にドラッグ&ドロップします。
アクティビティのプロパティ設定を行います。シート名(SheetName)には、「リスト」と入力します。書き込むテーブル(DataTable)には、「table」と入力します。これで、準備が完了しました。
【Step.15】ワークフローの実行
では、上部パネルの「Debug File > Run」をクリックし、このワークフローを実行してみましょう。
受信トレイのメールの各データが出力ファイルに書き込まれました。データが正しく抽出できていることが確認できます。最後に、変更したセキュリティの設定を元に戻しておいてください。
まとめ
今回は、複数の受信メールから指定したデータを抽出する処理を自動化しました。下記の点を理解して、他の業務にも応用できるようにしましょう。
- 「Get IMAP Mail Messages」を使ったメールの取得
- 「For Each」を使った繰り返し処理
- 「If」を使った条件分岐
- 「Matches」を使った正規表現による検索
- 「Groups」メソッドを使用した値の取り出し
- 「Buid Data Table」を使ったテーブルの作成
- 「Add Data Row」を使った行データの追加
- 「Append Range」を使ってテーブルを書き込む