LoginSignup
5
6

担当者ごとにPlannerタスクを抽出してフォローするフロー

Posted at

はじめに

Plannerのタスクは自動で担当者に通知が届く機能がありますね。
今日はそれだけでは満足できない場合、特に上司・管理者がメンバーの状況をフォローしたいときのフローです。

動作イメージはこんな感じです。
image.png

メンバーそれぞれにメンションを付けて、まだ完了していない割り当てタスクをフォローします。

フローの解説

フローの全体像です。
image.png

各アクションを展開したものがこちら

image.png

チームのメンバーとプランのタスク一覧を取得して、タスクの完了状況や割り当てメンバーでフィルターし、各メンバーにTeamsでメンションつきフォローメッセージを送ります。

残りタスクがない場合を考慮して条件分岐を追加しています。

このフローの肝となる部分

Plannerタスクの割り当てでフィルター処理を行うのは、普通にやろうとするとかなりの手間がかかります。

特に複数のタスクを扱うには手間のかかる作業ですが、ちょっとした工夫で簡単にできるようにするのが今回の内容です。

一般的な手法?

特定のユーザーに、このタスクが割り当てられているかどうかを判断するためには、普通にやろうとすると、これくらいの手間がかかります。
image.png

1つのタスクについて調べるのに、これだけの手間がかかるとすると、複数のタスクを扱うときには…あまり考えたくないですね。

2種類の割り当て

先の煩わしさを解消するために、先にPlannerタスクから取得できる情報について解説しておきます。

Plannerの割り当てを示すプロパティには何故か2種類あり、形は違うものの中身はどちらも同じ内容です。

① _assignments (配列形式)
"_assignments": [
    {
        "userId": "割り当てられたユーザーのId",
        "value": {
            "@odata.type": "#microsoft.graph.plannerAssignment",
            "assignedDateTime": "割り当てられた日時",
            "orderHint": "並び順を示す文字列",
            "assignedBy": {
                "user": {
                    "id": "割り当てたユーザーのId"
                },
                "application": {
                    "displayName": null,
                    "id": "{$applicationId}"
                }
            }
        }
    }
]
② assignments (ディクショナリ形式)
"assignments": {
    "割り当てられたユーザーのId": {
        "@odata.type": "#microsoft.graph.plannerAssignment",
        "assignedDateTime": "割り当てられた日時",
        "orderHint": "並び順を示す文字列",
        "assignedBy": {
            "user": {
                "displayName": null,
                "id": "割り当てたユーザーのId"
            },
            "application": {
                "displayName": null,
                "id": "{$applicationId}"
            }
        }
    }
}

どちらも割り当てられたユーザーのIdが含まれていますが、それを配列として表現しているか、ディクショナリとして表現しているかの違いがあります。

ちなみに、動的なコンテンツ"割り当て"で指定できるのは、①配列形式の_assignmentsです。
image.png

image.png

この配列形式の_assignmentsは、普段Power Automate で扱っている馴染みのあるオブジェクト構造なのですが、いま必要としている割り当てられたユーザーのIdが、奥の方にしまい込まれているため、フィルター処理に使うために一度浅いところまで引っ張り出すという作業が必要になってしまっています。

解決法:keyを条件にする

そこで、浅い場所に割り当てられたユーザーのIdがあるassignments (ディクショナリ形式) を使用します。

フローではこの部分で行っています。
image.png

アレイのフィルター処理の差出人には一覧取得したタスクを指定します。
このフローでは事前に完了済みのタスクを省いているので表示が異なりますが、下図と同じ扱いです。
image.png

条件の左辺には、先ほどのassignmentsを指定します。
ただし、動的なコンテンツからは直接指定できないので、数式の入力から以下のように指定します。
image.png

assignments
item()?['assignments']

残りは、右辺にフィルター対象のユーザーID、条件は「次の値を含む」とすればOKです。
image.png

「次の値を含む」で絞り込めるわけ

この条件を詳細モードで確認すると、contains関数が使用されていることが確認できます。

image.png
image.png

詳細な条件式
@contains(item()?['assignments'],items('Apply_to_each')?['id'])

contains関数は、引数1の中に引数2が含まれるかどうかを調べる関数です。
では、この関数の詳しい仕様を確認してみましょう。

関数のリファレンス ガイドは、式を入力する画面からfxボタンを押すと確認できます。
image.png

大事なのはココ。
ディクショナリ形式のキーに対しても、検索が有効となっている点です。
image.png

この仕様を有効に使うことで、Plannerタスクの割り当てフィルター処理を簡単に行うことができました。

おわりに

今回はPower Automate で初心者がつまずきがちなポイント、配列やjsonの扱い、さらに関数の使用まで行いました。

ローコードと信じて入ってきた人には少し酷かもしれませんが、乗り越えられると本当にできることの幅が広がるので、ぜひ挑戦してほしいものです😄

今回は見た目にはこだわりませんでしたが、テーブルのスタイルを変更してキレイな表にしてみたり、日付の書式を変更してわかりやすくするとさらに使い勝手がよくなると思います。

解説は以上です。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6