Google 캘린더를 집계하여 이번 주에 얼마나 체육관에 갔는지 알려주는 Slack 알림

이유



최근 체육관을 시작했습니다. 회비가 수수하게 높기 때문에, 어느 정도 다녔는지를 자동으로 카운트하고 싶다.

필요한 설정


  • 체육관 이벤트가 Google 캘린더에 추가되었습니다.
  • Gmail에서 수신한 FEELCYCLE 예약 완료 이메일에서 Google 캘린더에 이벤트를 추가하는 GAS 스크립트

  • Slack에서 이메일 수신 설정됨
  • 【초간단 5분】자신에게 보내는 backlog의 통지를 Slack로 받는 방법


  • 이미지



    이런 식으로 매주 금요일에 집계해준다.


    스크립트



    테스트시는 main() 함수를 실행해, Trigger 설정을 포함해 실장할 때는 init()를 실행.cal_name , gym_name , slack_email 를 적절히 바꾸십시오
    function init(){
      // Trigger every week
      ScriptApp.newTrigger('main').timeBased().everyWeeks(1).onWeekDay(ScriptApp.WeekDay.FRIDAY).atHour(10).create();
    }
    
    function main() {
      var cal_name = "Feelcycle";
      var gym_name = "Feelcycle";
      var slack_email = "[email protected]";
      var end_date = new Date();
      var start_date = new Date(end_date.getTime());
      start_date.setDate(start_date.getDate() - 6);  // one week from now
    
      events = getEventsFromCal(cal_name, start_date, end_date);
      Logger.log("Fetched " + events.length + " events");
    
      content = createEmailBody(events, gym_name);
      Logger.log("content " + content);
      sendToMyself(slack_email, gym_name, content, start_date, end_date);
    }
    
    function getEventsFromCal(name, start, end) {
      var cal = CalendarApp.getCalendarsByName(name)[0];
      if (cal) {
        return cal.getEvents(start, end);
      } else {       
        Logger.log("カレンダーが見つかりませんでした: " + name);
      }
    }
    
    function formatDateStr(d){
      Logger.log(d);
      return d.getFullYear() + ("0" + (d.getMonth() + 1)).slice(-2) + ("0" + d.getDate()).slice(-2);
    }
    
    function sendToMyself(email_address, gym_name, content, start_date, end_date) {
      var startDateStr = formatDateStr(start_date);
      var endDateStr = formatDateStr(end_date);
      var fileName = gym_name + "_weekly_stats" + "_" + startDateStr + "_" + endDateStr
      GmailApp.createDraft(email_address, fileName, content).send();
    }
    
    function createEmailLine(i, event, gym_name){
      var title = event.getTitle();
      var startIdx = title.indexOf("]"); // parse event title
      var endIdx = title.indexOf("@");
      var realTitle = title.slice(startIdx + 1, endIdx);
      var date = event.getStartTime();
      var dateStr = date.toLocaleDateString();
      var str = (i+1) + ") " + dateStr + " - " + realTitle + "、" + gym_name + "に行ったね"
    
      return str
    }
    
    function createEmailBody(events, gym_name) {
      // loop through all events
        if (events.length > 0) {
          var body = "";
          for (var i = 0; i < events.length; i++) {
            var event = events[i];
            var str = createEmailLine(i, event, gym_name);
            if (i < events.length - 1) {
              body += str + "\r\n";
            }
            else {
              body += str;
            }
          }
          return body;
        } else {
          return gym_name + "に行ってないじゃん";
        }
    }
    

    좋은 웹페이지 즐겨찾기