앱스 스크립트 사용법 (7) 구글 캘린더에서 일정 수집하기

이번에는 구글 앱스 스크립트를 사용하여 구글 캘린더에 접근하여 일정 정보를 수집하는 스크립트를 만들어보겠습니다.

개요

  1. 구글 캘린더에 접근하여 실행 당일~7일 후의 일정을 수집한다.
  2. 수집한 일정을 목록으로 만든다.
  3. 만든 일정 목록을 메일로 보낸다.

저는 이 스크립트를 매주 월요일 아침에 실행하도록 설정하여 월요일에 그 주의 일정을 확인하는데 사용하고 있습니다.

구글 캘린더에 접근하기 위해 참고한 페이지:

앱스 스크립트를 작성

https://script.google.com/home 에 접속하여 [새 프로젝트]버튼을 클릭합니다.getCalendar01

스크립트 편집 화면에 들어옵니다.getCalendar02

스크립트 편집 화면에 아래 코드를 넣습니다.

function getCalendar_sendMail() {

var weekdays = ['일요일', '월요일', '화요일', '수요일','목요일','금요일','토요일'];

// 현재 날짜, 7일후 날짜 구하기 
var now = new Date();
var day7after = new Date();
day7after.setDate(now.getDate() + 7);
var events = CalendarApp.getDefaultCalendar().getEvents(now, day7after);

// 일정이 하나도 없는 경우, 스크립트를 종료함.
if(events.length == 0) return;

// 메일 내용
var mailbody = "<h2>이번 주 일정</h2>";

for(var cei = 0; cei < events.length; cei++){
var ceTitle = events[cei].getTitle();
var ceStart = events[cei].getStartTime();
var ceEnd = events[cei].getEndTime();
var ceCompare = new Date();
ceCompare.setDate(ceStart.getDate() + 1);
var ceWeekday = ceStart.getDay();

var ceEvent = "<ul> <li> " + weekdays[ceWeekday] + "</li> <ul>";
if(events[cei].isAllDayEvent() == true){

if(ceCompare < ceEnd){
ceEvent = ceEvent 
+ " <li> [날짜] " + Utilities.formatDate(ceStart, 'Asia/Seoul', "MM/dd (E)") 
+ " ~ " + Utilities.formatDate(ceEnd, 'Asia/Seoul', "MM/dd (E)")+ "</li>"
+ " <li> [일정] " + ceTitle + "</li> </ul> </ul> ";
}else{
ceEvent = ceEvent 
+ " <li> [날짜] " + Utilities.formatDate(ceStart, 'Asia/Seoul', "MM/dd (E)") + "</li>"
+ " <li> [일정] " + ceTitle + "</li> </ul> </ul> ";
}

}else{
if(ceStart.getDay() == ceEnd.getDay()){
ceEvent = ceEvent 
+ " <li> [날짜] " + Utilities.formatDate(ceStart, 'Asia/Seoul', "MM/dd (E) HH:mm")
+ " ~ " + Utilities.formatDate(ceEnd, 'Asia/Seoul', "HH:mm")+ "</li>"
+ " <li> [일정] " + ceTitle+ "</li> </ul> </ul> ";
}else{
ceEvent = ceEvent 
+ " <li> [날짜] " + Utilities.formatDate(ceStart, 'Asia/Seoul', "MM/dd (E) HH:mm")
+ " ~ " + Utilities.formatDate(ceEnd, 'Asia/Seoul', "MM/dd (E) HH:mm")+ "</li>"
+ " <li> [일정] " + ceTitle+ "</li> </ul> </ul> ";
}

}

mailbody = mailbody + ceEvent + "<br>"
}

// 메일 주소
var recipient = "<일정을 받을 메일 주소>"; // 메일 주소를 넣여주세요.
// 메일 제목
var subject = "이번 주 예정 알림";
// 메일 내용
var htmlbody = mailbody ;

// 메일 보내기
MailApp.sendEmail({
to: recipient,
subject: subject,
htmlBody: htmlbody, 
});
}

프로젝트를 저장합니다.

getCalendar04.png

▶(실행)버튼을 클릭합니다.getCalendar05.png

처음 실행하실 때, 권한 요청을 해옵니다. 실행을 허용해주세요.
(스크린샷은 생략합니다. 자세한 내용은 앱스 스크립트 사용법 (1) 메일 보내기 > 실행 권한 허용 을 확인해주세요.)

스크립트 실행

스크립트를 허용 후 다시 실행하면, 메일이 도착합니다.getCalendar06.png

메일 내용에서 구글 달력에 설정해둔 일정 목록을 확인할 수 있습니다.getCalendar07

아래는 테스트 전에 구글 달력에 미리 설정해둔 일정입니다.getCalendar13

