#44 休日判定を行う
コメントをいただきました!
以前に投稿した記事に、次のようなコメントをいただきました。
休日判定?
コメントいただいたリンク中の URL は、以下のサイトです。
ここで紹介されているプログラムでは、以下のように判定を行っています。
「土曜日」と「日曜日」は休日
カレンダー「日本の休日」に何か登録されている日は、休日
上記 2つの条件に当てはまらなければ、営業日
この判定関数を用いて処理対象となる日付が休日であるかを判定し、休日であれば休日でない日(営業日)になるまで 1日ずつ先に進めることで、休日には処理しないようにできます。
作成したプログラムをバージョンアップ
上記の紹介されていたプログラムをもとにして、わたし自身もプログラムをバージョンアップしてみました。変更点は、次の通りです。
手順2で設定するシート③に、下図のような設定項目を追加しました。
このセルが空欄になっていれば、休日判定は行いません。
前項で設定したカレンダー ID が指定されていれば、休日判定を行います。
上図のように説明でも書いておきましたが、カレンダー ID として、カレンダー「日本の休日」の ID を指定しておけば、前述のように「土曜日」と「日曜日」に加えて、カレンダーで何かしらが設定されている日を「休日」として処理します。
これらの変更によって、休日処理が有効な場合、処理対象となる日付が「休日」であれば、「休日」でない日まで日付を進めて処理を行い、「休日」には催促メールや状況メールが送信されなくなります。
この処理の問題点?
もとの記事にも書いたように、このような感じで休日判定を行うことは想定できていたのですが、この方法では次のような点をカバーできません。
土曜日や日曜日が、学校行事によって「休日」ではなくなる。
前項の振り替えによって、平日が「休日」になってしまう。
一般のカレンダーにはない、夏季休業や冬季休業といった「休日」に準ずる日がある。
これらに対応する解決策を検討しては見たものの、いろんな意味で簡単ではなかったので、先に公開した時点では盛り込んでいませんでした。
解決策① 休日をすべて指定する
単純な解決策としては、次のような感じ。
休日判定に用いるカレンダーを作成する。
前項で作成したカレンダーには、土曜日や日曜日、祝日などを含め、「休日」扱いとなって児童生徒が登校しない日に、予定を設定する。
isWorkday() では、土曜日や日曜日は休日判定には用いず、前項で作成したカレンダーのみで行う。
これを採用しなかったのは、休日判定用のカレンダーを維持管理していくのは、とても面倒な気がしたからです。カレンダーに「休日」の設定が行われていなければ、もとと同じように毎日処理が行われてしまいます。
解決策② 登校日・勤務日を指定する
別の解決策としては、休日判定を次のように変更する方法です。
カレンダー「登校日・勤務日」に何か登録されている日は、営業日(休日ではない)
「土曜日」と「日曜日」は休日
カレンダー「日本の休日」に何か登録されている日は、休日
上記 2つの条件(2. と 3.)に当てはまらなければ、営業日
設定するカレンダーを追加して、カレンダー「登校日・勤務日」を設定してもらい、このカレンダーに何か設定されている日は、「土曜日」や「日曜日」、「休日」であっても無条件に営業日とするものです。
この方法であれば、必要最低限の設定で休日ではない日を指定できます。
この方法を採用しなかったのは、追加したカレンダーによって「登校日・勤務日」となった日の振り替えで休日になった日が「休日」として扱われないこと、夏季休業や冬季休業といった学校特有の「休日」にも対応できないからです。
学校の行事予定を Google カレンダーで公開・共有している場合には、
一般には「休日」だが学校の都合で「登校日・勤務日」となる日
一般には「登校日・勤務日」だが学校の都合で「休日」となる日
という 2種類の情報がカレンダーに設定されています。前者は行事名が、後者は「●月●日分振替」といった感じでしょう。
前者だけが設定されているカレンダーであれば、この解決策にうまく使えるのですが、後者も含まれていることで単純には解決できないのです。
カレンダーに登録されているイベント(予定)のタイトル文字列などから、前者と後者を判定するというのも考えたものの、その判定が面倒そうだったので採用を見送りました。
学校で公開するカレンダーがそのまま使えれば、持続可能だったんですけどね…
問題点の解決策 → とても面倒!
いくつか解決策を考えたものの、すっきり解決できるものではなかったので、いただいたコメントにあったような単純な休日判定だけを実装してみました。そのため、「この処理の問題点?」にあるような問題点は解消されていません。
元記事で案内しているスプレッドシートを変更してあるので、休日判定を行いたい場合には、スプレッドシートをコピーしなおしてください。 ※カレンダー ID を指定しなければ、休日判定を行いません。
設定されているトリガーの削除
既に利用しているスプレッドシートの利用をやめる場合には、スプレッドシートから「Apps Script」を選択してスクリプトエディタを開きます。
スクリプトエディタで、下図のように設定されている 2つのトリガーを「トリガーを削除」で削除します。
最後に…
今回のようにコメントいただければ、できる範囲で対応していこうと思います。当該記事へのコメントや ↓ のページからご意見をお寄せください。
なかなか汎用的なプログラムってむずかしいですね。