파이썬 자동화로 구글 캘린더 반복 일정 쉽게 관리하기

구글 캘린더에 일정을 수동으로 하나씩 입력하는 일이 번거로우신가요. 파이썬과 Google Calendar API를 활용하면 단 몇 줄의 코드로 일정을 자동으로 등록하고 관리할 수 있어요.


특히 매주 반복되는 회의나 정기적인 일정을 한 번에 등록할 수 있어서 업무 효율이 크게 향상돼요.


파란색 배경에 31일이 표시된 구글 캘린더 공식 아이콘


Google Cloud Console 프로젝트 설정하기


먼저 Google Cloud Console에 접속해서 새 프로젝트를 만들어야 해요. 브라우저에서 https://console.cloud.google.com 에 접속한 후 상단의 프로젝트 선택 메뉴를 클릭해요.


새 프로젝트 만들기를 선택하고 프로젝트 이름을 입력해요. 프로젝트가 생성되면 왼쪽 메뉴에서 API 및 서비스로 이동한 다음 라이브러리를 클릭해요.


검색창에 Google Calendar API를 입력하고 검색 결과에서 선택한 후 사용 버튼을 클릭해요. 이제 캘린더 API를 사용할 준비가 되었어요.


OAuth 2.0 인증 정보 생성하기


API를 사용하려면 인증 정보가 필요해요. API 및 서비스 메뉴에서 사용자 인증 정보로 이동한 다음 사용자 인증 정보 만들기를 클릭해요.


OAuth 클라이언트 ID를 선택하고 애플리케이션 유형은 데스크톱 앱으로 설정해요. 이름을 입력하고 만들기를 클릭하면 인증 정보가 생성돼요.


생성이 완료되면 credentials.json 파일을 다운로드해요. 이 파일은 파이썬 프로젝트 폴더에 저장해두면 돼요.


파이썬 환경 설정하기


macOS 터미널을 열고 필요한 라이브러리를 설치해요.


pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib


설치가 완료되면 파이썬 파일을 생성하고 필요한 모듈을 임포트해요.


import os.path
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build

SCOPES = ['https://www.googleapis.com/auth/calendar']


인증 및 서비스 객체 생성 코드


구글 캘린더 API와 연동하기 위한 인증 함수를 작성해요. 이 함수는 처음 실행할 때 브라우저 인증을 요구하고 이후에는 저장된 토큰을 사용해요.


def get_calendar_service():
    creds = None
    
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        
        with open('token.json', 'w') as token:
            token.write(creds.to_json())
    
    return build('calendar', 'v3', credentials=creds)


단일 일정 자동 등록하기


이제 실제로 일정을 등록하는 코드를 작성해봐요. 일정 정보를 딕셔너리 형태로 정의하고 API를 호출해요.


service = get_calendar_service()

event = {
    'summary': '파이썬 자동 일정 테스트',
    'location': '온라인',
    'description': '파이썬 코드로 구글 캘린더 일정 자동 등록 예제',
    'start': {
        'dateTime': '2025-07-30T10:00:00+09:00',
        'timeZone': 'Asia/Seoul',
    },
    'end': {
        'dateTime': '2025-07-30T11:00:00+09:00',
        'timeZone': 'Asia/Seoul',
    },
    'attendees': [
        {'email': 'user1@example.com'},
    ],
    'reminders': {
        'useDefault': False,
        'overrides': [
            {'method': 'email', 'minutes': 24 * 60},
            {'method': 'popup', 'minutes': 10},
        ],
    },
}

event_result = service.events().insert(calendarId='primary', body=event).execute()
print("일정이 추가되었습니다:", event_result.get("htmlLink"))


반복 일정 자동 등록하기


매주 반복되는 회의나 정기적인 일정은 recurrence 필드를 활용해요. RRULE 규칙을 사용하면 다양한 반복 패턴을 설정할 수 있어요.


event = {
    'summary': '매주 팀 회의',
    'start': {
        'dateTime': '2025-07-30T09:00:00+09:00',
        'timeZone': 'Asia/Seoul',
    },
    'end': {
        'dateTime': '2025-07-30T10:00:00+09:00',
        'timeZone': 'Asia/Seoul',
    },
    'recurrence': [
        'RRULE:FREQ=WEEKLY;COUNT=10'  # 10주간 매주 반복
    ],
}

