필자가 제작중인 노션 도우미에는 익명 댓글 시스템이 존재한다. 이 데이터들을 최대한 안전하고 간편하게 보관할 수 있는 방법을 모색하고 있었다. 깃헙에 올릴까? S3를 사용할까? 노션 자체에 이 기록을 올리게 할 순 없을까? 등등을 고민하다가 각 방법들이 완벽한 해결방법은 아니어서 적용하긴 어려움이 있었다.
어느날 어떤 프로그램(오렌지3)에서 구글 스프레드시트를 읽어오는 것을 봤는데 설마 구글 스프레드시트 API가 존재하는 것인지 찾아보았다. 아주 잘 계시더라. 스프레드시트 자체가 DB와 형태가 유사하므로 충분히 활용하면 스프레드시트를 DB대신 사용할 수 있을거라 생각했다. 물론 여기서는 완전하게 DB를 대체할 수 있는 수준으로 주제를 다루진 않는다.
사용한 라이브러리 : https://github.com/burnash/gspread
목표
- 원하는 키가 있는 행의 데이터 가져오기
- 원하는 키가 없으면 새로운 행 만들기
선행작업
- 구글 클라우드 플랫폼 콘솔에서 새로운 프로젝트 생성
- JSON 키 생성 (key.json으로 저장)
- Drive API, Sheet API 활성화
- Sheet 에서 키에 나열된 client_email과 Sheet 공유
작업시작
pip install gspread
import gspread
gc = gspread.service_account(filename='key.json')
sh = gc.open('<Sheet Title>')
# 워크 시트를 선택하는 방법
worksheet = sh.sheet1
worksheet = sh.worksheet("<Work Sheet Title>")
# 특정 값 가져오기
print(sh.sheet1.get('A1'))
sh
의 public 멤버
'add_worksheet', 'batch_update', 'client', 'del_worksheet', 'duplicate_sheet', 'fetch_sheet_metadata', 'get_worksheet', 'id', 'list_permissions', 'remove_permissions', 'reorder_worksheets', 'share', 'sheet1', 'title', 'updated', 'url', 'values_append', 'values_batch_get', 'values_batch_update', 'values_clear', 'values_get', 'values_update', 'worksheet', 'worksheets'
원하는 키가 있는 행
우선 특정 값을 찾아보자.
value = worksheet.find("<Value>")
value
라는 녀석의 public 멤버는 다음과 같다.
'address', 'col', 'from_address', 'input_value', 'numeric_value', 'row', 'value'
위 멤버 메서드/변수에서 row
를 찍어보면 해당 값의 행이 출력된다.
values_list = worksheet.row_values(worksheet.find("<Value>").row)
그럼 위와같이 <Value>로 특정 키를 호출한다고 가정하면 해당 키가 존재하는 행을 가져올거다.
업데이트 / 삽입
업데이트
해당 키의 값을 업데이트 하고자 한다면?
worksheet.update('B1', '<Value>')
위와같이 첫번째 인자에는 행열의 위치를 지정하는데 나 같은 경우엔 소스코드에서 딕셔너리로 열에 대한 정보를 만들어 놓았다.
col = {
'key': 'A',
'value': 'B'
}
worksheet.update(col['value'] + str(t.row), '<Value>')
삽입
worksheet.insert_row(['<Value>', '<Value>'])
insert_row
메서드를 사용하면 0번 행에 값을 추가한다. 0번 행은 구분 값으로 사용하려던터라 마지막 행에 넣는 방법을 찾고자 하였으나 구분값을 굳이 사용하지 않는다면 활용성이 높을 것으로 보인다.
여하튼 값을 찾을 때 값이 없으면 새로운 행을 삽입하는 코드는 아래처럼 작성할 수 있겠다.
find_row = None
try:
find_row = worksheet.find("<Value>")
except:
worksheet.insert_row(['<Value>', '<Value>'])
Ghost