緒言
Xでたくさん反響をいただいた下記投稿のアプリの作り方。
機能としては選択したリソース(他人でもOK)の空き時間可視化とワンクリック確保。
そもそも@Takashi_Masumoriさんの記事と、その記事のアプリをダウンロードして勉強させていただいたおかげで作成できました。ありがとうございます!
作り方
データ接続
定数の設定
下図のように4つの定数をFormulas
プロパティで設定しておく。
_ResourceList
:リソースアカウント格納
_MyProfile
:アプリ利用者のアカウント情報
_MyCalenderID
:アプリ利用者のOutlookカレンダー「予定表」のID
_BusinessHour
:稼働時間タイムテーブル(8~18時とする)
CalenderGetTablesV2
でname="予定表"
の条件でLookUp
すればアプリ利用者のOutlookカレンダーIDを取得可能だが、"予定表"
の部分は海外メンバーの場合は当然表記が異なるので要注意
主なコントロール
リソース選択ギャラリー
前述の_ResourceList
をItems
プロパティに設定し、チェックボックスでリソースを選択。
隠しボタン 1
空き時間情報を更新するコードをOnSelect
に記述。Width
とHeight
をゼロにして、他のコントロールから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
})
ポイントになるFindMeetingTimesV2
2は指定した出席者のOutlookカレンダー空き時間情報に基づいて会議可能時間を返すアクション。IsOrganizerOptional
オプションがデフォルトではfalse
になっているところをtrue
にするのがポイントで、これをしておけば自分自身の予定情報が加味されず純粋に相手方の空き情報が返されるようになる。
チェックボックスのOnUnCheck
プロパティには下記を設定し、チェックがはずされるとコレクションから除外されるようにしておく。
Remove(ColSelectedResources, LookUp(ColSelectedResources, ID=ThisItem.Id))
隠しボタンの設定1
Width
とHeight
をゼロに設定し画面上は見えないように。OnSelect
を必要な時に呼び出すユーザー定義関数的な使い方。
FindMeetingTimesV2
のMeetingDuration
やStart
、End
等の空き情報取得条件が変化した時に再取得するよう下記を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
関数でこのボタンアクションを呼び出す。
空き時間可視化ギャラリーの設定
本アプリ最大の山場。使用するコントロールの構成は下図の通り。
GallerySelectedResourcesは水平ギャラリーでItems
プロパティは前述のColSelectedResources
で、LabelDisplayNameに各リソースのDisplayName
が表示されるようにしておく。
GalleryTimeTableは垂直ギャラリーでItems
プロパティは前述の_BusinessHour
を設定し、各リソースごとの空き時間可視化のためのタイムテーブルとなる。_BusinessHour
の中身は下図のような30分間隔のテーブルとしている。
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
)状態だったら予定有りということでVisible
がtrue
になるという考え方。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時間で作成できる割に使い勝手が良くて個人的にも気に入ってます!リソース予約に重点を置いて書いてますが、リソースアカウントだけでなく人のアカウントでも同様のことができるのでアイデア次第でいろいろできそうで良いなと思ってます。
-
ヨウセイさんのイベントで教えていただいたテクニックです。 ↩ ↩2