28
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Power Appsでリソースや他人の空き時間を確認して予約する

Last updated at Posted at 2024-09-14

緒言

Xでたくさん反響をいただいた下記投稿のアプリの作り方。
image.png
機能としては選択したリソース(他人でもOK)の空き時間可視化とワンクリック確保。

そもそも@Takashi_Masumoriさんの記事と、その記事のアプリをダウンロードして勉強させていただいたおかげで作成できました。ありがとうございます!

作り方

データ接続

本アプリで使用しているデータ接続は下図の2つのみ。
image.png

定数の設定

下図のように4つの定数をFormulasプロパティで設定しておく。
image.png
_ResourceList:リソースアカウント格納
_MyProfile:アプリ利用者のアカウント情報
_MyCalenderID:アプリ利用者のOutlookカレンダー「予定表」のID
_BusinessHour:稼働時間タイムテーブル(8~18時とする)

CalenderGetTablesV2name="予定表"の条件でLookUpすればアプリ利用者のOutlookカレンダーIDを取得可能だが、"予定表"の部分は海外メンバーの場合は当然表記が異なるので要注意

主なコントロール

本アプリのポイントとなるコントロールは下図の3つ
image.png

リソース選択ギャラリー
前述の_ResourceListItemsプロパティに設定し、チェックボックスでリソースを選択。

隠しボタン 1
空き時間情報を更新するコードをOnSelectに記述。WidthHeightをゼロにして、他のコントロールからSelect関数で空き時間情報を更新したい時に呼び出す。

空き時間可視化ギャラリー
隠しボタンで取得した空き時間情報を基にタイムテーブル可視化。ワンクリックでリソース予約できるボタンも配置。リソース選択ギャラリーで選択されたレコードを格納したコレクションをデータソースにするギャラリーの中に、前述の_BusinessHourをデータソースに持つギャラリーが入れ子になっている。

リソース選択ギャラリーの設定

Itemsプロパティは前述の_ResourceListを設定。
ギャラリー内にチェックボックスを配置し、チェックされるとコレクションColSelectedResoucesにチェックしたリソース情報が格納されるよう、チェックボックスのOnCheckプロパティに下記を設定。

Collect(ColSelectedResources,{
    ID:ThisItem.Id,
    DisplayName:ThisItem.DisplayName,
    Resource:ThisItem,
    MeetingTime:Office365Outlook.FindMeetingTimesV2({
        RequiredAttendees:ThisItem.Mail,
        MeetingDuration:_baseMinute,
        IsOrganizerOptional:true,
        Start:_selectedDate,
        End:DateAdd(_selectedDate,1,TimeUnit.Days),
        MaxCandidates:40
    }).meetingTimeSuggestions
})

ポイントになるFindMeetingTimesV22は指定した出席者のOutlookカレンダー空き時間情報に基づいて会議可能時間を返すアクション。IsOrganizerOptionalオプションがデフォルトではfalseになっているところをtrueにするのがポイントで、これをしておけば自分自身の予定情報が加味されず純粋に相手方の空き情報が返されるようになる。

チェックボックスのOnUnCheckプロパティには下記を設定し、チェックがはずされるとコレクションから除外されるようにしておく。

Remove(ColSelectedResources, LookUp(ColSelectedResources, ID=ThisItem.Id))

隠しボタンの設定1

WidthHeightをゼロに設定し画面上は見えないように。OnSelectを必要な時に呼び出すユーザー定義関数的な使い方。
FindMeetingTimesV2MeetingDurationStartEnd等の空き情報取得条件が変化した時に再取得するよう下記をOnSelectに記述する。

Clear(ColSelectedResources);
ForAll(
    Filter(GalleryResources.AllItems,Checkbox1.Value=true),
    // GalleryResourcesはリソース選択ギャラリーのこと
    Collect(ColSelectedResources,{
        ID:ThisRecord.Id,
        DisplayName:ThisRecord.DisplayName,
        Resource:ThisRecord,
        MeetingTime:Office365Outlook.FindMeetingTimesV2({
            RequiredAttendees:ThisRecord.Mail,
            MeetingDuration:_baseMinute,
            IsOrganizerOptional:true,
            Start:_selectedDate,
            End:DateAdd(_selectedDate,1,TimeUnit.Days),
            MaxCandidates:40
        }).meetingTimeSuggestions
    })
)

あとは必要なタイミングにSelect関数でこのボタンアクションを呼び出す。

空き時間可視化ギャラリーの設定

本アプリ最大の山場。使用するコントロールの構成は下図の通り。
image.png
GallerySelectedResources水平ギャラリーでItemsプロパティは前述のColSelectedResourcesで、LabelDisplayNameに各リソースのDisplayNameが表示されるようにしておく。
GalleryTimeTable垂直ギャラリーでItemsプロパティは前述の_BusinessHourを設定し、各リソースごとの空き時間可視化のためのタイムテーブルとなる。_BusinessHourの中身は下図のような30分間隔のテーブルとしている。
image.png
RectangleSeparator(目盛線)やLabelTime(時間ラベル)は1時間単位で表示されるようにVisibleプロパティをMod(ThisItem.Value,1)=0としている。
予定有りを灰色網掛けするためのRectangleBusyのプロパティ設定は下記のようにした。

Y: 0
Height: =Parent.TemplateHeight*_baseMinute/30
Visible: |-
    =IsBlank(
        LookUp(
            LookUp(ColSelectedResources,DisplayName = LabelDisplayName.Text).MeetingTime,
            TimeValue(
                DateAdd(
                    DateTimeValue(meetingTimeSlot.start.dateTime),
                    -TimeZoneOffset(),
                    TimeUnit.Minutes
                )
            ) = ThisItem.Time
        )
    )

LookUpが2回出てきて複雑だが、要するに30分ごとにFindMeetingTimesV2の空き時間を検索して空きが無い(IsBlank)状態だったら予定有りということでVisibletrueになるという考え方。LookUpが2回出てきているのはGallery In Galleryの内側から親Galleryのレコードを取ってくるため。。。何かスマートなテクニックがあったような気がする。。。

最後に、クリックして空き時間予約3するボタンButtonReserveのプロパティは下記。

X: =RectangleBusy.X
Y: =RectangleBusy.Y
Height: =RectangleBusy.Height
Width: =RectangleBusy.Width
Visible: =!RectangleBusy.Visible
OnSelect: |-
    =With(
        {
            _dateTime: DateTimeValue(
                Text(_selectedDate,"yyyy-mm-dd") & " " &
                Text(ThisItem.Time,"hh:mm")
            )
        },
        Office365Outlook.V4CalendarPostItem(
            _MyCalenderID,
            "MTG",
            _dateTime,
            DateAdd(_dateTime,_baseMinute,TimeUnit.Minutes),
            "(UTC+09:00) Osaka, Sapporo, Tokyo",
            {
                requiredAttendees: LookUp(
                    ColSelectedResources,
                    DisplayName = LabelDisplayName.Text
                ).Resource.Mail
            }
        )
    )

結言

SharePointリスト等のデータソースすら不要で慣れれば2~3時間で作成できる割に使い勝手が良くて個人的にも気に入ってます!リソース予約に重点を置いて書いてますが、リソースアカウントだけでなく人のアカウントでも同様のことができるのでアイデア次第でいろいろできそうで良いなと思ってます。

  1. ヨウセイさんのイベントで教えていただいたテクニックです。 2

  2. 詳細はLearn参照

  3. 詳細はV4CalendarPostItem

28
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?