デスクワークを超絶快適にするおすすめギアたち詳しく見る

PADでOutlookから期間を指定してメールを取得する方法

じょじお

この記事ではPower Automate for desktopを使ってOutlookメールを期間していして取得する方法について学習します!

目次

「Outlookからメールメッセージを取得します」アクションは期間指定ができない。

ぽこがみさま

メールを期間指定して取得できません。

じょじお

そうなんですよね。「Outlookからメールメッセージを取得します」アクションはメール期間指定のオプションがありません。

▲指定できる条件は下記になります。

「Outlookからメールメッセージを取得します」アクションで利用できるフィルター条件

  • 送信者名
  • 宛先
  • 件名
  • 本文
  • 添付ファイルの有無
じょじお

図の設定画面を見てわかるようにフォルダや送信者名、件名などで絞ることはできますが期間指定ができません。そこで期間指定して取得する方法を考えてみました。

メールを期間して取得する方法

じょじお

ループアクションとIFアクションを使ってメールの日付をチェックする方法をご紹介します

Power Automate for desktopフローの作成方法

Outlookからメールを取得する処理

STEP
今回のゴールを確認します。
  1. とある「メール件名」を条件にしてメールをOutlookから取得します。
  2. ユーザから下記の2つの日付をダイアログで受け取ります。
    • 期間の開始日
    • 期間の終了日
  3. メール受信日が、この期間にマッチするメールで新しいListを作成します。
Power automate for desktopで特定の期間のメールを抽出するフロー
STEP
Power Automate for desktopを起動して新規フローを作成します。
STEP
「Outlookを起動します」アクションを追加します。

Power Automate for desktopのフローを実行する前に、Outlookがすでに起動していた場合は自動的にそちらを参照してくれます。2重起動はしません。頭良いですね。

生成される変数:OutlookInstance

STEP
「Outlookからメッセージを取得します」アクションを追加します。

▲「Outlookからメールメッセージを取得します」アクションを追加します。今回は下記の条件でメールを取得します。

Inboxフォルダ内にある「M365 Service Health Notification」という件名のメール

メールフォルダは皆さんの環境に合わせてください。デフォルトのメールフォルダは「受信箱」とか「Inbox」という名前になっているかと思います。自動仕分けなどを使ってフォルダ分けしている方は、そのフォルダ名を指定することも可能です。

今回は下記のように入力しました。件名で絞ってメールを取得します。

  • Outlookインスタンス:%OutlookInstance%
  • アカウント:メールアドレスを入力します。
  • メールフォルダ:Inbox
  • 取得:すべてのメールメッセージ
  • 件名に次が含まれています:M365 Service Health Notification

生成される変数:%RetrievedEmails%

Column

Outlookに専用フォルダを作成して自動仕分けしておくと良いよ!

すべてのメールをデフォルトの受信箱に受信している場合に、PADで受信箱からメールを取得すると大量のメールが取得されてしまいフロー実行に時間がかかってしまうことがよくあります。

PADで処理する必要があるメールは「Outlookの自動仕分け」機能を使って事前に専用フォルダに振り分けておくと良いかと思います。

下記の記事内で「Outlookの自動仕分け」の設定方法について紹介していますので参考になさってください。

フローの実行時間の増加の原因になるため、なるべく条件を絞ってメールを取得しましょう。

STEP
「Outlookを閉じます」アクションを追加します。

このアクションはPower Automate for desktopで開く前に、開いていたOutlookも閉じてしまいます。OutlookってPC電源オン中はずっと常駐起動させておく方が多いと思いますのでもしかしたら不要かもしれません。

STEP
「一覧の並び替え」アクションを追加します。

「Outlookからメッセージを取得します」で取得したメールはリスト形式の変数に格納されますが、並び順がバラバラです。ループ処理の時に都合が悪いので「一覧の並び替え」アクションを使って日付で降順に並び替えます。

  • 並べ替えるリスト:%RetrievedEmails%
  • リスト項目のプロパティで並び替え:オン
  • 並べ替えの基準にする最初のプロパティ:Date
  • 並べ替え:降順
STEP
1度フローを実行します。

ここでテストでフローを実行して%RetrievedEmails%変数の中身を確認してメールが取得できるか確認してみましょう。

図のように189件のメールが取得できました。

日付を加工する処理①

STEP
ゴールの確認
Power Automate for desktopのダイアログ

フローを実行すると、上の図のようなダイアログを表示させてユーザから開始日と終了日を指定してもらう流れにします。

今回作成するフローでは基本的には1か月分のメールを取得することを想定しているので、開始日には1か月前の日付、終了日はフローを実行した日をデフォルト値に設定できるようにします。デフォルト値を用意しておくと入力の手間が省けるので時短につながります。ここではこの日付の文字列をデフォルト値として挿入する処理をつくっていきます。

  • 開始日のデフォルト値:フローを実行した日の30日前
  • 終了日のデフォルト値:フローを実行した日
