/*Google AdSense自動広告*/

2019年7月29日月曜日

GAS(Google Apps Script)で「営業日のみトリガー」を設定する

GASで全体管理表からチームのスプレッドシートに、対象タスクを判定して取り込み(俺たちの仕事はこれだけよ!)、毎朝タスク何件かをメール配信するスクリプトを組んだのですが、土日も配信されていることに気づきました(無駄なメールごめんなさい…)。

設定していたのは「日付ベースのタイマー」でしたが、他のタイマーでも土日の回避すらできません。やりたいのは土日含めた祝休日を避けることなのですが…。

①週ベースのタイマー → 毎週○曜日の△時
②日付ベースのタイマー → 毎日△時

※一応、週ベースを月火水木金の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 件のコメント:

コメントを投稿