주제: Google Apps Script - 구글 스프레드시트 내용으로 캘린더 자동 등록하기
수정: 2024-03-23 (코드수정)
작성: 2023-05-02
1. 단순·반복 업무 자동화로 효율성 UP
일을 하다 보면 생각보다 단순하며 반복되는 작업을 하는 경우가 있습니다. 이러한 작업은 어려운 일은 아니지만, 생각보다 많은 시간이 할애되는 작업이기도 합니다. 이러한 업무는 자동화하여 효율성을 높일 수 있는 방법 중 하나가 Google Apps Script, GAS입니다. GAS는 구글 앱스(Google Apps)에서 제공하는 자바스크립트 기반의 스크립트 언어로, 구글 서비스와 연동하여 다양한 작업을 자동화할 수 있습니다. GAS의 포맷은 .gs로 문서, 시트 및 양식에 대한 자바스크립트 및 구글 앱을 기반으로 하는 스크립팅 언어입니다. 이를 통해 자동화 또는 특정 앱을 만들 수 있습니다.
간단한 업무의 자동화의 경우, 매크로를 통해서 수행이 가능하곤합니다. 하지만, 일반매크로는 그 활용면에서 제약이 많습니다. 그렇기에 직접 스크립트를 작성함으로써, 본인이 원하는 자동화업무가 필요한 것입니다.
그럼, 구글 스프레드시트 [Spreadsheet]을 활용하여 캘린더[Calendar]에 자동으로 일정등록하는 방법을 공유하도록 하겠습니다.
2. 구글 스프레드시트 내용으로 캘린더 일정 생성하기
2.1. 캘린더ID 확인하기
구글시트에 있는 내용을 캘린더로 자동적으로 등록하기 위해서는 어떤 캘린더를 사용할 것인지 확인이 필요합니다. 그 이후, 캘린더 접근에 대한 권한을 부여해야합니다. 우선, 캘린더 ID부터 확인하도록 하겠습니다.
- 구글 캘린더 접속 : https://calendar.google.com/
- 구글 캘린더 ID 확인하는 방법 : 등록할 캘린더의 좌측의 "⋮"클릭하여, "설정 및 공유" 클릭하여 "캘린더 통합"에서 확인가능
- 개인 캘린더의 경우, 주로 구글계정주소와 동일함
2.2. 문서 확인하기
현재, 아래와 같은 영문출장신청서 시트에서 값을 가져와서 구글 캘린더에 일정을 등록하고자 합니다.
이해를 돕기 위해, 표 안에 셀의 위치를 초록색으로 작성하였습니다.
2.3. 스크립트 작성
해당 스프레드시트에서 Apps Script를 실행하여 코드를 작성합니다.
최종코드
아래 코드는 스프레드시트의 데이터 범위를 가져와서, 일정 제목, 설명, 시작일, 종료일 등의 정보를 추출하여 캘린더에 일정을 자동으로 등록하는 코드입니다. 스크립트를 실행하면, 구글 스프레드시트에 있는 데이터를 기반으로 자동으로 캘린더에 일정이 등록됩니다.
function creatEvent() {
const calID = "위에서 설명한 캘린더ID을 여기에 기입해주세요";
var eventCal = CalendarApp.getCalendarById(calID);
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var startDay = ss.getRange("D13").getValue(); // 출장 시작일
var endDay = ss.getRange("G13").getValue(); // 출장 종료일
var members = ss.getRange("C8:C10").getValues(); // 출장자 #1~#3 성명
var location = ss.getRange("D14").getValue(); // 출장 장소
var description = ss.getRange("D16").getValues(); // 출장 목적
if (startDay == endDay){
eventCal.createAllDayEvent(description, new Date(startDay)).setDescription(description);
}
else if (startDay !== endDay){
eventCal.createAllDayEvent(description, new Date(startDay), new Date(endDay)).setDescription(description);
}
}
function onOpen(){
var ui = SpreadsheetApp.getUi();
ui.createMenu("Sync to Cal").addItem('Create Events Now', 'creatEvent').addToUi();
}
코드분해 (1) - 함수 정의
python에서는 사용자정의함수을 만들때 def을 사용합니다.
이와 유사하게 자바스크립트에서는 fuction { }으로 사용자정의 함수를 생성할 수 있습니다.
- creatEvent( )라는 사용자정의 함수를 만들고, 사용할 변수를 정의합니다.
- 코드를 돌리면, 해당 캘린더에 접속할 수 있도록 승인요청이 발생합니다.
function creatEvent() {
const calID = "위에서 설명한 캘린더ID을 여기에 기입해주세요";
var eventCal = CalendarApp.getCalendarById(calID);
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
}
코드분해 (2) - 변수
해당 시트에서 우리가 가져오고자 하는 값들을 값들을 설정합니다.
필자의 경우에는 출장시작일, 종료일, 출장자인원, 장소, 목적 모두 가져왔습니다.
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var startDay = ss.getRange("D13").getValue(); // 출장 시작일
var endDay = ss.getRange("G13").getValue(); // 출장 종료일
var members = ss.getRange("C8:C10").getValues(); // 출장자 #1~#3 성명
var location = ss.getRange("D14").getValue(); // 출장 장소
var description = ss.getRange("D16").getValues(); // 출장 목적
- 이번에 자바스크립트를 처음 접하다보니 시행착오가 많았습니다.
- console.info( ss.getRange("D13")) 을 사용하는 경우, 정보로그 상태를 보면 값이 표출되는 듯하나, 이는 최종적으로 값을 가져오지 못합니다.
- 그렇기 때문에, console.info()를 사용하고자하는 경우에는 . getValue() 추가적으로 진행해야 합니다.
현재까지의 값들이 잘 표출되는지 확인하고 싶은 경우, 다음 코드를 작성하시면 됩니다.
console.log({ startDay, endDay, members, location, description }); // 로그표출
코드분해 (3) - 캘린더 일정 추가하기
아래의 코드를 통해서 하루종일의 일정으로 캘린더 일정을 추가할 수 있습니다.
- . creatAllDayEvent("캘린더에 표시될 제목", 시작일)
eventCal.createAllDayEvent(description, new Date(startDay)).setDescription(description);
}
하지만, 위의 코드만으로는 출장일정이 하루를 넘어가는 일정에 대해서는 캘린더로 추가가 어렵습니다.
하루인 경우, EndDay를 넣으면, startDay가 동일하기 때문에 오류가 발생합니다.
이를 해결하기위해서는 조건문으로 구분하여 작성이 필요합니다.
- . creatAllDayEvent("캘린더에 표시될 제목", 시작일)
- 여기까지 진행이 완료되면, 문제없이 캘린더에서 일정이 자동적으로 추가된걸 확인하실 수 있습니다.
if (startDay == endDay){
eventCal.createAllDayEvent(description, new Date(startDay)).setDescription(description);
}
else if (startDay !== endDay){
eventCal.createAllDayEvent(description, new Date(startDay), new Date(endDay)).setDescription(description);
}
}
코드분해 (4) - 스프레드시트에 해당 스크립트 표출하기
해당 스크립트를 스프레드시트에 UI로 표출하여 쉽게 사용할 수도 있습니다.
.addItem('사용자 정의 메뉴에 표시될 항목 이름', '앞에서 작성한 함수')
따라서 이 줄은 사용자 정의 메뉴에 "Create Events Now"이라는 이름의 메뉴 항목을 만들고,
클릭하면 앞서 정의한 createEvent 함수가 실행되도록 설정합니다.
function onOpen(){
var ui = SpreadsheetApp.getUi();
ui.createMenu("Sync to Cal").addItem('Create Events Now', 'createEvent').addToUi();
}
3. 정리
추후 작성된 스크립트를 보완할 예정입니다.
- 출장시간 반영
- 승인된 문서에 한해서만 일정등록 - 구글 드라이브 API 등록필요
자바스크립트를 해본 적이 없어서 이것저것 찾아보면서 하다 보니 코드가 난잡할 수도 있습니다. 다만, 저처럼 처음 해보시는 분들께 최대한 쉽게 설명드리려고 작성하였으니 도움 되셨으면 좋겠습니다. 구글 캘린더 속성에 대한 정보는 하단의 링크를 클릭해서 본인만의 스크립트를 만들어보세요
Reference
- SpreadSheet -> Google Calendar 연동하기 : https://m.blog.naver.com/nakim02/222521858066
- 자동화 - 연동을 통한 일정관리 : https://pbj0812.tistory.com/281
- 구글 스프레드시트로 구글캘린더에 일정 연동하는 방법 : https://ux.stories.pe.kr/277
- 자바스크립트 조건문 :https://velog.io/@ldevlog/15.-%EC%A1%B0%EA%B1%B4%EC%9D%B4-%EC%97%AC%EB%9F%AC-%EA%B0%9C-%EC%9D%BC-%EB%95%8C%EC%9D%98-if%EB%AC%B8
'Python > 6️⃣ 자동화' 카테고리의 다른 글
Python 스크립트를 nohup으로 백그라운드에서 실행하기 (16) | 2024.05.29 |
---|