タスクの締切前日に Teams に通知する方法

SharePoint リスト と Power Automate を利用して、タスクの締切日前日に通知する方法です。
Microsoft 365 のライセンスがあれば実現できます。
今回は同日に複数のタスクの締切が来ることを想定しています。
最終的に以下のような通知が来るフローです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/9614162d-ba90-2523-866f-9530b8a6efb5.png)

1日1タスクなら、こっちのやり方の方が単純で良いかなと思います。

https://note.com/yurimiyasakura/n/n0890d827bd45

どちらもごひいきによろしくお願いいたします。

## 前提条件
- フローはモダンデザイナーで作成しています。
- Microsoft 365 のライセンスが必要です。
- フィルタークエリで内部列名を使用します。その為、SharePoint リストの締切日の列を日本語にする場合は、最初に英語でつけてから、日本語に直した方が良いです。
    内部列名って何？って方はヨウセイさんの記事を参照してください。
    
https://youseibubu.com/apps/spo_internalname/
    

# SharePoint リストの用意
以下の様にタスク名と締切日が格納できる SharePoint リストを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/9b39419e-41f8-40a0-db92-2174cdd91bbe.png)


締切日は日付だけが格納される設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/bc6b9ca3-e347-7a62-d66c-35c243d46cc8.png)


# Power Automate 側の設定
## 全体像
毎日、明日締切のタスクがあるかどうかを確認して、あった場合だけ Teams に通知するフローです。
今回は同日に複数のタスクの締切が来ることを想定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/c6240211-1632-a62d-9301-66668cf53a6b.png)



## フローの作成

1. 作成 > スケジュール済みクラウドフロー をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/5692d7ab-18b9-707d-8856-78a7a131e8b1.png)

2. フロー名を入力し、繰り返し間隔を「1日」にして、作成をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/58966000-bd9a-6953-d058-d1d3a4bf8511.png)


3. フローデザイナーが表示されます。


## 明日の日付の取得
SharePoint リストに格納されている締切日の前日かどうかを判断するためには、Power Automate で明日の日付を取得します。

1. アクションの追加から「現在の時刻」を追加します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/5967c500-6326-ac4e-fcdc-389988146a08.png)

    これで今日の日付が協定世界時で取得できます。
    通知を必要とする人のタイムゾーンが協定世界時ならこのままで良いのですが、私は日本にいるので次の手順で日本標準時に直していきます。

2. アクションの追加から「タイムゾーンの変換」を追加します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/93869bb4-acc2-33da-cd51-5bf6152a5774.png)

3. Base Time に現在の時刻アクションの「Current time」を入れます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/382aa784-7f55-0346-8975-8439c048176c.png)

4. Source Time Zone と Destination Time Zone を以下の様に設定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/053fad65-3076-4bac-f167-1c3545354101.png)

5. Time Unit を短い日付のパターンにします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/39c45e6e-9dce-33e7-e01c-8667a581af4c.png)


6.  アクションの追加から「時間への追加」を追加します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/385b30cf-0f62-634f-701d-89dd5f0c37dc.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/0dc53081-aaa2-24a8-79b7-6f150e3f0667.png)

7. Base Time をタイムゾーンの変換の「Converted Zone」にします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/fab30de8-59f8-5b68-9d26-4f380ac75b48.png)

8. Interval を「1」、Time Unit を「Day」にします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/48410e54-2b9c-f40d-a5e4-ffaedfa19a80.png)

    これで今日の日付に「1日」追加された日付が取得できます。

9. 変数を初期化するアクションを追加します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/a4b635cc-a997-a2d2-4046-9a7cf9928cea.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/8e33c561-7435-a64c-de65-4ff2106722eb.png)

10. 変数の名前を入力し、Type を「String（文字）」にします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/30e96a15-a5d3-527a-efc7-f438fc1801b9.png)

    :::note info
    変数名は何でもよいです。
    ただ半角英数字の方がトラブルが起きにくいので、半角英数字での名づけを推奨します。
    :::


11. Value の部分には式を入力します。

    ```
    formatDateTime(body('時間への追加'),'yyyy-MM-dd')
    ```
    :::note warn
    body('時間への追加') は動的なコンテンツから指定すると式を作りやすいです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/b26c37b5-88a1-46e3-489d-02d96678f281.png)

    :::

12. 式を保存（更新）します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/3a801730-3718-9fef-047b-a6a2e3afc68f.png)

    これで明日の日付が「2024-03-03」という形式で取得できました。
    この形式は SharePoint の日付の形式に合わせています。
    
