memomoji | nanamoji

Microsoft365周辺、Power Appsの勉強、備忘録

電話応対用-他の人のスケジュール確認アプリ

代表電話にかかってくる不特定の人の今日の予定を検索できるアプリを作りました。ちょこちょこと課題もあるので、今の自分のレベルのメモとして作り方を公開しておこうと思います。

アプリ外観

必要な機能

  • ユーザーを検索して今日のスケジュールが表示される
  • 翌日以降の予定も表示できる
  • 繰り返し予定、日をまたぐ予定、終日予定も表示する。
  • 今現在の予定がわかる
  • よく検索する人はボタンで表示できるようにする
  • 検索した相手にチャットで電話メモを送れるようにする

実装

予定を取得する

益森さんのQiita記事を参考にさせていただきました。Microsoft Graph API や委任について、考慮すべき事項について詳しくわかりやすく書いていただいていますので、まずはこちらの記事にお読みください。
Power Platform で他人の予定表を操作する #PowerAutomate - Qiita

一度に取得できるイベントの数が10個までのようでしたので、今日の業務時間内の予定だけ取得するため、HTTPリクエストのURLを変更します。
List calendarView - Microsoft Graph v1.0 | Microsoft Learn
ここらへんのLearnを参考に調べていくと、下記でstartとendを指定して既定のカレンダーのイベントを取得できそうです。
日本語のLearnだと、”/calendar/calendarView” のところが "/calendarView" となっていますのでご注意を。PDFだと正しいです。

GET /users/{id | userPrincipalName}/calendar/calendarView?startDateTime={start_datetime}&endDateTime={end_datetime}

startDateTimeとendDateTime は、"2024-04-29T11:00:00.0000000" の書式で書きます。UTCなので、これで日本時間の9:00から取得できます。

グローバル変数 gblCalendar に、取得したイベント一覧をテーブルにして入れる部分は下記になります。
変数は別のところで指定しています。

  • CurrentUserN UPN
  • CurrentDate  取得する日付(2024-04-29)
Set(
    gblCalendar,
    Table(Office365Outlook.HttpRequest(
        "https://graph.microsoft.com/v1.0/users/"& CurrentUserN &"/calendar/calendarView?startDateTime="& CurrentDate &"T00:00:00.0000000&endDateTime="& CurrentDate &"T11:00:00.0000000",
        "Get",
        "",
        {ContentType: "application/json"}
    ).value)
); 

これでちゃんと、日付をまたぐ予定も繰り返し予定も終日予定も取得できます。 非公開の予定は件名が「非公開の予定」となります。

予定の入っている時間帯を色付けする

予定の入っている時間と今の時間

ここは、もっとスマートなやり方があるだろうと思いつつ、一つ一つ泥臭く設定しています(確実に無駄なことをしています。色くらいは変数にしたらよかったと後に後悔しました。)。
上段は、水平コンテナにテキストラベルを10個(9~18)置いて、各テキストラベルのFillに一つ一つ下記のようなコードを書いています。

If(
    ThisItem.Value.isAllDay,RGBA(133, 107, 244,1),
        If(
            And(
                DateTime(Year(CurrentDate),Month(CurrentDate),Day(CurrentDate),10,00,00) > DateAdd(DateTimeValue(ThisItem.Value.start.dateTime),-TimeZoneOffset(),TimeUnit.Minutes), DateTime(Year(CurrentDate),Month(CurrentDate),Day(CurrentDate),9,00,00) < DateAdd(DateTimeValue(ThisItem.Value.end.dateTime),-TimeZoneOffset(),TimeUnit.Minutes)), RGBA(133, 107, 244,1),RGBA(255, 255, 255, 1)
         )
)

「9」のテキストラベルでは、「開始時間が 10:00 未満、終了時間が 9:00 より後」をAND条件として、trueのときに着色します。以下同様に時間の部分だけ変えてやります。

今の時間は、9~18の入っている水平コンテナと同じ幅のコンテナにオレンジの四角を置いてやります。9~18はそれぞれ幅が30でギャップは0なので、オレンジのXに、下記の式を入れてやると今の時間のところに移動します。19時を過ぎるとコンテナの外側に出ていくので表示されなくなります。オレンジのない時間は電話対応する時間ではありません、帰りましょう。

(Hour(CurrentTime)-9)*30

1時間単位でしか表示していませんし、1日の予定が10件以上になった場合は漏れますが、電話対応用であれば概ね十分かなと思ってます(Outlookアドオンの予算が出なかったので妥協点として)。
久し振りにアプリを作ったので色々と調べながらだったのと、罠にはまったり余計なことをしたりしていたというのはありましたが、休日3日を使って出来上がりました。8割趣味なのでいいのですが、業務時間内に他の仕事をしながら作り上げるのは大変なことです。アプリに限らず、誰かが何かをやってくれたおかげで便利になったり助かったりしたら遠慮なく感謝をよろしくお願いします。