Outlookの予定を、Power Automateを使って30分間隔で自動的にSharePoint List(リスト)にコピーする方法を紹介します。
全体の概要
1人分のスケジュールをコピーするためには次のものが必要になります。
- リスト1つ
- Power Automateフロー1つ
もし2人分になれば、リスト2つ、フロー2つ必要です。
自分以外の予定をコピーすることもできますが、その場合はその人のアカウントからPower Automateを設定する必要があります。
Outlookの編集権限を自分に付与してもらう必要はありません。
それとは別に、次のものも必要です。
- 更新用リスト1つ
- 更新用 Power Automate フロー1つ
これらは人数が増えても減っても1つずつあれば大丈夫です。
つまり、1人分のOutlookスケジュールをリストにコピーしようとすれば、最低限リスト2つ、フロー2つが必要になります。
リストの準備
リストを2種類準備します。
まず1つ目は次のようにします。
仮にこのリストをスケジュールリストと呼称します。
・Title/1行テキスト(予定の件名を入れる)
・DateTime/日付と時刻(時間を含める、わかりやすい形式)(日時を入れる)
・Name/1行テキスト(誰の予定かわかるようにする)
このリストにはOutlookスケジューラーから抽出した予定が入ります。
1人1リストなので、もし複数人の予定を取り扱いたい場合は人数分のリストを準備します。
そして2つ目のリストはこちらです。
仮にこのリストを更新用リストと呼称します。
列は初期値のタイトルのままでいいです。
それ以外の列は不要です。
このリストに新しい項目が作成されたことをトリガーとし、30分間隔でOutlookの予定を吸い上げる Power Automate が動くようにしていきます。
ここではあえて「スケジュール済みクラウドフロー」は使いません。詳細は後述します。
Power Automate1つ目
Power Automateのフローも2種類用意します。
まず簡単なほうからいくと、全体像はこちらです。
スケジュール済みクラウドフローを使います。
中身は非常にシンプルな内容です。
自動発火は30分ごとです。
次に SharePointリストから複数の項目を取得しますが、先に作成した更新用リストを設定します。
詳細オプションは未入力のままです。
続いて残り2つのアクションがこちら。
更新用リストから取得した複数の項目を、Apply to each で削除します。
そして最後に SharePointリストの項目の作成で更新用リストを設定し、タイトル列に任意の値を入れましょう。
私の場合はわかりやすく「30分」としました。
これで1つ目のフローが完成です。
やっていることは、30分間隔で更新用リストの中身を全消去し、項目を1つ作成するということ。
更新用リストが更新されることで、次に作成するフロー2つ目のトリガーになります。
スケジュール済みクラウドフローを使わない理由
それは、人数が増えたとき、仮に発火の頻度を30分から変更したいときや、一時的にフローをストップするときに役立つためです。
いま紹介しているやり方は、1人につき1つフローを準備しますので、人数が増えるほどフローも増えます。
もしこれらのフローを「スケジュール済みクラウドフロー」のトリガーにしてしまうと、数の分だけ手動で変更しなくてはならず、大変です。
私が実業務で使うときは30人以上の予定を取得していますので、更新用リストを設けることで随分ラクしています。
Power Automate 2つ目
続いて予定を取得するフローの全体図がこちら。
自動化したクラウドフローを使います。
中身を見ていきます。
トリガーは、更新用リストに項目が作成された時にします。
これは1つ目のフローで30分間隔でリストが更新されるように設定済みのものですね。
続いて変数Today に、addHours を使って日本時間の現在時刻を格納します。
addHours(utcNow(),9,'yyyy-MM-dd')
変数Todayは後のアクションで使用します。
続き。
「イベントのカレンダービューの取得(V3)」アクションで、自分のカレンダーを指定し、開始時刻と終了時刻に式を設定します。
開始時刻
addHours(variables('Today'),-9)
終了時刻
addHours(addDays(variables('Today'),6), -9)
6というのは6日分を意味します。
取得したい日数に合わせて数字を変更してください。
カレンダーIDを選択する時、おそらく複数の候補が表示されます。
この場合は「予定表」を選択します。
そして変数 Kaishi を設定しておきます。
次に SharePoint「複数の項目の取得」アクションで、スケジュールリストを設定します。
次は複雑なアクションが続きます。
ここはtry-catchというエラー処理を施したアクションです。
スコープというのは複数のアクションをひとまとめにできる、いわばフォルダみたいな役割をします。
まず「スコープtry」の中身がこちら。
複雑なように見えますが、やっていることをまとめます。
スケジュールリストの中身を Apply to each で全消去。
消去後のスケジュールリストの項目を取得。
本当に全削除できているかを Do until で判断し、まだ削除しきれていなければ再び Apply to each で消去ループをまわす。
全削除できていれば次のアクション(スコープcatch)に進む。
というものです。
Do until の条件式はこちら。
length(outputs('複数の項目の取得_2')?['body/value'])
値の length がゼロ、つまり項目が全削除されたら Do until ループが抜ける仕組みです。
ごくまれに項目の削除アクションで削除しきれない現象があるため、こういう複雑な処理をしています。
次に「スコープcatch」の中身です。
中には通知アクションがあります。
エラー発生時に簡単なメッセージを送ることができるアクションです。
これで「スコープcatch」の中身は終了なのですが、もう1つ設定箇所があります。
「スコープcatch」アクションのメニューから「実行条件の構成」を選択します。
チェックボックスを画像のようにし、完了ボタンを押します。これでOKです。
Power Automateは基本的に1つ前のアクションでエラーが起きると、それ以降のアクション全てが中断されます。
ところが「実行条件の構成」から上記のようにチェックを入れることで、エラーが起こってもその次にくるアクションを実行させることができます。
これを利用し、もし「スコープtry」でエラーが起こった場合、「スコープcatch」でエラー通知を出し、次の「スコープfinally」アクションにつなげることができるのです。
こういうやり方をエラー処理、例外処理といったりします。
実行条件を設定した場合、矢印で示したようにアクション同士を繋ぐ線が点線表示になっていることがわかります。
最後に「スコープfinally」の中身です。
イベントのカレンダービューの取得で取得した予定をスケジュールリストにコピーする作業です。
「項目の作成」のDateTime列の式はこちら。
addHours(variables('Kaishi'), 0, 'yyyy/MM/dd HH:mm:ss')
これでPower Automate2つ目は完成となります。
フローを動かした結果
完成したフローを動かすには、更新用リストに項目を追加します。
1つ目に設定したフローが動くのを待つのもよし、更新用リストに手動でレコードを追加してもよし。
ただしくフローが設定できていれば、スケジュールリストにOutlook予定の件名と日時が並びます。
あとはこのリストを使ってPower Appsで予定を表示させるなど使いましょう。