## タスクリストから明日のタスクだけを抽出する

1. アクションの追加で、SharePoint の「複数の項目の取得」を追加します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/ab8fbb90-fb00-f2cb-590b-0c571049fbbe.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/122060ba-94d7-091e-198d-1bdb1a6d09fe.png)

2. 「サイトのアドレス」とリスト名を設定します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/a62dbb54-14bd-4b53-8c01-71257e8aa579.png)

3. 詳細パラメーターの「すべてを表示」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/822e30dd-9ab1-6f5c-b5a2-e768356958a6.png)

4. フィルタークエリ に以下の式を入力します。

    ```
    内部列名 eq ''
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/f62112f3-163a-b776-1d11-541d06e5635c.png)

    :::note info
    eq はいイコールという意味です。
    eq の前後には半角スペースが入ります。
    

5. シングルクォーテーションの間に変数のアクションを初期化する の変数を入れます。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/bb4fa9e4-a446-5d33-b036-341d65b29d1b.png)

    これでタスクリストから明日締切のものだけをフィルタ出来るようになりました。

## 締切前日タスク一覧の作成

締切前日タスクの件数分、Teamsに通知が飛んでしまうと、あまりにも煩わしい & 圧が強いので、1つのメッセージで複数のタスクをまとめて通知できるように設定します。

1. 変数を初期化するアクションを追加します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/ccb8d0f8-073d-98e4-3ef3-e2af97d69a68.png)

2. 変数の名前を入力し、Type を「Array」に設定します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/45f38812-b47c-dcb1-3df8-f8dfce585d0d.png)

3. 配列変数に追加アクションを追加します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/c680962f-6109-0712-5090-7ac058d6e399.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/eed4e4e1-8fd4-e94c-49e1-6506a98b8559.png)


4. Name で先ほど作成したArray型の変数を指定し、Value に複数の項目の取得からタイトル列を指定します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/c0fa11ed-6565-7229-2d03-caaa20d72bd0.png)

    ※自動的に For Each（ Apply to Each ）がかかります。

5. For each の外側に結合アクションを追加します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/e0c6cf61-c217-0534-c980-b73cda52c238.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/ab43558b-eeb2-a06b-aad3-687974608d1d.png)

6. From にアレイ型の変数、 Join with にHtmlの改行コードを入れます。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/3a042cc0-d305-7e73-52fe-6f2b74149259.png)

    ```
    <br>
    ```
    これで明日締切のタスク一覧が完成します。

## 明日締切のタスクがある時だけ通知する条件処理

毎日締切に追われている！！
私には土日も祝日もないんだ！！という方もいらっしゃるかもしれませんが、今回はホワイト企業らしい締切前日の時もあれば、そうじゃない時もある……という働き方を想定します。
ゆえに締切前日のタスクがある時はTeamsで通知、ないときは何もしないという条件式を書いていきます。

1. アクションの追加で、条件を追加します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/dd06ad8c-dbfc-fe3c-068e-11ac9d46018b.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/512438fc-d8de-8d0c-9e87-34faf2ec02bb.png)


2. 条件の左側に以下の式を書きます。
    ```
    length(outputs('複数の項目の取得')?['body/value'])
    ```

   :::note warn
    outputs('複数の項目の取得')?['body/value'] は動的なコンテンツから指定できます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/f014b713-4dd9-cc27-1f14-8cf190118071.png)

   :::
   

3. 真ん中のプルダウンで「is greater or equal to」を指定して、右側の値を1にします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/4768ded0-f06c-1d7e-94a3-639f5ad3852a.png)

    これで複数の項目の取得でのフィルタリング結果が1件以上あった時だけTeams への通知が行えるようになりました。

## Teams への通知

1. 条件式のTrue の中に、チャットまたはチャネルでメッセージを投稿するアクションを追加します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/8349a435-dc21-d19a-8a80-2dae4e737294.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/993034b7-4542-f9f2-a687-0dded98ea2f2.png)

2. 投稿者・投稿先・Team・Channel を設定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/b35e590e-cd44-1854-434e-b8dc36243af6.png)

3. Message を以下のように設定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/84aa3bfd-566f-3848-f5c5-6f30a55f9b86.png)

テストすると以下のようなメッセージが投稿されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/4df92805-f337-50f4-11e0-5b7261c60ff2.png)