教材

【RPA入門】Power Automate Desktopの使い方5~Excelリストを用いたメール送信(条件分岐)

pad send mail

RPAの入門として、Power Automate Desktopの使い方を紹介していきます。今回は、宛先情報が記載されたExcelリストを用いて、繰り返しメール送信する処理を自動化したいと思います(Outlook使用)。なお、メール本文はテンプレートファイルを使い、メール送信の処理は宛先情報によって条件分岐させます。

1. Power Automate Desktopの初期設定

【RPA入門】Power Automate Desktopの使い方1~Webデータ取得(テキスト編)」の記事の【Step.1】から【Step2】までを実行してください。

 

2. Excelリストの作成

先ずは、メール送信に用いるExcelリストを作成します。リストの項目は以下の5つとします。ファイル名は「リスト.xlsx」、シート名は「リスト」にします。なお、受信確認できるように、アドレスにはあなたのメールアドレスを入れておきましょう。

  • 企業
  • 担当者
  • アドレス
  • プラン
  • 利用月数

excel list

 

プランの種類(ライト、ベーシック)に応じたテンプレートファイルを使い、企業の担当者宛てに個別にメールを送信していきます。なお、今回は以下の条件に一致した方にのみメールを送信します。全員には送信しません。

  • ライトプランかつ利用月数が3ヶ月以上の方
  • ベーシックプランかつ利用月数が3ヶ月未満の方

 

3. テンプレートファイルの作成

メール本文に使用するテンプレートファイルを作成します。今回は、プランの種類に応じて、メール本文を変化させます。「テンプレート」というフォルダを用意し、その中に2つのテキストファイル(ライト.txt、ベーシック.txt)を入れておきます。

実際にメールを送信する際には、テンプレートファイル内の「#COMPANY#」と「#NAME#」の部分には、それぞれ「企業」と「担当者」を置き換えるようにします。英単語を#の文字で囲む理由は、メール本文内の他の場所で同じ英単語を使用していた場合に、そこも誤って置き換えられることを防ぐためです。

■ テンプレート文(ライト.txt)

#COMPANY#
#NAME# 様

いつもお世話になっております。
株式会社Firstの○○です。

「ライトプラン」をご利用いただき、ありがとうございます。
現在ご利用のライトプランは、一部の機能が制限されております。

フル機能をご利用なりたい場合は、「ベーシックプラン」に移行
する必要がございます。

ベーシックプランの詳細は、下記のサイトをご覧ください。
https://.../product/basic

ご検討の程、宜しくお願い致します。


-------------
株式会社First
○○

 

■ テンプレート文(ベーシック.txt)

#COMPANY#
#NAME# 様

いつもお世話になっております。
株式会社Firstの○○です。

「ベーシックプラン」をご利用いただき、ありがとうございます。

当プランをご利用にあたり、何かお困りごとはございませんでしょうか。
当社製品のFAQが、下記のサイトに記載されております。
https://.../product/basic/faq

ご質問や疑問点などがございましたら、お気軽にお問い合わせください。
何卒、宜しくお願い致します。


-------------
株式会社First
○○

 

4. Power Automate Desktopのフロー構築

【Step.1】Excelリストを開く

作成したExcelリストを開くために、アクションを追加します。画面左側のアクション検索窓に「excel」と入力します。「Excelの起動」アクションを、フロー内にドラッグ&ドロップします。

open excel

 

すると、プロパティ設定の画面が開きます。「Excelの起動」には「次のドキュメントを開く」を指定して、「ドキュメントパス」には、Excelリストのファイルパスを入力します。「読み取り専用として開く」をONにしておきましょう。

edit property of open-excel

 

【Step.2】Excelリストの範囲情報の取得

Excelリストの範囲情報を取得します。「Excelワークシートから最初の空の列や行を取得」アクションを、フロー内の「Excelの起動」アクションの直下にドラッグ&ドロップします。

get range

 

すると、プロパティ設定の画面が開きます。「Excelインスタンス」に「%ExcelInstance%」が設定されていることが確認できます。「%ExcelInstance%」は、【Step.1】で起動したExcelのインスタンス名です。生成された変数には、「FirstFreeColumn」と「FirstFreeRow」が設定されています。これらの変数には、Excelのシート内で最初に空となる列数と行数の値がそれぞれ格納されています。今回は、FirstFreeColumnの値は6、FirstFreeRowの値は6となります。

