こんにちは、あんこ先生です。
アプリに設置するカレンダー、自動で祝日を反映させたくありませんか?
発注や納期、勤務スケジュールなどなにかと活躍する祝日テーブルです。
しかし祝日は毎年変わりますし、メンテを忘れるとミスの原因にもなりかねません。
人の手で祝日テーブルを作成すること自体がナンセンスですよね。
実はOutlookコネクタで祝日情報は自動で取得できるんです。
これを利用すれば最新の祝日情報を参照できます。
そこで、今回は祝日テーブルを作成してカレンダーに反映させる方法をコピペできるコード付きで解説します。
祝日テーブルはカレンダー以外にも出番はあるので覚えておいて損はありませんよ。
Outlookコネクタから祝日テーブルを作成する方法
成果物
日付と名称のみの祝日テーブルを作成します。
日付について、Outlookコネクタから引っ張ってくる日付列はテキスト扱いです。
そのままでは扱いにくいのであらかじめ日付型に変換しておきます。
忘れずに日付昇順でソートもしておきます。
日付が分かれば曜日は算出できるので、曜日列は設けません。
コネクタの接続
予定表から祝日情報を取得するため、Outlookコネクタが必須です。
あらかじめ接続しておきましょう。
予定表の選択
祝日情報が含まれた予定表のIDが必要です。
次のコードをギャラリーに記載してThisItem.idで表示される結構長い文字の羅列がIDです。
//Gallery.Items
Office365Outlook.CalendarGetTablesV2().value
予定表がひとつしかないのであればFirst関数で抜き取れるため、調べる必要はありません。
予定表に祝日が表示されていない場合
アプリ版はおそらく最初からある予定表のみ祝日を表示するものと思われます。
その予定表にも祝日が表示されていない場合は、オプションから予定表に祝日を追加を実行しましょう。
体育の日や天皇誕生日が12月だったりと祝日情報が古い場合も同様に更新できます。
そのまま行うとイベントが重複するので古いものは事前に消しておくのが無難です。
祝日テーブルの作成
祝日情報の抽出
これまでの作業で、Outlookのカレンダーに祝日イベントが表示されたと思います。
アプリ版で追加された祝日イベントはすべて分類が祝日になっています。
つまり、カレンダーから分類が祝日になっているイベントのみ抽出すればよいわけです。
しかし、祝日のみ直接抜きとるプロパティは用意されていなません。
そのため、まずは特定期間の全イベントを取得します。
Office365Outlook.GetEventsCalendarViewV3(
First(Office365Outlook.CalendarGetTablesV2().value).id,
Date(2022,1,1),
Date(2022,12,31)
).value
CalendarGetTablesV2で指定した予定表とGetEventsCalendarViewV3で指定した特定期間の全日を取得します。
この時点ではイベント有無に関係なく全日が抜き取られます。
それに対してFilter関数でカテゴリーが祝日であるイベントを抽出します。
ClearCollect(colTmp,
Sort(
Filter(
Office365Outlook.GetEventsCalendarViewV3(
First(Office365Outlook.CalendarGetTablesV2().value).id,
Date(2022,1,1),
Date(2022,12,31)
).value,
"祝日" in categories.Value
),
start,Ascending)
);
ついでに扱いやすいよう日付昇順で並び替えて、コレクションに格納しておきます。
また、抽出する期間は短いほど処理は早くなります。
パフォーマンスを追求するなら、利用状況を鑑み工夫する必要があります。
たとえば、無条件でx年分とするのではなく、前後1か月の利用が8割ならその期間を指定するといった具合です。
期間が狭すぎると読み込み回数が増えるのでそのあたりも考慮しましょう。
これで祝日のみ抽出したコレクションができあがりました。
祝日テーブルの加工
戻り値のままでは不要な列が多すぎるので、少し加工します。
具体的には必要な列のみ残し、データ型を使いやすいよう変換します。
最終的に何日が祝日なのか、それが何の日なのかが分かれば十分ですよね。
そのため、開始日のstartとイベント名のsubject列を残して他の列は削除します。
必要な行を選択して他の列を消すにはShowColumns関数を使います。
ClearCollect(colRest,ShowColumns(colTmp,"start","subject"))
列名の指定は二重引用符で囲んだ内部名なので注意してください。
これでかなりすっきりしましたが、start列の値が文字列のためそのままでは日付と比較できません。
そのため、DeteValue関数を使って日付型に変換させvalue列に格納します。
ClearCollect(colRest,
ShowColumns(
AddColumns(colTmp,"value",DateValue(start)),
"value","subject")
)
日付型になったのでカレンダーとの比較が容易になりましたね。
最後に、毎回ボタンを押して祝日テーブルを作成するのは手間ですよね。
自動実行されるOnStartやOnVisibleなどに記述することをオススメします。
カレンダーへの反映
祝日テーブルが完成したらカレンダーに反映させてみます。
カレンダーはギャラリーを使って適当に作成してください。
日付の色を変更する
祝日なので日曜日と同様赤字で表示してみましょう。
日付のテキスト色部分に条件分岐で対応させます。
平日は黒、土曜日は青、日曜および祝日は赤の3パターンですね。
If(Weekday(ThisItem.value)=1 || ThisItem.value in colRest.value,RGBA(255,0,0,1),
Weekday(ThisItem.value)=7,RGBA(0,0,255,1),
RGBA(0, 0, 0, 1)
)
ThisItem.valueはカレンダーギャラリーの日付です。
Weekday関数にその日付を与えて1なら日曜、7なら土曜日と判定させます。
日付と比較し祝日テーブル内に一致するものがあれば祝日と判定させます。
背景色も変更したければ同様の手順で行えます。
イベント名を表示する
イベント名はもっとかんたんです。
祝日テーブルにその日付が含まれるかどうか判定し、一致すればイベント名を表示させます。
LookUp(colRest,value=ThisItem.value,subject)
最初からギャラリーにすべて放り込む
そのギャラリー以外で祝日テーブルを使わないなら、これが一番手っ取り早いです。
余計なコレクションも作成しないのでパフォーマンスも高いと思います。
ついでに日曜日も休業日イベントを追加しています。
曜日ごとの定休日がある場合は数値をいじって対応してみましょう。
適当なギャラリーのItemsにコピペしてください。
valueが日付、subjectが祝日イベント名です。
With(
{
rest:Sort(
Filter(
Office365Outlook.GetEventsCalendarViewV3(
First(Office365Outlook.CalendarGetTablesV2().value).id,
Date(2022,1,1),
Date(2022,12,31)
).value,
"祝日" in categories.Value
),
start,Ascending
)
},
ForAll(Sequence(DateDiff(Date(2022,1,1),Date(2022,12,31)),0),
With({dte:DateAdd(Date(2022,1,1),ThisRecord.Value,Days)},
{
value:dte,
subject:If(!IsBlank(LookUp(rest,DateValue(start)=dte)),
LookUp(rest,DateValue(start)=dte,subject),
Weekday(dte)=1,"休業日"
)
}
)
)
)
Outlookコネクタから祝日テーブルを作成する方法のまとめ
今回は、Outlookコネクタから祝日テーブルを作成する方法を紹介しました。
この方法なら自動で作成されるため、別途テーブル作成やメンテが不要になります。
あれこれ試して、理解を深めてみてください。
応用すれば、年末年始といった会社の休日や個人の週休などもも反映できますよ。
次回はそのあたりを解説していこうと思います。
続きはこちらの記事をどうぞ。(作成中!)
Weekday関数は日曜日の1から始まって土曜日の7で終わる戻り値を返すよ。