私のチームでは、Power Appsで作成した勤怠連絡アプリをチームメンバーで共同利用しています。
そのアプリの改善案として「アプリを実行した人の予定表に在宅か出社かを分かるようにOutlook予定表へ予定を入れたい」というリクエストが有りました。
実装しようとしたところ、実行者の予定表に予定を入れるにはいくつか設定が必要であることが分かりました。
本記事では、その設定方法をご紹介します。
前提
Power Appsで作成したアプリとPower Automateフローを連携して、勤怠連絡を行っています。
Power Apps側でボタンを押すと、Teamsにメッセージ投稿されるという仕組みです。
Teamsへのメッセージ投稿は、全員同じチャネルにするようにしています。
実現したかったこと
Power Appsで勤怠報告のボタンを押した際に、実行者が在宅勤務の場合、予定表に終日予定として「在宅」というアイテムを作成しようとしていました。
発生した事象と原因
作成していたフロー
Office 365 Outlookのアクション「イベントの作成 (V4)」を利用して、予定表に予定を作成しようとしていました。*1*2
すると、アプリを実行した人の予定表ではなく、アクションの接続者であるユーザーの予定表に予定が登録されてしまいました。
実行履歴から出力を確認
「イベントの作成 (V4)」アクションの出力を確認すると、「"id"」が表示されていることが分かります。
これは予定表IDというもので、それぞれの予定表に対して一意の値となっています。
つまり、Power Appsでボタンを押したユーザーの予定表に予定を登録するには、Power Appsで実行したユーザー自身の予定表IDを取得しないといけないということが分かります。
ですが、「イベントの作成 (V4)」アクションで「予定表」を選択すると、コネクタ接続者自身の予定表に登録されてしまいます。
フローを実行したユーザーの予定表情報を取得するには、どうすればよいのでしょうか。
フローを実行したユーザーの情報は取得できる
作成していたフローのトリガーは「Power Apps がフローを呼び出したとき (V2)」ですが、このトリガーを使ったフローはインスタント フローと呼ばれます。
インスタント フローでは、フローを実行したユーザーの情報を取得できることが分かりました。
これでユーザーの予定表IDを取得できれば、実行したユーザーの予定表に予定を登録できることが出来そうです。
対応策
全体イメージ
実行したユーザーが持っている予定表情報を全て取得し、その中から名前が「予定表」か「Calendar」の予定表情報を取得します。
取得した予定表情報のうち、個人予定表IDを抜き出して、イベントを作成する際に該当の予定表IDを指定します。
トリガーについて
既に記載していますが、トリガーはインスタントフローである必要があります。
今回はPower ApssからPower Automateを実行するような勤怠アプリであったため、「Power Apps がフローを呼び出したとき (V2)」トリガーを利用しています。
※ それぞれ実装したい環境に合わせて設定を確認してください。
また、作成したフローで「実行専用アクセス許可」設定をする必要があります。
実行専用アクセス許可設定方法
対象のフローを開き、[ 実行のみのユーザー ]の[ 編集 ]を選択します。
Office 365 Outlookが「実行専用のユーザーによって提供されました」となっていることを確認します。
※ 設定されていない場合は「実行専用のユーザーによって提供されました」を選択して保存してください。
実行したユーザーのカレンダー情報を取得
ここからは、追加したアクションの設定を見ていきます。
「カレンダーの取得 (V2)」アクションでは、設定をする必要がありません。
このままで、該当ユーザーのOutlookにある予定表情報を取得できます。
個人予定表の情報取得
「アレイのフィルター処理」アクションでは、「カレンダーの取得 (V2)」アクションで抜き出した情報のうち、予定表の名前が「予定表」か「Calendar」になっているものを抜き出します。
「From」部分は「カレンダーの取得 (V2)」アクションの出力結果を動的コンテンツから設定しています。
「Filter Query」部分の式は詳細設定モードで以下のように設定しています。基本モードではor条件が利用できず、1つの条件でしかフィルターをかけることが出来ないためです。
@or(equals(item()?['name'], '予定表'), equals(item()?['name'], 'Calendar'))
※ 検証している際、ユーザーによって個人予定表の名前が「予定表」か「Calendar」になっていることが分かりました。そのため、どちらの場合でも対応できるようにするため、or条件を利用しています。
個人予定表IDを抽出
「作成」アクションではfirst関数を用いて式を設定しています。
式の内容は以下の通りです。
first(body('アレイのフィルター処理'))?['id']
first関数は配列のうち、最初の要素を抜き出すものです。また「'id'」と指定することで、「フィルターした配列の中で最初の'id'を抜き出す」という意味合いになります。
first関数の詳細については、Microsoft learnのリファレンスページもご覧ください。
抜き出した予定表IDを「イベントの作成 (V4)」アクションで設定
抜き出した予定表IDを「イベントの作成 (V4)」アクションで設定してあげることで、実行したユーザーの予定表に予定を作成することが出来ます。
実行履歴を確認
実際の出力結果を確認していきます。
「カレンダーの取得 (V2)」アクション
実行したユーザーが表示できる予定表の一覧が表示されています。
「アレイのフィルター処理」アクション
取得した予定表一覧のうち、カレンダーの名前が「予定表」か「Calendar」となっているものを抜き出しています。
このユーザーの個人予定表の名前は「予定表」でした。
「作成」アクション
first関数を用いて、「アレイのフィルター処理」アクションで抜き出した情報の中から最初の「"id"」を抜き出しています。
上記の流れで個人の予定表IDを抜き出すことが出来ました。
おわりに
Power Automateで実行したユーザーの予定表へ予定を入れたい場合の方法をご紹介しました。
チーム内においてPower Appsで作成した勤怠アプリを利用するケースも多いと思いますので、参考になれば嬉しいです。