edit property of get-range

 

【Step.3】Excelリストのデータを読み込む

【Step.2】で取得したExcelリストの範囲情報を使用して、Excelリストのデータを読み込みます。「Excelワークシートから読み取り」アクションを、フロー内の「Excelワークシートから最初の空の列や行を取得」アクションの直下にドラッグ&ドロップします。

read excel list

 

すると、プロパティ設定の画面が開きます。下表の通りに各プロパティの値を編集します。続けて、「生成された変数」をクリックして、変数名が「%ExcelData%」になっていることを確認します。「生成された変数」には、読み込んだExcelリストのデータが格納されます。基本的に、変数名はその中身を推測できる名称をつけるべきです。今回は、「%mailList%」に変更します。

edit property of read-list

 

No. プロパティ項目 設定する値
1 取得 セル範囲の値
2 先頭列 1
3 先頭行 1
4 最終列 %FirstFreeColumn – 1%
5 最終行 %FirstFreeRow – 1%
6 範囲の最初の行に列名が含まれています ON

 

読み込んだExcelリストのデータは、具体的には下記のような二次元配列(4行×5列)となります。

mailList = [
 ["株式会社いぬ", "犬", "a@co.jp", "ライト", "1"],
 ["株式会社さる", "猿", "b@co.jp", "ライト", "4"],
 ["株式会社きじ", "雉", "c@co.jp", "ベーシック", "5"],
 ["株式会社おに", "鬼", "d@co.jp", "ベーシック", "2"]
]

 

【Step.4】Excelリストを閉じる

データを読み取った後に、Excelリストを閉じます。「Excelを閉じる」アクションを、フロー内の「Excelワークシートから読み取り」アクションの直下にドラッグ&ドロップします。

close excel

 

すると、プロパティ設定の画面が開きます。「Excelインスタンス」に「%ExcelInstance%」が、「Excelを閉じる前」に「ドキュメントを保存しない」が設定されていることが確認できます。「%ExcelInstance%」は、【Step.1】で起動したExcelのインスタンス名です。

edit property of close-excel

 

【Step.5】リスト内のデータを1行ずつ処理

最終的には、リスト内のデータを1行ずつ取り出して、順にメールを送信していきたいです。変数mailListに保存されたリストからデータを1行ずつ取り出すために、「For each」アクションを使用します。画面左側のアクション検索窓に「for」と入力します。「For each」アクションを、フロー内の「Excelを閉じる」アクションの直下にドラッグ&ドロップします。

for each

 

すると、プロパティ設定の画面が開きます。「反復処理を行う値」に「%mailList%」を入力します。このプロパティでは、繰り返し処理を行う対象として、リスト型やテーブル型の変数を指定します。

edit property of foreach

 

【Step.6】リスト内のデータの確認

下図を見てください。変数mailListに保存されたリストから1行ずつデータを取り出し、変数CurrentItemに代入されます。「For each」アクションの内部では、変数CurrentItemの各列の値を参照することができます。今回のケースでは、リストに4行のデータがあるため、「For each」アクションの内部の処理が4回繰り返されます。処理を実行する度に、変数CurrentItemには、[“企業”, “担当者”, “アドレス”, “プラン”, “利用月数”]の一次元配列が順に代入されます。

view for each

 

「For each」アクションでは、各行のデータが変数CurrentItemに代入されます。各行のデータから、各列の値を参照するには、CurrentItem[‘項目名’]」と記述します。

企業  → CurrentItem['企業']
担当者 → CurrentItem['担当者']
アドレス→ CurrentItem['アドレス']
プラン → CurrentItem['プラン']
利用月数→ CurrentItem['利用月数']

 

【Step.7】条件式で使用する変数の作成

今回は以下の条件に一致した方にのみメールを送信します。全員には送信しません。

  • ライトプランかつ利用月数が3ヶ月以上の方
  • ベーシックプランかつ利用月数が3ヶ月未満の方

処理を条件分岐させるには、「If」アクションを使用します。プランと利用月数に関する条件式を記述する必要があるので、事前にプランと利用月数の値をそれぞれ変数に保存しておきます。変数への保存は、「変数の設定」アクションを使用します。画面左側のアクション検索窓に「変数」と入力します。「変数の設定」アクションを、「For each」アクションの内部にドラッグ&ドロップします。

