ささみ学習帳 - sasami's study book

ささみ学習帳

Microsoft365 や Power Platform について学んだこと・アイデアのメモ

いつも返信が遅いあの御方にメールを送った時には自動的にTo Doに返信を催促するタスクを登録する Power Automate クラウドフロー

 

はじめに

先日投稿した「Outlook (on the web) でメールを送信した時をトリガーにPower Automate クラウドフローを実行する」の活用例です。

 

以前「指定したメールスレッドで相手からの返信が一定期間滞ったら、To Doに返信を催促するタスクを登録するフロー」を作成しました。

sasami-axis.hatenablog.com

今回はこのフローの派生バージョンです。

上記のフローは、送信したメールに分類(カテゴリ)を設定することで、要注意なスレッドを指定していました。

頻繁にメールのやり取りが必要なあの御方だけどいつも返信が滞るんだよな…なんて時は、毎回メールにカテゴリ設定を行うのがちょっと手間になってきます。

そこで特定の人にメールを送信したら、To Doに催促タスクを登録する作業を自動的で行うフローを作成してみました。

 

動作イメージ

指定した人宛にOutlookでメールを送信して少し待つと…

送信済みアイテムのメールに「要注意カテゴリ」が自動設定されます。

自分のTo Doを開くと返信を確認するタスクが自動登録されています。

そして宛先の御方から返信が来ました!

早速さらに返信をしてみます。

するとタスクの期日も返信した日+7日に更新されます。

スレッドのやり取りが終了したら、To Doでタスクを完了させましょう。

 

フロー全体図


フロー解説

1.[Office 365 Outlook] 新しいメールが届いた時 (V3) トリガー

新しいメールトリガーで送信済みアイテムフォルダーを指定することで、メール送信をトリガーとすることができます。

  • フォルダー
    • 送信済みアイテム

今回は特定の宛先にメールを送信した時にフローを実行したいのですが、パラメーターで宛先、CC,ToまたはCCでは、複数条件を指定することはできません。複数の宛先を指定する場合は、トリガー条件で指定することができます。

宛先に2つ指定する場合は下記の式で設定します。

@or(contains(triggerBody()?['toRecipients'], 'xxxxx@email.com'),contains(triggerBody()?['toRecipients'], 'yyyyy@email.com'))

 

2.[Control]スコープ - スレッドの最新メールを取得

2-1.[Office 365 Outlook] HTTP 要求を送信します-指定スレッドのメッセージを取得

トリガーの出力に含まれる値ではやや情報が不足しているため、Graph APIで送信メールのスレッドを取得します。

Graph API のメッセージを取得するエンドポイントを利用します。

learn.microsoft.com

スレッド全体を取得して、後続処理で最新のメールを処理しています。

 

2-2.[Data Control]作成-latestMail

スレッド内の最新のメールを取得しています。

 

  • 入力
    • sort関数で送信日時(snetDateTime)昇順に並び変えたのちに、reverse関数で逆転させて、1つ目のメール(=スレッドで最新のメール)を取得します
    • reverse(
          sort(
              body('HTTP_要求を送信します-指定スレッドのメッセージを取得')?['value'],
              'sentDateTime'
              )
      )[0]

 

3.[Control]スコープ-要注意カテゴリを設定

以前「指定したメールスレッドで相手からの返信が一定期間滞ったら、To Doに返信を催促するフロー」と動作を統一するためにメールにカテゴリを設定しています。このフローの主目的としては必ずしも必要ない部分です。

 

メールの分類(カテゴリ)の更新に関しては以前こちらでもまとめています。

sasami-axis.hatenablog.com

 

3-1.[Data Control]作成-CategoryName

Outlookでメールに設定する分類の名前を指定します。

 

3-2.[Data Contaol]作成-new categories

 

  • 入力
    • if(empty(body('HTTP_要求を送信します-指定スレッドのメッセージを取得')?['categories']),
          concat('["',outputs('作成-CategoryName'),'"]'),
          union(
              body('HTTP_要求を送信します-指定スレッドのメッセージを取得')?['categories'],
              outputs('作成-CategoryName')
          )
      )

元メールにカテゴリが設定されていない場合は新規にカテゴリの配列を作成し、そうでない場合はunion関数で既存のカテゴリの値と追加するカテゴリの値を1つの配列にまとめます。

こうすることで既存のカテゴリに要注意カテゴリを追加しています。

 

3-3.[Office 365 Outlook] HTTP 要求を送信します-メールのカテゴリを更新

 

4.[Control]スコープ - To Doのデフォルトリストのidを取得

今回のフローではTo Doの既定のリスト「タスク」にタスクを作成します。

タスクを登録する際にリストを指定する必要があります。デフォルトリストのidを取得します。この辺りの解説はこちらの記事にまとめています。