STEP
「現在の日付を取得します」アクションを追加します。

現在の日付を取得します。これが終了日のデフォルト値になります。

生成される変数:%CurrentDateTime%

STEP
「加算する日時」アクションを追加します。

上で取得した現在時刻%CurrentDateTime%から1か月マイナスして1か月前の日付を取得します。これが開始日のデフォルト値になります。

生成される変数:%DefaultStartDate%

STEP
「日付の選択ダイアログを表示」アクションを追加します。

このアクションはユーザに日付を選択してもらうダイアログを表示するアクションです。

  • ダイアログのタイトル:日付を選んでね。
  • ダイアログメッセージ:1つ目の日付は範囲の開始日、2つ目の日付は範囲の終了日を選んでください!順番間違えるとうまく取得できないので注意してね。
  • ダイアログの種類:日付範囲(2つの日付)
  • 次のプロンプト:日付のみ
  • 規定値:%DefaultStartDate%
  • 2番目の日付の規定値:%CurrentDateTime%

生成される変数:%SelectedDateFirst%(最初に選択された日付)

生成される変数:%SelectedDateSecond%(2番目に選択された日付)

生成される変数:%ButtonPressed%

STEP
「加算する日時」アクションを追加します。①
  • 日時:%SelectedDateSecond%
  • 加算:1
  • 時間単位:日

生成する変数:%SelectedDateSecond%

STEP
「加算する日時」アクションを追加します。②
  • 日時:%SelectedDateSecond%
  • 加算:-1
  • 時間単位:秒

生成する変数:%SelectedDateSecond%

この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秒となってます。

STEP
「加算する日時」アクションを追加します。③
  • 日時:%SelectedDateFirst%
  • 加算:-1
  • 時間単位:秒

生成する変数:%OutOfTheLoopDate%

以上で日付を加工する処理は終わりです。

日付をチェックする処理

STEP
日付をチェックする処理を作ります。

ここからはメールをループ処理で1件ずつ取り出して受信日を確認し、指定期間内の受信日かどうかをチェックしていきます。上の図が今回作成する処理です。

STEP
「For each」アクションを追加します。

▲For Eachアクションを追加します。

  • 反復処理を行う値:%RetrievedEmails%
  • 保存先:CurrentItem
STEP
「if」アクションを追加します。
  • 最初のオペランド:%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になります。

STEP
(Ifの中の処理)「項目をリストに追加」アクションを追加します。

先程のif条件文にマッチしたメールに対する処理を作成します。つまり指定期間内のメールであった場合の処理です。今回は指定期間内のメールであったらリストを作成しようと思いますので「項目をリストに追加」アクションを追加します。

  • 項目の追加:%CurrentItem%
  • 追加先リスト:%FilteredMailList%
STEP
「Else if」アクションを追加します。

「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秒以前のメールであった場合には、次に追加する「ループを抜ける」アクションでループを抜けます。

STEP
「ループを抜ける」アクションを追加します。
STEP
「メッセージを表示します」アクションを追加します。

処理の最後のアクションとして「メッセージを表示します」アクションを追加します。

  • 表示するメッセージ:メールのすべての件数は、%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学習教材

Power AutomateをKindleで学びたい方はコチラ

▲Kindleと紙媒体両方提供されています。デスクトップフロー、クラウドフロー両方の解説がある書籍です。解説の割合としてはデスクトップフロー7割・クラウドフロー3割程度の比率となっています。両者の概要をざっくり理解するのにオススメです。

Power Automate for Desktopの基本をしっかり学習するのにオススメです。RPA界隈では有名なRPAエンジニア集団である『ロボ研』さんが監修されている解説書です。テスト用の業務Webシステム/デスクトップ業務アプリを使いながら実践形式で学習できる点が一番のメリットかなぁと思います。

Power Automate クラウドフローの入門書です。日本語の解説書は数少ないのでレアかと思います。変数の解説から代表的なアクションの解説がされているので初心者におすすめの本です。

Microsoft 365/ Power Automate / Power Platform / Google Apps Script…

Power Automateを動画で学びたい方はコチラ

▲Udemyで数少ないPower Automateクラウドフローを主題にした講座です。セール時は90%OFF(1200円~2000円弱)の価格になります頻繁にセールを実施しているので絶対にセール時に購入してくださいね。満足がいかなければ返金保証制度がありますので安心してご購入いただけます。

この記事が気に入ったら
フォローしてね!

シェアしてくれたらウレシイ(·:゚д゚:·)
  • URLをコピーしました!
  • URLをコピーしました!
目次
閉じる