moai's blog

ソフトウェア開発にまつわる内容を記載します。

明日の作業時間って、どのくらいか気になるよね?GASで作ってみた。

/*
  翌営業日の作業時間を計算する
*/
function getTomorrowWorkingHours() {
  const ONE_HOUR_MINS = 60;
  
  // 一日のデフォルト労働時間。オレはもっと働くという人は、労働時間を伸ばしましょう。
  const DEFAULT_WORK_MINS = 8 * ONE_HOUR_MINS;

  // 時間計算するときの定数(こんなに宣言する必要はない)
  const SECOND_MILLISECOND = 1000;
  const MINUTE_MILLISECOND = ONE_HOUR_MINS * SECOND_MILLISECOND;
  // const HOUR_MILLISECOND = 60 * MINUTE_MILLISECOND;
  
  var targetDate = getNextWorkingDate(new Date());
  // targetDate.setDate(targetDate.getDate() + 3);
  
  var events = CalendarApp.getDefaultCalendar().getEventsForDay(targetDate);
  Logger.log('翌日のMTGの数: ' + events.length);
  
  var mtg_minuts = 0
  for( var i = 0; i < events.length; ++i ) {
    var event = events[i]
    // 19時以降は営業時間外なのでカウントしていない。
    if(!event.isAllDayEvent() && event.getStartTime().getHours() < 19 && event.getMyStatus() !== CalendarApp.GuestStatus.NO ) {
      mtg_minuts = mtg_minuts + (event.getEndTime().getTime() - event.getStartTime().getTime()) / MINUTE_MILLISECOND ;
      var startTimeStr = Utilities.formatDate(event.getStartTime(), 'JST', 'HH:mm');
      var endTimeStr = Utilities.formatDate(event.getEndTime(), 'JST', 'HH:mm');
      Logger.log('event name: ' + startTimeStr + '-' + endTimeStr + ' ' + event.getTitle() );
    }
  }
  var tomorrowWorkingTimeMsg = '翌営業日のあなたの作業時間: ' + ((DEFAULT_WORK_MINS - mtg_minuts) / ONE_HOUR_MINS ) + '時間';
  Logger.log(tomorrowWorkingTimeMsg);
  // 翌日の作業時間をmailする
  MailApp.sendEmail('your_name@your_domain','翌営業日のあなたの作業時間', tomorrowWorkingTimeMsg)
}


function getNextWorkingDate(date){
  // 休日を除外するため日本の休日カレンダーを取ってくる
  const holidayCalenderOfJapanese = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  
  var targetDate = date;
  
  while(true){
    targetDate.setDate(targetDate.getDate() + 1);
    
    // 土日と休日の場合は、更に翌日を見るようにする
    if (targetDate.getDay() == 0 ||
        targetDate.getDay() == 6 ||
        holidayCalenderOfJapanese.getEventsForDay(targetDate).length > 0){
      targetDate.setDate(targetDate.getDate() + 1);
    }else{
      return targetDate;
    }
  }
}