구글시트 데이터를 수동으로 관리하다 보면 이런 상황이 반복된다.

  • 반복적인 데이터 복사/붙여넣기로 시간 소모
  • 데이터 갱신 시 수작업으로 인한 오류 발생
  • 복잡한 데이터 처리 로직을 수동으로 적용

즉, Python으로 구글시트 데이터를 제대로 연동하지 않으면 매번 수작업으로 데이터를 관리하게 된다.

이 글에서는 Python의 gspread 라이브러리를 활용해 구글시트 데이터를 자동 업데이트하는 방법을 정리한다.

자주 묻는 질문

❓ Python으로 구글시트 연동이 왜 필요한가?
Python 연동은 반복적인 데이터 수집, 분석, 보고서 생성을 자동화한다. 수동 작업의 오류를 줄이고 업무 시간을 절약한다.

❓ gspread 외에 다른 라이브러리도 있는가?
Google Sheets API를 직접 사용할 수 있다. 그러나 gspread는 Python에서 API를 더 쉽게 다룰 수 있도록 래핑한 라이브러리이다.

핵심 정리:
①Google Cloud Platform(GCP)에서 서비스 계정을 설정한다.
②gspread 라이브러리로 구글시트 데이터를 인증한다.
③Python 코드로 데이터를 읽고 쓴다.

1️⃣ 문제 상황: 구글시트 수동 관리의 비효율성

데이터를 수동으로 관리하다 보면 다음과 같은 문제가 발생한다.

  • 반복 작업으로 인한 업무 시간 낭비가 심하다.
  • 수작업 시 휴먼 에러 발생 가능성이 높다.
  • 데이터 동기화가 지연되어 최신성이 떨어진다.
  • 복잡한 데이터 처리 로직 적용에 한계가 있다.

이러한 비효율성은 업무 생산성을 저해하며 데이터 신뢰도를 낮춘다.

2️⃣ 원인 분석: API 인증 및 라이브러리 미숙지

Python으로 구글시트를 연동하지 못하는 주요 원인은 Google Cloud Platform(GCP) 설정 및 API 인증 메커니즘에 대한 이해 부족 때문이다.

서비스 계정, API 키, 그리고 스코프 설정에 대한 지식이 필요하다. 또한 gspread 라이브러리 사용법을 정확히 모르면 연동 과정에서 어려움을 겪는다.

3️⃣ GCP 설정: 서비스 계정 생성 및 권한 부여

서비스 계정이란 Google Cloud 리소스에 접근하기 위한 비인간 사용자 계정을 의미한다. 구글시트 API를 사용하려면 이 계정을 통해 인증해야 한다.

  1. Google Cloud Console에 접속한다. 새로운 프로젝트를 생성하거나 기존 프로젝트를 선택한다.
  2. "API 및 서비스" > "라이브러리"에서 "Google Sheets API"와 "Google Drive API"를 검색하여 활성화한다.
  3. "API 및 서비스" > "사용자 인증 정보"로 이동하여 "사용자 인증 정보 만들기" > "서비스 계정"을 선택한다.
  4. 서비스 계정 이름을 입력하고, "역할 선택"은 비워둔다. 이후 "완료"를 클릭한다.
  5. 생성된 서비스 계정을 클릭하고 "키" 탭으로 이동한다. "키 추가" > "새 키 만들기" > "JSON"을 선택하고 생성한다.

다운로드된 JSON 파일(예: my-gspread-project-xxxxxxxxxxxx.json)은 보안이 중요하므로 안전한 위치에 보관한다. 이 파일은 Python 스크립트에서 인증에 사용한다. 서비스 계정 이메일 주소(JSON 파일 내 client_email 필드)를 연동할 구글시트에 '편집자' 권한으로 공유해야 한다.

참고로, 구글시트 자동화에는 Apps Script도 활용 가능하다. 하지만 구글시트 Apps Script 자동화 가이드에서 다루듯 Apps Script는 Google 환경 내에서만 작동한다. Python gspread는 외부 시스템과의 유연한 연동에 강점이 있다.

4️⃣ Python 환경: gspread 설치 및 인증

gspread는 Google Sheets API를 Python에서 쉽게 사용할 수 있도록 래핑한 라이브러리이다. 아래 명령어로 gspread와 Google 인증 라이브러리를 설치한다.

pip install gspread google-auth-httplib2 google-auth-oauthlib

설치 후, Python 스크립트에서 서비스 계정 JSON 파일을 이용해 인증을 수행한다.

import gspread

# 서비스 계정 키 파일 경로 지정
SERVICE_ACCOUNT_FILE = 'path/to/your/my-gspread-project-xxxxxxxxxxxx.json' 
# 2026년 최신 버전 gspread는 service_account_from_file 함수를 권장한다.

try:
    gc = gspread.service_account(filename=SERVICE_ACCOUNT_FILE)
    print("Google Sheets API에 성공적으로 연결했다.")
except Exception as e:
    print(f"인증에 실패했다: {e}")
    print("서비스 계정 파일 경로를 확인하거나, API 권한을 재확인해야 한다.")

# 스프레드시트 이름으로 열기
spreadsheet_name = "나의 업무 데이터 시트"
try:
    spreadsheet = gc.open(spreadsheet_name)
    print(f"'{spreadsheet_name}' 스프레드시트를 열었다.")
except gspread.exceptions.SpreadsheetNotFound:
    print(f"'{spreadsheet_name}' 스프레드시트를 찾을 수 없다. 이름이 정확한지 확인해야 한다.")
    exit()

