ないものは作ればいい、日程調整アプリを改造したお話

アドベントカレンダー初参戦です。

はじめましてdai365と申します。

素人がこんな記事書いていいものかわかりませんが、齢50になるオジサンです。

気が付いたらPowerPlatformの魅力にとりつかれておりまして、何故かこんな記事を書いています。

 

せっかくなので12月に限り何本か記事を書かせていただきたいと思います。

内容はこの1年にやってみたことかなと・・・

くれぐれも言ってきますが、素人なので技術的なことはヘッポコです(笑)

 

日程調整アプリは便利だぞ

今年の春先に某MS社から日程調整アプリをいただく機会に恵まれました。

このアプリ、期間と会議時間、会議の参加予定者を選んでボタンを押すと会議の候補を出してくれると言う優れものです。

ちなみに元々はこの記事と同じ機能です。
https://qiita.com/Takashi_Masumori/items/bc3c4588a18ad852a246

いや、別にそのままでも十分に便利になるんですよ、これは

 

なんですが、心の中の私が叫びます(笑)。

これ、このままリリースしたら確実に「会議室の空きがわかる機能ないの?」と言われることは必然でした。

 

とはいえこの当時の私はズブの素人(今でもただのポエマーですが)、そんな改造ホントに出来るんかいって感じでやってみたお話です。

 

まずは検索ボタンで何をやっているのかの確認をしてみました。

ClearCollect(colMeetingTimes,AddColumns(Office365Outlook.FindMeetingTimesV2({RequiredAttendees: Concat(colAttendees,userPrincipalName & ";"),

MeetingDuration: cmbDuration.Selected.Minutes,

Start: Text(DateTimeValue(dteStart.SelectedDate & " " & drpStartTime.Selected.Value), DateTimeFormat.UTC),

End: Text(DateTimeValue(dteEnd.SelectedDate & " " & drpEndTime.Selected.Value), DateTimeFormat.UTC),

MaxCandidates: 20,

IsOrganizerOptional: false,

ActivityDomain: "work",

MinimumAttendeePercentage: 10}

).meetingTimeSuggestions,

"StartTime", // Convert return from UTC to local time.

DateAdd(

DateTimeValue(meetingTimeSlot.start.dateTime),

-TimeZoneOffset(),

TimeUnit.Minutes),

"EndTime", // Convert return from UTC to local time.

DateAdd(

DateTimeValue(meetingTimeSlot.end.dateTime),

-TimeZoneOffset(),

TimeUnit.Minutes)));

 

今でこそ、これスラスラ読めるんですが、当時は七転八倒でしたね(笑)一個づつ解読ですよ。今ならChat-GPTに放り込めばOKだとわかるんですけどね、どんだけトホホだったんだか。



つまり、これはOffice365Outlook.FindMeetingTimesV2という関数で、スケジュールの調整をするということをやっています。

で、その結果をcolMeetingTimesというコレクションに格納しています。

 

思えばこのときほぼ初めてに等しいくらいLearnをマジマジと読んだ記憶があります。

 

で、ですね、じゃあ会議室どうする?

最初に思いつくのは会議室も会議参加予定者に入れちゃう?ってのなんですが、これには欠点があります。

それは会議室が空いていなくても例えば4人+会議室で会議室だけ空いていなくても80%とかって候補が出てきます。嫌ですよね、これ。

 

ってことで何をしたかというと

会議室だけ別コレクションを作ることにしました。これはさっきの応用で簡単にできます。

ClearCollect(colMeetingTimes3,AddColumns(

Office365Outlook.FindMeetingTimesV2({RequiredAttendees: Concat(

colAttendees3,userPrincipalName & ";"),

MeetingDuration: cmbDuration.Selected.Minutes,

Start: Text(DateTimeValue(dteStart.SelectedDate & " " & drpStartTime.Selected.Value), DateTimeFormat.UTC),

End: Text(DateTimeValue(dteEnd.SelectedDate & " " & drpEndTime.Selected.Value), DateTimeFormat.UTC),

MaxCandidates: 200,

IsOrganizerOptional: false,

ActivityDomain: "Unrestricted",

MinimumAttendeePercentage: 100}

).meetingTimeSuggestions,

"StartTime", // Convert return from UTC to local time.

DateAdd(

DateTimeValue(meetingTimeSlot.start.dateTime),

-TimeZoneOffset(),

TimeUnit.Minutes),

"EndTime", // Convert return from UTC to local time.

DateAdd(DateTimeValue(meetingTimeSlot.end.dateTime),

-TimeZoneOffset(),TimeUnit.Minutes)));

 

ここでのポイント?は3つ

MaxCandidates: 200,

これは候補の数を人同士が調整した候補よりも確実に上回るように200にしています。

200の根拠は適当です(笑)

 

ActivityDomain: "Unrestricted",

これは活動内容の制限を外しています、これにより会議室だけは業務時間外であっても候補が示されます。

 

MinimumAttendeePercentage: 100

ここは当然のことですが、会議室の空きを調べたいので100ですね。

 

でここからはある意味エクセルチックな解決方法です。

会議参加予定者の会議候補として示された日時の候補が会議室の会議候補にあれば会議室は空いています。なければ会議室は空いていません。要はふたつのコレクションを比較するってことです。

 

なんとも駐車場の満車表示みたいですね(笑)

 

この改造をしたの今年の4月なんですが、本当に良い経験になりました。

ということでポエム第1弾終了です。