sasami-axis.hatenablog.com

 

4-1.[Microsoft To-Do (Business)]すべてのTo do リストを一覧表示する (V2)

アカウントのすべてのTo Doリストを取得します。

4-2.[Data Control]アレイのフィルター処理-defaultList

既定のリスト「タスク」が内部的には"defaultList"という名前を持っています。通所のリストの名前は言語背って次第で変わっていましますが、こちらの内部名は変わらないため、defaultListを条件でフィルターしています。

  • From
    • @{body('すべての_To_do_リストを一覧表示する_(V2)')}
  • Filter Query
    • @{item()?['wellknownListName']}
    • is equal to
    • defaultList

 

4-3.[Data Control]作成-defaultList id

  • 入力
    • @{body('アレイのフィルター処理-defaultList')[0]?['id']}

 

5.[Control]スコープ - To Doにタスク登録

メールをタスクに登録します。

ただし、同じスレッドのメールが既に登録されている場合は、そのタスクを更新することでタスクが増殖しないようにしています。

5-1.[Microsoft To Do (Business)]フォルダー別にTo Doを一覧表示する(V2)

同じスレッドのメールのタスクが登録されているか確認するために、リスト内のタスクをすべて取得します。

  • To Do リスト
    • @{outputs('作成-defaultList_id')}
  • 上から順に取得
    • 999

 

5-2.[Data Control]アレイのフィルター処理-未完了タスクのみ

5-1.で取得したタスクから完了していないものだけを抽出します。完了済みタスクは除外することで、再び返信が滞った場合にタスクとして再登録できるようにしています。

  • From
    • @{body('フォルダー別に_To_Do_を一覧表示する_(V2)')}
  • Filter Query
    • @{item()?['status']}
    • is not equal to
    • completed

 

5-3.[Data Control]作成-TaskKey

タスクを更新する際に同じスレッドのメールであることを識別するためのキー項目をスレッドIDを使って作成します。

 

  • 入力
    • $$key$$:@{triggerOutputs()?['body/conversationId']}

 

5-4.[Data Control]アレイのフィルター処理-タスク存在チェック

既存のタスクに同じスレッドのタスクが存在しないかをチェックします。

このフローで作成したタスクは本文に5-3のキー情報を埋め込んでいるため、この値の有無でチェックすることができます。

  • From
    • @{body('アレイのフィルター処理-未完了タスクのみ')}
  • Filter Query
    • @{item()?['body/content']}
    • contains
    • @{outputs('作成-TaskKey')}

 

5-5.[Control]条件-タスクがない場合は新規、あれば更新

5-4の出力の数で処理を分岐します。

  • 条件
    • AND
  • 条件1
    • length(body('アレイのフィルター処理-タスク存在チェック'))
    • is equal to
    • 0

 

5-5.(Yes).[Microsoft To Do (Business)]To Doを追加する(V3)

メールの情報を基にタスクを追加します。

 

  • To Doリスト
    • @{outputs('作成-defaultList_id')}
  • タイトル
    • 【📧返信要確認】@{items('それぞれに適用する-各スレッドの最新メッセージ')?['Subject']}
  • 期日
    • ※7日後としています。
    • addDays(utcNow(),7)
  • リマインダー日時
    • ※すでに遅延した時点でタスク登録するため7日後の9時にしています。
    • convertFromUtc(
      addDays(utcNow(),7),
      'Tokyo Standard Time',
      'yyyy-MM-ddT00:00:00'
      )
  • 重要度
    • high
  • 本文コンテンツ
    • キー情報とOutlook on the Webのメールリンクを本文にセットします。
    • @{outputs('作成-TaskKey')}
      @{item()?['webLink']}
  • リマインダーをオンにする
    • はい

 

5-5.(No).[Microsoft To Do (Business)]To Doを更新する(V2)

メールの情報を基にタスクを更新します。

  • To Doリスト
    • @{outputs('作成-defaultList_id')}
  • タイトル
    • 【📧返信要確認】@{items('それぞれに適用する-各スレッドの最新メッセージ')?['Subject']}
  • 期日
    • ※7日後としています。
    • 今回のフローは自分が返信した場合に動作する為タスクの更新でも期日を更新します。
    • addDays(utcNow(),7)
  • リマインダー日時
    • ※すでに遅延した時点でタスク登録するため7日後の9時にしています。
    • 今回のフローは自分が返信した場合に動作する為タスクの更新でも期日を更新します。
    • convertFromUtc(
      addDays(utcNow(),7),
      'Tokyo Standard Time',
      'yyyy-MM-ddT00:00:00'
      )
  • 重要度
    • high
  • 本文コンテンツ
    • キー情報とOutlook on the Webのメールリンクを本文にセットします。
    • @{outputs('作成-TaskKey')}
      @{item()?['webLink']}