set plan variable

 

すると、プロパティ設定の画面が開きます。「設定」を「%plan%」に変更して、「宛先」には「%CurrentItem['プラン']%」と入力します。

edit property of plan variable

 

続けて、「変数の設定」アクションを、「変数の設定」アクションの直下にドラッグ&ドロップします。

set month variable

 

すると、プロパティ設定の画面が開きます。「設定」を「%month%」に変更して、「宛先」には「%CurrentItem['利用月数']%」と入力します。

edit property of month variable

 

【Step.8】メール送信の条件分岐

では、改めて、条件分岐の「If」アクションを設定していきます。画面左側のアクション検索窓に「if」と入力します。「If」アクションを、「変数の設定」アクションの直下にドラッグ&ドロップします。

if

 

すると、プロパティ設定の画面が開きます。下表の通りに各プロパティの値を編集します。今回は、条件式を満たす場合にメールを送信して、条件を満たさない場合はメールを送信しません。従って、以降では、メールを送信する処理を「if」アクションの内部に追加していきます。

edit property of if

 

No. プロパティ項目 設定する値
1 最初のオペランド %(plan = 'ライト' AND month >= 3) OR (plan = 'ベーシック' AND month < 3)%
※条件式を入力します。2つの条件をOR論理演算子で繋いでいます。前半と後半の条件では、それぞれプランと利用月数をAND論理演算子で繋いでいます。
2 演算子 と等しい(=)
3 2番目のオペランド True

 

【Step.9】テンプレートファイルを読み込む

プランの種類(ライト、ベーシック)に応じたテンプレートファイルを読み込みます。画面左側のアクション検索窓に「ファイルから」と入力します。「ファイルからテキストを読み取ります」アクションを、「if」アクションの内部にドラッグ&ドロップします。

read text file

 

すると、プロパティ設定の画面が開きます。下表の通りに各プロパティの値を編集します。続けて、「生成された変数」をクリックして、変数名が「%FileContents%」になっていることを確認します。「生成された変数」には、読み込んだテンプレートファイルのテキストデータが格納されます。基本的に、変数名はその中身を推測できる名称をつけるべきです。今回は、「%template%」に変更します。

edit property of read-text

 

No. プロパティ項目 設定する値
1 ファイルパス C:\Users\keisuke\Desktop\RPA\テンプレート\%plan%.txt
※プランの種類に応じたテンプレートファイルを選択するために、ファイル名には変数planを組み込みます。パス情報はあなたの環境に合わせて適宜変更してください。
2 エンコード UTF-8
※テンプレートファイルのエンコードを指定します。エンコードはあなたの環境に合わせて適宜変更してください。

 

【Step.10】テンプレート文を書き換える(企業)

読み込んだテンプレート文の冒頭には、「#COMPANY#」と「#NAME#」の記号が埋め込まれています。このまま送信すると都合が悪いため、各宛先の情報をもとに、これらを書き換える必要があります。

先ずは、「#COMPANY#」を具体的な値に書き換えます。画面左側のアクション検索窓に「置換」と入力します。「テキストを置換する」アクションを「ファイルからテキストを読み取ります」アクションの直下にドラッグ&ドロップします。

replace company

 

すると、プロパティ設定の画面が開きます。下表の通りに各プロパティの値を編集します。続けて、「生成された変数」をクリックして、変数名が「%Replaced%」になっていることを確認します。「生成された変数」には、置き換え後のテキストデータが格納されます。既に作成している変数templateに上書きするために、「%template%」に変更します。

edit property of replace-company

 

No. プロパティ項目 設定する値
1 解析するテキスト %template%
2 検索するテキスト #COMPANY#
3 置き換え先のテキスト %CurrentItem['企業']%

 

【Step.11】テンプレート文を書き換える(担当者)

次は、「#NAME#」を具体的な値に書き換えます。「テキストを置換する」アクションを「テキストを置換する」アクションの直下にドラッグ&ドロップします。

replace name

 