# 특정 워크시트 선택 (첫 번째 워크시트)
worksheet = spreadsheet.worksheet("Sheet1") # 워크시트 이름을 지정한다.
print(f"워크시트 '{worksheet.title}'를 선택했다.")

5️⃣ 데이터 조작: 읽기/쓰기 및 유효성 검사

gspread를 활용하면 시트의 셀, 행, 열 데이터를 쉽게 읽고 쓸 수 있다. 데이터를 조작하기 전에 항상 원하는 워크시트가 올바르게 선택되었는지 확인해야 한다.

데이터 읽기

다양한 방식으로 시트 데이터를 가져올 수 있다.

# 모든 값 읽기 (2차원 리스트)
all_data = worksheet.get_all_values()
print("모든 데이터:", all_data)

# 특정 행의 모든 값 읽기
row_data = worksheet.row_values(1) # 첫 번째 행
print("첫 번째 행 데이터:", row_data)

# 특정 열의 모든 값 읽기
col_data = worksheet.col_values(2) # 두 번째 열 (B열)
print("두 번째 열 데이터:", col_data)

# 특정 셀의 값 읽기
cell_value = worksheet.cell(1, 1).value # A1 셀
print("A1 셀 값:", cell_value)

데이터 쓰기 및 업데이트

개별 셀, 범위 또는 새로운 행을 추가하는 방식으로 데이터를 쓸 수 있다.

# 특정 셀 업데이트
worksheet.update_cell(1, 3, "2026년 업데이트 데이터") # C1 셀 업데이트
print("C1 셀을 업데이트했다.")

# 특정 범위 업데이트 (2차원 리스트)
update_range = [['New A2', 'New B2'], ['New A3', 'New B3']]
worksheet.update('A2:B3', update_range)
print("A2:B3 범위를 업데이트했다.")

# 새로운 행 추가 (가장 마지막 행에)
new_row_data = ["추가 항목 1", "추가 항목 2", "추가 항목 3"]
worksheet.append_row(new_row_data)
print("새로운 행을 추가했다.")

# 특정 위치에 행 삽입
worksheet.insert_row(["삽입 항목 A", "삽입 항목 B"], 2) # 두 번째 행에 삽입
print("두 번째 행에 새로운 행을 삽입했다.")

데이터를 구글시트에 쓰기 전에는 항상 데이터 유효성 검사를 수행하는 것이 중요하다. 예를 들어, 필수 필드가 누락되었는지, 데이터 형식이 올바른지 등을 Python 코드 내에서 미리 확인해야 한다.

6️⃣ 트러블슈팅: 권한과 할당량 문제 해결 방법은?

Python gspread 연동 과정에서 자주 발생하는 두 가지 문제는 권한 문제와 API 할당량 초과이다. 효과적인 문제 해결 방법은 아래와 같다.

권한 문제 해결:

스크립트 실행 중 gspread.exceptions.APIError: {'code': 403, 'message': 'The caller does not have permission'}와 같은 오류가 발생하면, 서비스 계정 이메일 주소가 연동하려는 구글시트에 '편집자' 권한으로 공유되었는지 확인해야 한다. JSON 파일 내 client_email 값을 확인하여 구글시트 공유 설정에 추가한다.

API 할당량 초과 해결:

Google Sheets API는 사용량 제한이 있다. 단기간에 너무 많은 요청을 보내면 Quota Exceeded 오류가 발생한다. 이 경우 다음 방법을 고려한다.

  • Google Cloud Console의 "API 및 서비스" > "할당량"에서 Google Sheets API의 할당량을 확인한다. 필요한 경우 할당량 증량을 요청할 수 있다.
  • 반복적인 요청 사이에 time.sleep() 함수를 사용하여 짧은 지연 시간을 준다. 이는 API 서버에 과부하를 주지 않고 요청이 처리될 시간을 제공한다.
import time

# 예시: 여러 셀을 업데이트할 때
for row_idx in range(1, 10):
    for col_idx in range(1, 5):
        worksheet.update_cell(row_idx, col_idx, f"데이터_{row_idx}_{col_idx}")
        time.sleep(0.1) # 0.1초 지연
print("여러 셀을 업데이트했다 (할당량 제한 고려).")

API 오류 발생 시, Claude Code 시스템 활용하기와 같은 AI 도구를 사용하면 오류 메시지 분석 및 해결 코드 제안을 받아 개발 시간을 단축할 수 있다.

7️⃣ 결과 비교: 수동 작업 vs Python 자동화

Python gspread 자동화는 수동 작업 대비 여러 장점을 제공한다. 아래 표는 두 방법의 주요 차이점을 비교한다.

항목 수동 작업 Python gspread 자동화
시간 소모 매우 높음 (반복적) 거의 없음 (스크립트 실행)
오류 발생 높음 (휴먼 에러) 낮음 (정확한 로직)
확장성 낮음 (수작업 한계) 높음 (복잡한 처리 가능)
최신성 지연될 수 있음 실시간에 가까움
유지보수 매번 수작업 코드 관리 (재활용 가능)

마무리

Python gspread를 제대로 설정하면 구글시트 데이터를 매번 수동으로 업데이트할 필요가 없다.

데이터 처리 작업은 Python 스크립트에게 맡기고, 분석과 전략 수립에 집중하는 것이 핵심이다.

이 블로그에서는 앞으로도 구글시트, Python 데이터 처리, AI 활용 같은 실무 자동화 방법을 계속 정리할 예정이다.

+ Recent posts