こんにちは!Kotaです。
2021年も残りあと僅かですね。
僕は本日が年内最後の出勤日なのですが、この時期は何かとやるべきことが多く大変ですね。
新年を晴れやかに迎えられるよう、年内までにやれることはやり切りたいところです。
さて、話は変わりSAKURUG渋谷オフィスでは1日の終わりにオフィスを掃除するのですが、掃除当番はGASを使って決定→メンバーに周知する、という「お掃除当番スクリプト」なるものがあります(ちなみに僕が4月に初めて実装したGASでの成果物ということもあり、何となくコードに愛着があります笑)。
コードの全体像についてご紹介したいところですが、少々長くなってしまうので今後何回かに分けて書ければと思います。
その中でも今回は、「googleカレンダーに特定の予定があるときは処理を行わない」というスクリプトを追加したので、その内容についてご紹介します。
ざっくりとですが、以下のような流れで実装しています。今回の対象は営業日判定の部分です。
このお掃除当番スクリプトですが、実際に運用してみると機能面でいくつか追加・修正すべき課題が出てきました。
その中の一つが、お盆休みや年末年始、全社でのイベント時など、「暦に依存しない非営業日」のときにはスクリプトを実行しないというものです。
イベントの最中に『今日の掃除当番は〇〇さんです』みたいな通知が来たら嫌ですよね。掃除当番のサイクルにも狂いが生じてしまいます。
ではどうやってこの問題を解決するのかですが、
というような処理を追加してあげることで解決します。予定の登録は今のところ手動ですが...
では実際にコードを見ていきましょう。
function setTrigger() {
const triggerDate = new Date();
triggerDate.setHours(08, 30, 00);
const day = triggerDate.getDay();
if (day !== 0 && day !== 6 && !checkHoliday() && !getMyCalendar()) {
ScriptApp.newTrigger('実行したい関数名').timeBased().at(triggerDate).create();
} else {
console.log('トリガー作成に失敗しました。');
}
}
function getMyCalender() {
const MY_CALENDER = '自身のカレンダーID';
const calendar = CalendarApp.getCalendarById(MY_CALENDER);
const event = calendar.getEventsForDay(new Date());
for (let i = 0; i < event.length; i++) {
if (event[i].getTitle() === '非営業日') {
return true;
} else {
return false;
}
}
}
2~4行目で今日の日付と曜日の取得、トリガーを実行したい時刻を設定しておきます。
ポイントは6行目の分岐条件です。
初めの2つの条件は、day
で取得した曜日が平日か休日かを判定しています。
3つめと4つめの条件については、それぞれ祝日を判定する関数、SAKURUGの特定のイベントを判定する関数の返り値がtrue
かfalse
かを判断しています。
この条件をすべて満たす場合(=営業日)のみ、当番を決定する関数を実行するためのトリガーを作成します。
checkHoliday()
の詳細については今回は省略します。
ここでは今日の自分のカレンダーに「非営業日」という予定が存在するかどうか判定しています。
MY_CALENDER
にはご自身のカレンダーIDを入れます。IDはカレンダーの設定(下記画像の赤枠部分)から確認することができますが、おそらくgmailアドレスがIDとして登録されているかと思われます。
googleカレンダーの設定画面
このIDを使い、CalendarApp
クラスによって自分のカレンダーを指定する変数calendar
を定義します。
次のevent変数では、getEventsForDay
オブジェクトの引数にnew Date()
を代入することで今日の日付に登録されている予定を取得しています。
以上で必要なデータは取得できたので、あとは18行目以降でeventのデータ分だけ繰り返し処理を行い、eventのi
番目に"非営業日"と一致する予定が登録されていたら返り値にtrue
を、無ければfalse
を返します。
setTrigger()
の条件分岐では、この返り値がfalse
のとき(=営業日)にトリガーを作成する分岐処理を実行しています。年末年始などの非営業日(=返り値がtrue
)はこの分岐処理を抜けることで、そのあとのconsole.log
が実行されます。
例えば今日(2021/12/29)の日付でsetTrigger()
を実行してみると
非営業日という予定は登録されていないためconsole.log
が実行されます。
実際にはこの処理は不要なので、else
処理はあくまで検証用です。
これにて「暦に依存しない非営業日」に対応することはできたものの、例えば掃除当番のメンバーがリモート勤務のときや、外出等の理由でオフィスにいないときの処理など、まだまだ追い切れていないケースが多々あります。
現状、こうした例外時には社内メンバーどうしで協力して対応してくれているのですが、極力システム側で対応可能なものについては機能でカバーしてしまいたいので、機能追加の時間確保が今後の課題ですね。
今回ご紹介した処理内容そのものはそこまで複雑ではなく汎用性もあるので、コピペしたものをご自身の環境に合わせて内容を一部変更すれば直ぐに動くかと思われますので、是非試してみてください。
今後、今回省略してしまった機能についてもご紹介出来たらと思います。
では2021年もお疲れ様でした、良いお年を!