event_result = service.events().insert(calendarId='primary', body=event).execute()
print("반복 일정이 추가되었습니다:", event_result.get("htmlLink"))


RRULE 규칙의 다양한 활용 예시를 살펴봐요.


# 매일 반복 (30일간)
'RRULE:FREQ=DAILY;COUNT=30'

# 매월 첫째 월요일
'RRULE:FREQ=MONTHLY;BYDAY=1MO'

# 평일만 반복
'RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR'

# 특정 날짜까지 반복
'RRULE:FREQ=WEEKLY;UNTIL=20251231T000000Z'


중복 일정 방지하기


자동화 스크립트를 여러 번 실행해도 중복 일정이 생기지 않도록 체크 로직을 추가해요.


def add_event_if_not_exists(service, new_event):
    # 기존 일정 조회
    events_result = service.events().list(
        calendarId='primary',
        q=new_event['summary'],
        timeMin=new_event['start']['dateTime'],
        timeMax=new_event['end']['dateTime'],
        maxResults=1
    ).execute()
    
    items = events_result.get('items', [])
    
    if not items:
        # 중복 없음 - 일정 등록
        service.events().insert(calendarId='primary', body=new_event).execute()
        print(f"'{new_event['summary']}' 일정이 추가되었습니다.")
    else:
        print(f"'{new_event['summary']}' 일정이 이미 존재합니다.")


여러 일정 한 번에 등록하기


CSV 파일이나 리스트에서 여러 일정을 읽어와 한 번에 등록할 수도 있어요.


import csv
from datetime import datetime, timedelta

def bulk_add_events(service, csv_file):
    with open(csv_file, 'r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        
        for row in reader:
            event = {
                'summary': row['title'],
                'description': row['description'],
                'start': {
                    'dateTime': row['start_time'],
                    'timeZone': 'Asia/Seoul',
                },
                'end': {
                    'dateTime': row['end_time'],
                    'timeZone': 'Asia/Seoul',
                }
            }
            
            try:
                service.events().insert(calendarId='primary', body=event).execute()
                print(f"일정 '{row['title']}' 추가 완료")
            except Exception as e:
                print(f"오류 발생: {e}")

# 사용 예시
service = get_calendar_service()
bulk_add_events(service, 'events.csv')


일정 수정 및 삭제하기


등록된 일정을 수정하거나 삭제하는 것도 간단해요.


# 일정 수정
def update_event(service, event_id, updates):
    event = service.events().get(calendarId='primary', eventId=event_id).execute()
    
    for key, value in updates.items():
        event[key] = value
    
    updated_event = service.events().update(
        calendarId='primary',
        eventId=event_id,
        body=event
    ).execute()
    
    return updated_event

# 일정 삭제
def delete_event(service, event_id):
    service.events().delete(calendarId='primary', eventId=event_id).execute()
    print("일정이 삭제되었습니다.")


실전 활용 팁


일정 자동화를 더욱 효과적으로 활용하는 방법들이에요.


스케줄러와 연동하면 정해진 시간에 자동으로 일정을 등록할 수 있어요. macOS의 cron이나 파이썬의 schedule 라이브러리를 활용해보세요.


import schedule
import time

def daily_event_check():
    service = get_calendar_service()
    # 오늘의 일정 체크 및 필요한 일정 추가
    
schedule.every().day.at("09:00").do(daily_event_check)

while True:
    schedule.run_pending()
    time.sleep(60)


외부 시스템과 연동해서 더 강력한 자동화를 구현할 수도 있어요. 엑셀 파일에서 일정을 읽어오거나 웹 크롤링으로 수집한 정보를 캘린더에 자동 등록하는 것도 가능해요.


일정에 색상을 지정하거나 특정 캘린더를 지정하는 것도 가능해요. colorId 필드를 사용하면 일정별로 다른 색상을 적용할 수 있어요.


이렇게 구글 캘린더 API와 파이썬을 활용하면 복잡한 일정 관리도 자동화할 수 있어요. 반복적인 작업을 줄이고 실수도 방지할 수 있어서 업무 효율이 크게 향상돼요.


파이썬으로 폴더 안의 모든 PDF 파일에서 텍스트 한 번에 추출하기