Excelで作成したToDoリストからPower Automateを使ってリマインドをする

## はじめに
複数人でタスクを共有する際にExcelを用いてToDoリストを作成し、SharePointに格納して運用していました。
当日のタスクを取り出して自動でリマインドを行う機能があったらいいなと思い、「Power Automate」を用いてTeamsで通知を送るフローを作成してみました。

## To Do リスト
ExcelによるTo Doリストは以下のイメージです。
※Power Automateで情報を取得するために「テーブル」形式にしておきましょう。
（範囲選択⇒挿入⇒テーブル）

今回重要となるのが「締め切り」の列です。この列をキーとして処理を行っていきます。
![スクリーンショット 2025-01-25 224242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/41379826-e9c8-edbf-10c9-d059f5804bc1.png)



## 全体像
以下の3つのブロックに分かれています。

①変数の定義
②情報取得
③メッセージ作成＆送信

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/0debd2dd-9012-6b13-5368-d34d0f32a2c7.png)


## 各ブロックの詳細
### トリガー
毎朝8:00に処理が実行されるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/d9e01171-70c7-0cd7-1010-d6a0f36db9b0.png)


### ①変数の定義
最初に「現在日」を```utcNow()```関数を用いて取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/ad8ac9bc-473d-88e0-74d8-47fa15367e12.png)

そのままでは「現在日」が協定世界時（UTC）のため、タイムゾーンの変換を行います。
この際、書式設定文字列で「yyyy-MM-dd」に設定しておきます。これはExcelから日時を取得した際の形式と合わせて一致判定を行うためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/b0eb119e-15f8-4717-d7bc-4b4b9ad211b5.png)

次に、「flag」を定義します。
（※この変数は「条件分岐のループの中で該当する行（当日のタスク）が複数存在する際、その数だけ通知送信を実行してしまう」という動作を最初の1回に限定するために対処療法的に設定しています。おそらくもっとうまくやる方法があるはず。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/3574ad99-aa2a-ee40-485a-cb7a047bd7fa.png)


### ②情報取得
Excelのテーブルから情報を取得します。以下に各項目の詳細を記します。
・場所、ドキュメントライブラリ、テーブル：SharePointに格納されている正しい場所を指定します。
・フィルタークエリ：「テーブルのキー列の名前（今回は締め切り） eq 変換後の時間（現在日のタイムゾーンを変換したもの）」とすることで、該当する（当日の）タスクのみを取り出すことができます。
・DataTime形式：「ISO 8601」を選択。
⇒「シリアル値」は取り扱いが難しいため非推奨。（※「ISO 8601」「シリアル値」について知りたい方は[こちらの記事をどうぞ](https://qiita.com/tfunakoshi/items/3bda73b2454a6e85008d#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/a5a939ec-57b0-cf85-9317-b1e3a4da2821.png)



### ③メッセージ作成＆送信
取得した情報に当日のタスクがある場合だけ処理を実行したいので条件を設けます。
・「締め切り」に「変換後の時間」が含まれている場合
・「flag」が0である（初回の処理）
でANDをとっています。2つ目の条件は前述のとおりです。

> 「条件分岐のループの中で該当する行（当日のタスク）が複数存在する際、その数だけ通知送信を実行してしまう」という動作を最初の1回に限定するために対処療法的に設定しています。おそらくもっとうまくやる方法があるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/0dfd77ed-cbfd-5223-de01-9b15d3d081bd.png)

「はい」の場合は当日のタスクがある場合の処理です。まず「flag」の値を加算させます。
次に「アレイのフィルター処理」によってテーブルの要素を当日のタスクのみにします。
（※この処理はExcelからの情報取得時の「フィルタークエリ」と同じ働きのため、不必要である可能性があります。）

そして、日付の形式が「ISO 8601」のデフォルトだと「2021-02-02T00:00:00.000Z」となり、通知として非常に読みづらいので形式を変換します。ここでは「タイムゾーンの変換」を用いて変換を行っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/740d20cc-4a40-9626-afcc-ad22af0c842b.png)

前処理を行ったので表形式に整形していきます。
・「HTMLテーブルの作成」
・「選択」：実際のメッセージでは行と列が入れ替わります。
⇒タスク概要は式に```item()?['タスク概要']```と入力しています。
・「HTMLテーブルの作成」：動的なコンテンツは「選択」の「本文」を選ぶようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/90672d93-6ba4-1fb5-2d12-fd4baa2aab4b.png)

最後にTeamsのメッセージと連携させます。動的なコンテンツは「HTMLテーブルの作成 2」の「出力」を選択するようにしてください。あとはお好きな場所・形式で通知を設定するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/c84dfbfe-3cf8-7120-f731-63698089ee4d.png)

実行されるとこのような形で通知を受け取ることができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476594/b97f9cd0-7443-3916-013e-b459ed59487f.png)



## おわりに
最初は「シリアル値」をキーとして用いようとしていたのですが、やはり取り扱いが難しく断念しました。

Power Automateをうまく使うコツとして特に今回は

・関数（式）を用いて「変数」アクションを自在につかうこと
⇒動的なコンテンツとして取り扱いが容易になる
・日付は表示形式の変換に気を付ける
⇒「タイムゾーンの変換」が有効

の2点を痛感しました。
定期的に触れて業務効率化を図っていきたいと思います。

## 参考文献
【全体】
[1] https://mocabrown.com/blog/archives/6402
⇒全体の流れ（繰り返し、Excelデータ取り出し、アレイ操作）を参考にさせていただきました。

[2] https://blog.jbs.co.jp/entry/2022/03/18/162733
⇒こちらも全体の流れを参考にさせていただきました。特に、Excelからデータを取得する際のプロパティ（フィルター クエリ）が大変ありがたい情報でした。

【日付関連（表示形式など）】
[3] https://blog-tips.sekenkodqx.jp/2022/04/30/power-automate-function-adddays/
⇒「addDays」関数の参考にさせていただきました。

[4] https://blog-tips.sekenkodqx.jp/2020/08/09/power-automate-datetime/
⇒日付のデータの取り扱い方（変数の種類、フォーマット変換）の参考にさせていただきました。

[5] https://qiita.com/tfunakoshi/items/3bda73b2454a6e85008d#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB
⇒Excelから日時を「ISO 8601」形式で出力するのに際して参考にさせていただきました。

[6] https://www.fulogabc.net/entry/pa-date-keisiki#toc3
⇒こちらも日付表示形式に関して参考にさせていただきました。

[7] https://mimulife.com/power_automate_serial_value_change_date_string/
⇒今回は結局Excelから取得する日時の形式を「ISO 8601」で行ったため出番がありませんでしたが、「シリアル値」を使用する場合大変参考になる文献。