すると、プロパティ設定の画面が開きます。下表の通りに各プロパティの値を編集します。続けて、「生成された変数」をクリックして、変数名が「%Replaced%」になっていることを確認します。「生成された変数」には、置き換え後のテキストデータが格納されます。既に作成している変数templateに上書きするために、「%template%」に変更します。

edit property of replace-name

 

No. プロパティ項目 設定する値
1 解析するテキスト %template%
2 検索するテキスト #NAME#
3 置き換え先のテキスト %CurrentItem['担当者']%

 

【Step.12】Outlookを起動する

メールを送信するために、Outlookを起動するアクションを追加します。画面左側のアクション検索窓に「outlook」と入力します。「Outlookを起動します」アクションを、「For each」アクションの直前にドラッグ&ドロップします。Outlookの起動自体は一回でよいので、繰り返し処理に入る前に実行します。

open outlook

 

すると、プロパティ設定の画面が開きます。「生成された変数」に「%OutlookInstance%」が設定されていることを確認して、そのまま「保存」ボタンをクリックします。

edit property of open-outlook

 

【Step.13】Outlookでメールを送信する

Outlookでメールを送信するアクションを追加します。「Outlookからのメールメッセージの送信」アクションを、「If」アクションの内部の最後の「テキストを置換する」アクションの直下にドラッグ&ドロップします。

send mail

 

すると、プロパティ設定の画面が開きます。下表の通りに各プロパティの値を編集します。

edit property of send-mail

 

No. プロパティ項目 設定する値
1 アカウント xxxx@xx
※送信元のあなたのメールアドレスです。xxxxには適切な値を入力してください。
2 宛先 %CurrentItem['アドレス']%
※宛先のアドレスです。Excelリストの「アドレス」項目を設定します。
3 件名 製品のご利用に関するお知らせ
4 本文 %template%

 

【Step.14】Outlookを閉じる

最後に、Outlookを閉じるアクションを追加します。「Outlookを閉じます」アクションを、「For each」アクションの「End」の直下にドラッグ&ドロップします。繰り返し処理が終わった後に、Outlookを閉じています。(※このアクションの注意点については、後述の「5. チャレンジ課題」の課題1を参照)

close outlook

 

すると、プロパティ設定の画面が開きます。「Outlookインスタンス」に「%OutlookInstance%」が設定されていることが確認できます。「%OutlookInstance%」は、【Step.12】で起動したOutlookのインスタンス名です。

edit property of close-outlook

 

【Step.15】フローの実行

上部の「実行」アイコンをクリックし、このフローを実行してみましょう。なお、フローの作成画面から実行すると、「デバッグモード」で実行されるようで、処理速度が遅いです。実際の運用時には、管理画面から実行ボタンをクリックしてフローを実行しましょう。

run flow

 

以下の条件を満たす方(猿さん、鬼さん)にのみ、メールが送信されたと思います。

  • ライトプランかつ利用月数が3ヶ月以上の方
  • ベーシックプランかつ利用月数が3ヶ月未満の方

メール文の冒頭に「企業」と「担当者」が正しく記入されています。また、プランの種類(ライト、ベーシック)に応じて、異なるテンプレート文が適用されています。

result1

 

result2

 

5. チャレンジ課題

課題1

今回は、メールを繰り返し送信していく間隔が短いため、Outlook側のメール送信処理が追い付かず、一時的に「送信トレイ」にたまる現象が発生するかもしれません。この状態で、Outlookを閉じるアクションが実行されると少し都合が悪いです。この問題に対する解決策と実装方法を考えてみましょう。ヒントは、「待ち時間」です。

課題2

今回は、メール送信の処理を繰り返す度に、テンプレートファイルを「ファイルからテキストを読み取ります」アクションで毎回読み込んでいます。リスト内のデータ数が多い場合は、処理速度に影響が出る可能性も考えられます。この問題に対する解決策と実装方法を考えてみましょう。

 

6. まとめ

今回は、宛先情報が記載されたExcelリストを用いて、繰り返しメール送信する処理を自動化しました。下記の点を理解して、他の業務にも応用できるようにしましょう。

  • Excelの読み込み
  • 「For each」を使った繰り返し処理
  • 「If」を使った条件分岐
  • テキストデータの置き換え
  • Outlookによるメール送信

より深く「RPA」を学びたい方は、スクールでオンライン講義もやっていますので、良かったらこちらの記事もご覧ください。