wide and deep

【GAS】給料日の前倒し・後ろ倒し判定を実装する

はじめに

最近は基本的にはカード決済のみで生活できるようになってきました.
今のカード(楽天銀行デビットカード)はメールで使用金額を通知してくれたり,アプリから残高を確認できたりするのですが,自分のスマホでしか見れないので,頻繁に妻から今月あといくら残ってる?と聞かれて確認する流れになっています.
ということで,メールから使用金額を抜いて生活費(固定)から差っ引いた残高をLINEで通知しようと思いました.
もちろんGAS(Google Apps Script)実装ですね.無料なので.

成果物は下記のものです.
https://gist.github.com/catdance124/7c8e75470d35c05afce43424af63d947

実装上の問題点

生活費の区切りを給料日~翌給料日としていて,基本は25日~翌25日なのですが, 給料日が土日祝とかぶる場合,前倒しで支給されるというイレギュラーの発生に対応する必要があります.

解決策

25日が土日祝であればその前の土日祝でない日を返す関数を作成しました.(後ろ倒しの場合も同じ要領(-1を+1に)で可能だと思います)
土日祝かどうかを判定するisHoliday_()(丸パクリさせていただきました)をcalc_payday()から再帰的に呼び出し,一日づつずらしながら土日祝でない日を探します.

【GAS】土日・祝日・特定休日を判定する|もりさんのプログラミング手帳

function isHoliday_(date) {
  // ref: https://moripro.net/gas-check-holiday/
  // ①土日の判定  
  const day = date.getDay(); //曜日取得
  if (day === 0 || day === 6) return true;
  // ②祝日の判定
  const id = 'ja.japanese#holiday@group.v.calendar.google.com'
  const cal = CalendarApp.getCalendarById(id);
  const events = cal.getEventsForDay(date);
  //なんらかのイベントがある=祝日
  if (events.length) return true;
}

function calc_payday(date) {
  if (isHoliday_(date)){
    date.setDate(date.getDate() -1);
    return calc_payday(date);
  } else {
    return date;
  }
}

使うときはこんな感じ,25日が日曜,23日が祝日であれば22日が帰ってくるはず

var DEFAULT_PAYDAY = 25;
var message_date = message.getDate();
var default_payday = new Date(message_date);
default_payday.setDate(DEFAULT_PAYDAY);
var payday = calc_payday(default_payday);

おわりに

最近プライベートでコードをあまり書けてなかったんですが(ブログも),こういった実生活のちょっとしたところを円滑にするってのがやはり一番楽しいですね!