この記事ではPower Automate for desktopを使ってOutlookメールを期間していして取得する方法について学習します!
「Outlookからメールメッセージを取得します」アクションは期間指定ができない。
メールを期間指定して取得できません。
そうなんですよね。「Outlookからメールメッセージを取得します」アクションはメール期間指定のオプションがありません。
▲指定できる条件は下記になります。
「Outlookからメールメッセージを取得します」アクションで利用できるフィルター条件
- 送信者名
- 宛先
- 件名
- 本文
- 添付ファイルの有無
図の設定画面を見てわかるようにフォルダや送信者名、件名などで絞ることはできますが期間指定ができません。そこで期間指定して取得する方法を考えてみました。
メールを期間して取得する方法
ループアクションとIFアクションを使ってメールの日付をチェックする方法をご紹介します
Power Automate for desktopフローの作成方法
Outlookからメールを取得する処理
- とある「メール件名」を条件にしてメールをOutlookから取得します。
- ユーザから下記の2つの日付をダイアログで受け取ります。
- 期間の開始日
- 期間の終了日
- メール受信日が、この期間にマッチするメールで新しいListを作成します。
Power Automate for desktopのフローを実行する前に、Outlookがすでに起動していた場合は自動的にそちらを参照してくれます。2重起動はしません。頭良いですね。
▲「Outlookからメールメッセージを取得します」アクションを追加します。今回は下記の条件でメールを取得します。
メールフォルダは皆さんの環境に合わせてください。デフォルトのメールフォルダは「受信箱」とか「Inbox」という名前になっているかと思います。自動仕分けなどを使ってフォルダ分けしている方は、そのフォルダ名を指定することも可能です。
今回は下記のように入力しました。件名で絞ってメールを取得します。
- Outlookインスタンス:%OutlookInstance%
- アカウント:メールアドレスを入力します。
- メールフォルダ:Inbox
- 取得:すべてのメールメッセージ
- 件名に次が含まれています:M365 Service Health Notification
Outlookに専用フォルダを作成して自動仕分けしておくと良いよ!
すべてのメールをデフォルトの受信箱に受信している場合に、PADで受信箱からメールを取得すると大量のメールが取得されてしまいフロー実行に時間がかかってしまうことがよくあります。
PADで処理する必要があるメールは「Outlookの自動仕分け」機能を使って事前に専用フォルダに振り分けておくと良いかと思います。
下記の記事内で「Outlookの自動仕分け」の設定方法について紹介していますので参考になさってください。
このアクションはPower Automate for desktopで開く前に、開いていたOutlookも閉じてしまいます。OutlookってPC電源オン中はずっと常駐起動させておく方が多いと思いますのでもしかしたら不要かもしれません。
「Outlookからメッセージを取得します」で取得したメールはリスト形式の変数に格納されますが、並び順がバラバラです。ループ処理の時に都合が悪いので「一覧の並び替え」アクションを使って日付で降順に並び替えます。
- 並べ替えるリスト:%RetrievedEmails%
- リスト項目のプロパティで並び替え:オン
- 並べ替えの基準にする最初のプロパティ:Date
- 並べ替え:降順
ここでテストでフローを実行して%RetrievedEmails%変数の中身を確認してメールが取得できるか確認してみましょう。
図のように189件のメールが取得できました。
日付を加工する処理①
フローを実行すると、上の図のようなダイアログを表示させてユーザから開始日と終了日を指定してもらう流れにします。
今回作成するフローでは基本的には1か月分のメールを取得することを想定しているので、開始日には1か月前の日付、終了日はフローを実行した日をデフォルト値に設定できるようにします。デフォルト値を用意しておくと入力の手間が省けるので時短につながります。ここではこの日付の文字列をデフォルト値として挿入する処理をつくっていきます。
- 開始日のデフォルト値:フローを実行した日の30日前
- 終了日のデフォルト値:フローを実行した日
現在の日付を取得します。これが終了日のデフォルト値になります。
上で取得した現在時刻%CurrentDateTime%から1か月マイナスして1か月前の日付を取得します。これが開始日のデフォルト値になります。
このアクションはユーザに日付を選択してもらうダイアログを表示するアクションです。
- ダイアログのタイトル:日付を選んでね。
- ダイアログメッセージ:1つ目の日付は範囲の開始日、2つ目の日付は範囲の終了日を選んでください!順番間違えるとうまく取得できないので注意してね。
- ダイアログの種類:日付範囲(2つの日付)
- 次のプロンプト:日付のみ
- 規定値:%DefaultStartDate%
- 2番目の日付の規定値:%CurrentDateTime%
- 日時:%SelectedDateSecond%
- 加算:1
- 時間単位:日
- 日時:%SelectedDateSecond%
- 加算:-1
- 時間単位:秒
この2つの「加算する日時」アクションで、%SelectedDateSecond%を当日の23時59分59秒にしてます。
例えば%SelectedDateSecond%に2月14日が選択された場合、実際には2月14日0時0分0秒になります。このまま比較すると、例えば2月14日15時に届いたメールがマッチしなくなってしまいます。このため日付計算アクションで2月14日23時59分59秒に計算しなおしてます。
計算方法としては、最初の「加算する日時」アクションでは1日加算して2月15日0時0分0秒にして、次の「加算する日時」アクションでマイナス1秒減算して2月14日23時59分59秒となってます。
- 日時:%SelectedDateFirst%
- 加算:-1
- 時間単位:秒
以上で日付を加工する処理は終わりです。
日付をチェックする処理
ここからはメールをループ処理で1件ずつ取り出して受信日を確認し、指定期間内の受信日かどうかをチェックしていきます。上の図が今回作成する処理です。
▲For Eachアクションを追加します。
- 反復処理を行う値:%RetrievedEmails%
- 保存先:CurrentItem
- 最初のオペランド:%CurrentItem.Date >= SelectedDateFirst AND CurrentItem.Date <= SelectedDateSecond%
- 演算子:と等しい(=)
- 2番目のオペランド:True
例えば最初の日付(SelectedDateFirst)に2月1日、次の日付(SelectedDateSecond)に2月28日が選択されたとします。
この場合のときに例えば2月2日受信日のメールは「2月2日 >= 2月1日 AND 2月2日 <= 2月28日」となります。ANDの左側の式も右側の式もどちらも矛盾がないので、条件式の判定はTrueになります。
3月1日受信日のメールは「3月1日 >= 2月1日 AND 3月1日 <= 2月28日」となります。ANDの左側はマッチしますが、右側の式「3月1日 <= 2月28日」は矛盾がありますのでマッチせず、条件式の判定はFalseになります。
先程のif条件文にマッチしたメールに対する処理を作成します。つまり指定期間内のメールであった場合の処理です。今回は指定期間内のメールであったらリストを作成しようと思いますので「項目をリストに追加」アクションを追加します。
- 項目の追加:%CurrentItem%
- 追加先リスト:%FilteredMailList%
「Else if」アクションを追加します。「Else if」アクションはIFアクションとセットで使用するのですが、IFの条件文にマッチしなかった場合にチェックされる条件文です。このアクションは無くても大丈夫なのですが、処理速度向上のために入れています。
%OutOfTheLoopDate%は最初に選択された日付に1秒マイナスした日付です。例えば最初の日付に2月1日、次の日付に2月28日が選択された場合、%OutOfTheLoopDate%は1月31日23時59分59秒となります。1月31日23時59分59秒以前のメールをいくら比較してもマッチすることはありません。無駄なループが繰り返されて処理時間が増えることを避けるために、1月31日23時59分59秒以前のメールかどうかも同時にチェックします。1月31日23時59分59秒以前のメールであった場合には、次に追加する「ループを抜ける」アクションでループを抜けます。
処理の最後のアクションとして「メッセージを表示します」アクションを追加します。
- 表示するメッセージ:メールのすべての件数は、%RetrievedEmails.Count%件です。
そのうち指定期間のメールは %FilteredMailList.Count%件です。 - メッセージボックスアイコン:情報
以上でフローは完成です。
動いている動画
下のTweetの動画は実際にフローが動作している様子です。少しアレンジして、UberEatsの領収書メールから注文金額を抜き取って1か月分のUber費を算出するフローです。
Robinソースコード
Outlook.Launch Instance=> OutlookInstance Outlook.RetrieveEmailMessages.RetrieveEmails Instance: OutlookInstance Account: `` MailFolder: `` EmailsToRetrieve: Outlook.RetrieveMessagesMode.All MarkAsRead: False Messages=> RetrievedEmails Outlook.Close Instance: OutlookInstance Variables.SortList.SortListByProperty List: RetrievedEmails Property1: $'''Date''' SortDirection1: Variables.SortDirection.Descending SortDirection2: Variables.SortDirection.Ascending SortDirection3: Variables.SortDirection.Ascending SortedList=> RetrievedEmails DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime DateTime.Add DateTime: CurrentDateTime TimeToAdd: -1 TimeUnit: DateTime.TimeUnit.Months ResultedDate=> DefaultStartDate Display.SelectDateDialog.SelectDateRange Title: $'''日付を選んでね。''' Message: $'''1つ目の日付は範囲の開始日、2つ目の日付は範囲の終了日を選んでください!順番間違えるとうまく取得できないので注意してね。''' DateDialogFormat: Display.DateDialogFormat.DateOnly DefaultValue: DefaultStartDate DefaultValueForSecondDate: CurrentDateTime IsTopMost: True SelectedDate=> SelectedDateFirst SecondSelectedDate=> SelectedDateSecond ButtonPressed=> ButtonPressed DateTime.Add DateTime: SelectedDateSecond TimeToAdd: 1 TimeUnit: DateTime.TimeUnit.Days ResultedDate=> SelectedDateSecond DateTime.Add DateTime: SelectedDateSecond TimeToAdd: -1 TimeUnit: DateTime.TimeUnit.Seconds ResultedDate=> SelectedDateSecond DateTime.Add DateTime: SelectedDateFirst TimeToAdd: -1 TimeUnit: DateTime.TimeUnit.Seconds ResultedDate=> OutOfTheLoopDate LOOP FOREACH CurrentItem IN RetrievedEmails IF (CurrentItem.Date >= SelectedDateFirst AND CurrentItem.Date <= SelectedDateSecond) = $'''True''' THEN Variables.AddItemToList Item: CurrentItem List: FilteredMailList NewList=> FilteredMailList ELSE IF CurrentItem.Date <= OutOfTheLoopDate THEN EXIT LOOP END END Display.ShowMessageDialog.ShowMessage Message: $'''メールのすべての件数は、%RetrievedEmails.Count%件です。 そのうち指定期間のメールは %FilteredMailList.Count%件です。 ''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed2
▲フローデザイナーにコードを貼り付けることでここで作成したフローを再現できます。よろしかったらお試しください。ご利用になる場合はメールアドレスやメールフォルダなどのパラメータをご自身の環境に合わせて入力してから試してください。
まとめ
Power automate for desktopでメールを期間指定して取得する方法について学習しました。
このブログではRPA・ノーコードツール・VBA/GAS/Pythonを使った業務効率化などについて発信しています。
参考になりましたらブックマーク登録お願いします!
Power Automate学習教材
▲Kindleと紙媒体両方提供されています。デスクトップフロー、クラウドフロー両方の解説がある書籍です。解説の割合としてはデスクトップフロー7割・クラウドフロー3割程度の比率となっています。両者の概要をざっくり理解するのにオススメです。
▲Power Automate for Desktopの基本をしっかり学習するのにオススメです。この本の一番のメリットはデモWebシステム・デモ業務アプリを実際に使ってハンズオン形式で学習できる点です。本と同じシステム・アプリを使って学習できるので、本と自分の環境の違いによる「よく分からないエラー」で無駄に躓いて挫折してしまう可能性が低いです。この点でPower Automate for desktopの一冊目のテキストとしてオススメします。著者は日本屈指のRPAエンジニア集団である『ロボ研』さんです。
▲Power Automate クラウドフローの入門書です。初心者の方には図解も多く一番わかりやすいかと個人的に思っています。
Microsoft 365/ Power Automate / Power Platform / Google Apps Script…
▲Udemyで数少ないPower Automateクラウドフローを主題にした講座です。セール時は90%OFF(1200円~2000円弱)の価格になります。頻繁にセールを実施しているので絶対にセール時に購入してくださいね。満足がいかなければ返金保証制度がありますので安心してご購入いただけます。