設定していたのは「日付ベースのタイマー」でしたが、他のタイマーでも土日の回避すらできません。やりたいのは土日含めた祝休日を避けることなのですが…。
①週ベースのタイマー → 毎週○曜日の△時
②日付ベースのタイマー → 毎日△時
※一応、週ベースを月火水木金の5個作れば可能ですが…
※時間指定は、△時から1時間以内のどこかで、分秒単位では設定できません(サーバーアプリだもの)
そこで、毎日定時のタイマーは変更せず、スクリプト内に判定文を書き、祝休日の場合は処理自体をスキップすることにしました。
function sendMail(){ if(todayIsBusinessDay){ // メイン処理 } }
祝休日判定に作成した、関数todayIsBusinessDay()の中身について解説します。
function todayIsBusinessDay()
function todayIsBusinessDay(){ const today = new Date(); const dayOfWeek = today.getDay(); if(dayOfWeek===0 || dayOfWeek===6){ return false; } const japaneseHoliday = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); if(japaneseHoliday.getEventsForDay(today).length>0){ return false; } return true; }
getDayで曜日を取得する
変数の宣言が var でなくて const なのは、不変であることを分かりやすくするためです。new Date()で実行時の日時を取得しますが、その後月日をシフトしたりする場合は、var を使うと良いでしょう。
Date.getDay()で曜日に対応する数値を取得できます。日曜=0~土曜=6までなので、0か6ならばfalseを返してfunctionを抜けます。後述のカレンダー処理の方が、恐らく10倍以上処理時間がかかるからです。
カレンダー「日本の祝日」から祝日を取得する
Excelで日本の祝日を判定しようとすると、誰かが無料で公開している祝日リストをダウンロードして、別シートに貼り付けて、VLOOKUPで引っ張って、と手間がかかりますが、Googleスプレッドシートでは、カレンダーと連携し、日本の祝日イベントから簡単に祝日を取得できます。
Googleジャパン?が公開している「日本の祝日」がそれで、日本語対応のAndroidスマホだと、カレンダーアプリで選択すれば祝日が色分けして見れる筈です。もちろんPCのブラウザ上のGoogleカレンダーでも使用可能。
GASでアクセスするには、国ごとに決まったIdで getCalendarById 関数を使います。getCalendarByName('日本の祝日')でも動作しますが、もし自分で「日本の祝日」というカレンダーを作ってしまった時の動作が不定なので、おすすめしません。
Calendarをゲットしたら、getEventsForDay(today).lengthでイベントの個数を取得します。祝日であれば個数は1以上となるので(祝日理由が重なると2以上)、falseを返します。
最後に、functionが何も返さないとundefined=falseとなってしまうので、return trueを忘れずに!
0 件のコメント:
コメントを投稿