이번에는 구글 앱스 스크립트를 사용하여 구글 캘린더에 접근하여 일정 정보를 수집하는 스크립트를 만들어보겠습니다.
개요
- 구글 캘린더에 접근하여 실행 당일~7일 후의 일정을 수집한다.
- 수집한 일정을 목록으로 만든다.
- 만든 일정 목록을 메일로 보낸다.
저는 이 스크립트를 매주 월요일 아침에 실행하도록 설정하여 월요일에 그 주의 일정을 확인하는데 사용하고 있습니다.
구글 캘린더에 접근하기 위해 참고한 페이지:
앱스 스크립트를 작성
https://script.google.com/home 에 접속하여 [새 프로젝트]버튼을 클릭합니다.
스크립트 편집 화면에 들어옵니다.
스크립트 편집 화면에 아래 코드를 넣습니다.
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, }); }
프로젝트를 저장합니다.
▶(실행)버튼을 클릭합니다.
처음 실행하실 때, 권한 요청을 해옵니다. 실행을 허용해주세요.
(스크린샷은 생략합니다. 자세한 내용은 앱스 스크립트 사용법 (1) 메일 보내기 > 실행 권한 허용 을 확인해주세요.)
스크립트 실행
스크립트를 허용 후 다시 실행하면, 메일이 도착합니다.
메일 내용에서 구글 달력에 설정해둔 일정 목록을 확인할 수 있습니다.
아래는 테스트 전에 구글 달력에 미리 설정해둔 일정입니다.
트리거 설정
이제는 이 메일을 지정한 시간에 매주 받도록 설정해보겠습니다.
시계모양 아이콘으로 된 (현재 프로젝트의 트리거) 버튼을 클릭합니다.
[트리거 추가] 버튼을 클릭합니다.
트리거 설정화면이 뜹니다.
트리거에 시간 기반, 주 단위 타이머, 매주 월요일, 원하는 시간대를 설정 후 [저장]을 클릭합니다.
트리거 설정이 완료되었습니다.
설정한 시간에 메일이 도착하면 성공입니다!
아래는 테스트 전에 구글 달력에 미리 설정해둔 일정입니다.
구글 앱스 스크립트의 다른 활용법을 알고싶으시다면!
» G Suite 사용법 #5 앱스 스크립트 활용 예시 모음
코딩을 배운적이 없어서 문의드립니다.
defaultCalendar말고
특정 켈린더에서 받으려고 수정하려는데요
Exception: 매개변수(String)가 CalendarApp.getDefaultCalendar에 대한 메소드 서명과 일치하지 않습니다
이렇게 나오는데 따로해야하는게있나요?
좋아요좋아요
특정 캘린더를 가져오시려면 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
좋아요좋아요
해결했습니다! 감사합니다!
좋아요좋아요
코딩을 배워본적이없어서 이해가 안가 문의드립니다…
특정 캘린더내용만 불러오고싶어서
defaultCalendar 에서 getCalendarById(id) 로 바꿧는데 아래같이 나오네요
Exception: 매개변수(String)가 CalendarApp.getDefaultCalendar에 대한 메소드 서명과 일치하지 않습니다.(‘코드’ 파일, 9행)
어떤걸 추가로 해야할까요..
좋아요좋아요
두가지 캘린더에있는 일정을 한개의 메일로 보내는것도 가능할까요?
좋아요좋아요
아마 아래 Method 이용하시면 모든 캘린더를 가져올 수 있습니다. 모든 캘린더 가져오신 후 필요하신 캘린더를 선별하여 일정을 수집하시면 가능할 것으로 예상됩니다.
getAllCalendars()
Gets all calendars that the user owns or is subscribed to.
https://developers.google.com/apps-script/reference/calendar/calendar-app#getallcalendars
좋아요좋아요
제가 구글링 하다 바슷한 자료를 찾은것 같아 여쭤 볼려고 합니다.
2021년 1월~12월 까지 월~금 에 있는 날짜를 공휴일을 제외 하고 따로 출력(시트1의 B2) 할려고 하는데 아무래도 스크립트 라는 걸 사용 해야 할것 같아 그 쪽 으로는 비전공자 이라 도움을 받고 싶어 문의 드렸어요. 실례가 안된다면 한번 살펴 봐 주실수 있을까요?
허락없이 무턱대고 올렸어요. 미안합니다 ㅜㅜ
https://docs.google.com/spreadsheets/d/1HPPa15a9qCfvs3QYKC1aE_hNKmXGjK25nuN6VXhYBDI/edit?usp=sharing
좋아요좋아요
문의주신 내용은 구글 앱스스크립보다는 함수로 하는 것이 더 간단합니다. 몇가지 함수를 조합하여 주말과 공휴일을 제외한 날짜를 추출하는 방법을 만들어서 따로 포스팅했습니다.
구글 스프레드시트 사용법: 주말과 공휴일을 제외한 날짜 얻기
https://smartagent.blog/2021/03/14/date_without_holidays/
좋아요좋아요