스프레드시트에 일정 입력 후 구글캘린더에 자동 추가 및 주기적인 메일 알람

안녕하세요.

지피터스 13기 - 칼퇴자동화 참석하고 있는 석재호입니다.

제목 그대로 스프래드시트에 간단하게 일정을 입력하면 연결된 구글 캘린더에 자동으로 추가되고 매일 밤마다 다음날 일정이 정리되어 메일로 오고 일요일 저녁에는 다가오는 주 일정이 정리되어 오는 걸 목표로 작업해 봤습니다.

다양한 숫자를 표시하는 스프레드시트

한 행씩 입력하며 테스트하다 보니 좀 많아졌는데 처음 한 것은 필요한 변수 정의부터 했습니다.

일정에 필요한 데이터는 날짜, 시간, 장소, 설명 이 정도인데 좀 풀어서 시작 날짜, 끝 날짜, 시간, 제목, 장소, 설명의 값을 입력받는다고 정했습니다. 종료 날짜는 입력 안 하면 시작 날짜와 같은 값이 저장되게 하였고 시간이 계속 33분 정도 차이 나게 저장되길래 그냥 텍스트로 받아서 텍스트로 제목에 붙여서 보기 쉽게 처리했습니다.

그리고 맨 오른쪽에 보시면 체크박스가 있는데 한 번 클릭이 번거로울 수도 있지만 체크박스로 안 하니 한 칸 입력될 때마다 트리거가 작동돼서 하나의 일정을 추가하는데 5~6개씩 추가가 되었습니다.

한국어 번호가 적힌 휴대폰 스크린샷

뭔가 방어 코드를 잘 작성하면 될 것 같은데 잘 몰라서 체크박스를 클릭했을 때만 구글 캘린더에 추가되도록 했습니다.

혹시나 실수로 체크박스를 풀었다가 다시 체크할 경우도 있어서 제목으로 비교해서 추가 생성하지 못하게 해놨습니다.

가장 큰 문제는 구글 캘린더 권한이 말썽이었는데 계속해서 질문하다 보니 아래와 같은 답을 줬습니다.

흰색 배경에 노란색 화살표가 있는 한국어 텍스트

그래서 좀 더 자세히 물어 봤습니다.

구글 캘린더 고급 서비스

이런 답변이 나오며 원래 캘린더 관련 함수는 function createCalendarEvent() 이것이었는데 function createCalendarEventAdvanced() 이걸로 바뀌게 되었습니다.

function createCalendarEventAdvanced(startDate, endDate, time, title, location, description) {

// 시간 설정

var timeStr = (typeof time === 'string') ? time : String(time);

var timeParts = timeStr.split(':');

var startTime = new Date(startDate);

startTime.setHours(timeParts[0], timeParts[1]);

var endTime = new Date(endDate);

endTime.setHours(timeParts[0], timeParts[1]);

// 이벤트 생성 요청

var event = {

'summary': title,

'location': location,

'description': description,

'start': {

'dateTime': startTime.toISOString(),

'timeZone': Session.getScriptTimeZone()

},

'end': {

'dateTime': endTime.toISOString(),

'timeZone': Session.getScriptTimeZone()

}

};

var calendarId = 'primary'; // 기본 캘린더 사용 (필요시 다른 캘린더 ID로 변경)

Calendar.Events.insert(event, calendarId);

Logger.log("이벤트가 성공적으로 생성되었습니다: " + title);

}

여기서 맨 밑에 var calendarId = 'primary'; // 기본 캘린더 사용 (필요시 다른 캘린더 ID로 변경) 이 부분에서 그냥 권한이고 뭐고 계정에 연결된 기본 캘린더로 강제 연결? 뭐 그런 것 같습니다.

이렇게 캘린더 부분은 끝났고 이제 메일에 대한 부분입니다.

메일이 매일 다음날 일정 안내와 일요일마다 주간 일정 안내를 해줬으면 해서 작업을 시작했습니다.

질문을 하면서 하나씩 구현하다 보니 메일도 일정 하나에 몇 개씩 오기 시작했습니다.

전화기 화면에 나오는 한국어 단어 목록

그래서 캘린더 추가에 추가했던 방어 코드를 메일 함수에도 적용시키도록 했습니다.

한국어로 된 문자 메시지의 스크린샷

그래서 onEdit()에서 메일 관련된 테스트를 하고 onEdit에서는 다 지우고 관련된 코드들을 메일 함수에 쪽으로 다 옮겼습니다. 안 옮기고 트리거 테스트했다가 아래와 같은 일이 벌어졌습니다.

전화기 화면에 나오는 한국어 단어 목록

그렇게 매일 안내 부분은 아래와 같이 완성이 되었습니다.

파란색 배경에 음파 이미지
화면에 나오는 한국 이름 목록

매일 알람이 되었으니 주간 알람 메일도 금방 되겠다 싶었는데

위처럼 지인 생일이 25일에 있는데 이걸 계속 못 가져왔습니다. 그래서 왜 그럴까 생각하다 보니 스프레드시트에 입력된 데이터를 읽어서 메일을 보내주고 있었습니다.

그래서 코드를 캘린더 데이터를 읽어와서 메일을 보내주는 걸로 바꿔줬더니 아주 깔끔하게 지인 생일도 가져오게 되었습니다.

테스트를 onEdit로 해서 아래와 같이 트리거 속성을 바꿔주고 마무리했습니다.

매일 오는 알람은 20시로 체크해놨으니 21시 발표할 때 확인이 가능할 것 같습니다.

그러면서 다음 주 하나 더 해보려고 하는 건 트리거로 주기적으로 메일을 정리해 주는 걸 만들어볼까 합니다.

테스트하다 알았는데

한국어 텍스트가 적힌 휴대폰 스크린샷

제 메일함이 10,000이 넘더라고요. 솔직히 메일이 뭐가 와있는지도 모르겠고 가끔 인증할 때나 확인했는데 찾아보니 apps script로 메일 정리도 된다고 하니 다음 주까지 가능한 만큼 해보도록 하겠습니다.

감사합니다.

2
6개의 답글

👉 이 게시글도 읽어보세요