트리거 설정

이제는 이 메일을 지정한 시간에 매주 받도록 설정해보겠습니다.

시계모양 아이콘으로 된 (현재 프로젝트의 트리거) 버튼을 클릭합니다.getCalendar09

[트리거 추가] 버튼을 클릭합니다.getCalendar10.png

트리거 설정화면이 뜹니다.getCalendar11

트리거에 시간 기반, 주 단위 타이머, 매주 월요일, 원하는 시간대를 설정 후 [저장]을 클릭합니다.getCalendar12

트리거 설정이 완료되었습니다.

설정한 시간에 메일이 도착하면 성공입니다!getCalendar14

아래는 테스트 전에 구글 달력에 미리 설정해둔 일정입니다.getCalendar15

 

구글 앱스 스크립트의 다른 활용법을 알고싶으시다면!
» G Suite 사용법 #5 앱스 스크립트 활용 예시 모음

(동영상 강의 광고)

스프레드시트로 만든 가계부인데
스마트폰에서도 쓰기 쉽다고?

스마트폰에서도 쓰기 쉬운 스프레드시트 가계부

댓글

“앱스 스크립트 사용법 (7) 구글 캘린더에서 일정 수집하기” 글의 댓글 8개

  1. 김인주 아바타
    김인주

    코딩을 배운적이 없어서 문의드립니다.
    defaultCalendar말고
    특정 켈린더에서 받으려고 수정하려는데요
    Exception: 매개변수(String)가 CalendarApp.getDefaultCalendar에 대한 메소드 서명과 일치하지 않습니다
    이렇게 나오는데 따로해야하는게있나요?

    좋아요

    1. SmartAgent 아바타

      특정 캘린더를 가져오시려면 defaultCalendar말고 아래 Method를 이용하시면 될것 같습니다.

      getCalendarById(id)
      https://developers.google.com/apps-script/reference/calendar/calendar-app#getcalendarbyidid

      getCalendarsByName(name)
      https://developers.google.com/apps-script/reference/calendar/calendar-app#getcalendarsbynamename

      좋아요

    2. injooinjoo 아바타
      injooinjoo

      해결했습니다! 감사합니다!

      좋아요

  2. injooinjoo 아바타
    injooinjoo

    코딩을 배워본적이없어서 이해가 안가 문의드립니다…
    특정 캘린더내용만 불러오고싶어서
    defaultCalendar 에서 getCalendarById(id) 로 바꿧는데 아래같이 나오네요

    Exception: 매개변수(String)가 CalendarApp.getDefaultCalendar에 대한 메소드 서명과 일치하지 않습니다.(‘코드’ 파일, 9행)

    어떤걸 추가로 해야할까요..

    좋아요

  3. injooinjoo 아바타
    injooinjoo

    두가지 캘린더에있는 일정을 한개의 메일로 보내는것도 가능할까요?

    좋아요

    1. SmartAgent 아바타

      아마 아래 Method 이용하시면 모든 캘린더를 가져올 수 있습니다. 모든 캘린더 가져오신 후 필요하신 캘린더를 선별하여 일정을 수집하시면 가능할 것으로 예상됩니다.

      getAllCalendars()
      Gets all calendars that the user owns or is subscribed to.
      https://developers.google.com/apps-script/reference/calendar/calendar-app#getallcalendars

      좋아요

  4. 변삼조 아바타
    변삼조

    제가 구글링 하다 바슷한 자료를 찾은것 같아 여쭤 볼려고 합니다.
    2021년 1월~12월 까지 월~금 에 있는 날짜를 공휴일을 제외 하고 따로 출력(시트1의 B2) 할려고 하는데 아무래도 스크립트 라는 걸 사용 해야 할것 같아 그 쪽 으로는 비전공자 이라 도움을 받고 싶어 문의 드렸어요. 실례가 안된다면 한번 살펴 봐 주실수 있을까요?
    허락없이 무턱대고 올렸어요. 미안합니다 ㅜㅜ
    https://docs.google.com/spreadsheets/d/1HPPa15a9qCfvs3QYKC1aE_hNKmXGjK25nuN6VXhYBDI/edit?usp=sharing

    좋아요

    1. SmartAgent 아바타

      문의주신 내용은 구글 앱스스크립보다는 함수로 하는 것이 더 간단합니다. 몇가지 함수를 조합하여 주말과 공휴일을 제외한 날짜를 추출하는 방법을 만들어서 따로 포스팅했습니다.

      구글 스프레드시트 사용법: 주말과 공휴일을 제외한 날짜 얻기

      구글 스프레드시트 사용법: 주말과 공휴일을 제외한 날짜 얻기

      좋아요

변삼조님에게 덧글 달기 응답 취소