肩の力を抜いて

Relax and Enjoy Programming

肩の力を抜いて楽しむ。楽しみながらラクして成果を上げる仕組みを考える。

月末日や最終金曜日にGoogle Apps Scriptを自動で実行するテクニック

f:id:tadaken3:20170703141142p:plain こんにちは!
タダケン(@tadaken3)です。

Google Apps Scriptでは、トリガー使ってスケジュールでスクリプトを実行することができます。処理を自動化するにあたってとても心強い味方なのですが、トリガーだけではスケジュールを組むのが難しいパターンもあります(例えば月末日など)。

今回は、Dateオブジェクトから取得できる値をうまく使って自在にスクリプトをスケジュール実行するテクニックをお伝えしていきます。

毎月1日にスクリプトを実行する

毎月1日にスクリプトを実行するには、トリガーだけで実行可能です。トリガーの設定方法を見ていきましょう。

トリガー設定するには、メニューバーにある時計マークをクリックします。

f:id:tadaken3:20170703133109p:plain

実行したい処理を選んでイベントを「時間主導型」「月タイマー」に変更しましょう。すると日にちと時間を設定できます。画面の例では、毎月1日処理が実行されます。

f:id:tadaken3:20170703133123p:plain

月の最終日にスクリプトを実行する

最終日は少し工夫が必要です。最終日は月によって30日や31日もしく28日だったりします。2月の場合はうるう年も考慮しないといけません。

スクリプト側で最終日かどうか判定するロジックを入れて対応しましょう。

今日の日付に1日分足したもの(つまり明日)が月初めの1日であれば、『今日は最終日』になります。最終日の次の日は絶対に1日だからです。この方法で条件を判定しましょう。

dateオブジェクトに対して、getDateメソッドを実行することで『日』を取り出すことができます。 2017年6月30日の場合は『30』の部分です。

Point dateオブジェクト.getDate();

dateオブジェクトに更新する場合は、setDateメソッドを利用します。日を整数で与えます。

Point dateオブジェクト.setDate('日');

実際のコードはこのようになります。

//トリガー設定用
function trigger(){
  date = new Date();
  date.setDate(date.getDate()+1);//今日の日付に一日足す
  if (date.getDate() === 1){//最終日の判定
    main();
  };
}

function main(){
  //実際に処理を実行する内容をここに記載する
  Loggor.log("今日は月末です")
}

トリガーは「日タイマー」を選んで毎日実行するように設定します。

f:id:tadaken3:20170703133600p:plain

最終金曜日にトリガーを実行する

最終金曜日に処理を実行する場合は、こののように考えます。今日の日付に7を足した日付(つまり翌週の同じ曜日の日)が、来月になっていれば『今日は最終金曜日』です。

『月』を取り出すには、getMonthメソッドを使います

Point dateオブジェクト.getMonth();

実際のコードを見てみましょう。

//トリガー設定用
function trigger(){
  date = new Date();
  var month = date.getMonth()//判定したい日の月を取得


  date.setDate(date.getDate()+7);//7日を足す
  var month_next_week = date.getMonth()//7日後の月を取得
  if (month != month_next_week){//月が一致しなければ最終週
    main();
  };
}

function main(){
  //実際に処理を実行する内容をここに記載する
  Logger.log("今日はプレミアムフライデーです")
}

毎週の金曜日にトリガー設定をしておけば、最終金曜日のみ処理が実行されます。

f:id:tadaken3:20170703192947p:plain

毎月25日にトリガーを実行。25日が土日の場合は前倒しにする

25日に実行したいけど、土日の場合は日にちを前倒しして処理を実行したい場合もあると思います。例えば、お給料日を判定するような場合です。通常は25日に処理が実行されますが、25日が土日の場合は23日もしくは24日実行したい場合です。

この場合は、日にちと曜日のデータを組み合わせて条件判定を行ないます。25日に実行する場合で、具体的なケースを見ていきましょう。

  • 25日が土曜日の場合、24日が金曜日
  • 25日が日曜日の場合、23日が金曜日

つまり、以下の3パターンで処理が実行されればいいことになります。

  • 23日が金曜日
  • 24日が金曜日
  • 25日が土日ではない

曜日を取得するには、getDayメソッドを使います。getDayメソッドが返す値は数字になります。日曜日が0となる点にご注意ください。

Point dateオブジェクト.getDay();

実際のコードを見ていきましょう。

//トリガー設定用
function trigger(){
  var today = new Date();
  //getDayメソッドが返す値は、日曜日から0で始まります。対応する配列を用意します。
  var week = new Array("日", "月", "火", "水", "木", "金", "土");
  var day =  today.getDay();//曜日を取得
  //ログに曜日を出力しています。
  Logger.log(week[day])

  var date =  today.getDate();//日付を取得

 //23日かつ金曜日なら実行
  if (date === 23 &&  week[day] === '金'){
    main();
 //24日かつ金曜なら実行
  } else if (date === 24 && week[day] === '金'){
    main();
 //25日でかつ土日ではない場合に実行
  } else if (date === 25 && week[day] != '土'  && week[day] != '日'){
   main();
  };
};

function main(){
  //実際に処理を実行する内容をここに記載する
  Logger.log("今日はお給料日です!")
}

あとは、23日、24日、25日に処理を実行するトリガーを設定すれば、オッケーです。

f:id:tadaken3:20170703134244p:plain

まとめ

トリガーと日付の判定を組み合わて、定期的にスクリプトを実行する方法をお伝えしました。

Dateオブジェクトから値を取得するメソッドをまとめるとこのようになります。他にもアイデア次第で、スクリプト実行するスケジュールを組むことができると思います。

メソッド 取得でくるもの 備考
getFullYear()
getMonth() 値は0~11(1月~12月)
getDate()
getDay() 曜日 値は0~6(日曜日~土曜日)

今回の記事はいかがでしたか?

副業やプログラミングに関する記事を書いています。(ときどき、それ以外のことも) 読者登録してもらうと更新の励みになりますのでよろしくお願いいたします。