[kor] Google Spread Sheet API with Python
gspread를 사용하면 얻을 수 있는 이점
- 코드로 얻은 결과물을 수동으로 재 입력할 필요가 없습니다.
- 사용자는 즉시 전달된 excel 데이터를 Google Spread Sheet에 접속하여 한눈에 확인이 가능합니다.
- 얻은 데이터의 계산식을 excel 함수로 처리해서 확인할 수 있습니다.
gspread를 사용하기 위한 필요 사항
- Google Cloud가 활성화 된 Google Account
- spread sheet를 저장할 Google Drive 용량
* GCP Console 언어는 English를 기준으로 작성되었습니다.
1. GCP Console에서 Google Sheets API 활성화
- 우선 GCP Project를 생성 & 선택해야 합니다.
- GCP Project 선택 및,
APIs & Services
콘솔로 이동. ENABLE APIS AN SERVICES
클릭합니다.Google Sheets API
검색 & Enable 합니다.
- GCP Project 선택 및,
2. Google Sheets API를 위한 서비스 계정 생성
- 1번에서 이어서 작업합니다. 좌측 탭에서
Credentials
를 클릭합니다. CREATE CREDENTIALS
→Service account
를 클릭합니다.Service account name
,Service account ID
,Service account description
을 지정 후,CREATE AND CONTINUE
를 클릭합니다.- project role은
Owner
로 지정 후, Done 합니다. - 생성한 사용자를 클릭 후,
KEYS
로 이동하여ADD KEY
→Create new key
를 통해 JSON 키를 생성합니다.- 여기서 생성한 키를 이용하여 Spread sheet에 데이터를 넣을 것입니다.
3. Spread sheet를 생성하고, 생성한 서비스 계정에 권한 부여하기
- Spread sheet 생성 후, 우측 공유 (또는 사용자+ 모양의 그림을 클릭합니다.)
- 2단계에서 생성한 서비스 계정의 email 주소를 넣어주고, 권한은 편집자(Editor), 이메일 알림 보내기는 체크해제하고 공유합니다.
- 공유가 완료되면 해당 Spread Sheet의 ID를 기록합니다. (이 아이디를 통해 해당 sheet에 접근할 것이다.)
- 예시) https://docs.google.com/spreadsheets/d/1at-DAxAsDfVBQeaDXjBAXGRfRcKVUgxW8ZeVIU/edit#gid=0
위 링크에서
1at-DAxOAsDfQvQeaDXjBAXGRfRcKVUgxW8ZeVIU
가 해당 Sphread Sheet의 ID입니다.
- 예시) https://docs.google.com/spreadsheets/d/1at-DAxAsDfVBQeaDXjBAXGRfRcKVUgxW8ZeVIU/edit#gid=0
위 링크에서
4. Python gspread를 통해 spread sheet의 데이터 가져오기
-
테스트를 위해 아래와 같이 sheet에 데이터를 넣고, 코드 작성의 편의성을 위해 기본 sheet의 이름을 한글에서 영어로 변경하였습니다.
-
Google Sheet API를 사용하기 위한 PIP 패키지 설치
#gspread -> gspread API Package #oauth2client -> authentication package (with json) pip3 install gspread oauth2client
-
데이터를 불러오는 예시 코드
import gspread from oauth2client.service_account import ServiceAccountCredentials scope = [ 'https://spreadsheets.google.com/feeds' ] # 같은 경로에 위에서 생성한 Key JSON File이 위치한다. cred_json_file_name = './sheet_credential.json' credentials = ServiceAccountCredentials.from_json_keyfile_name(cred_json_file_name,scope) gc = gspread.authorize(credentials) spreadsheet_key = '<YOUR KEY>' doc = gc.open_by_key(spreadsheet_key) worksheet = doc.worksheet('Main') print(worksheet.row_values(1)) print(worksheet.col_values(1)) data_range = worksheet.range("A1:B2") for cell in data_range: print(cell.value) print(worksheet.get_all_values())
-
결과
-
여기서 알 수 있는 것은, 기본적으로 list를 사용하여 value를 가져오는 것을 확인할 수 있습니다.
-
5. Python gspread를 이용하여 sheet 생성, value값 넣기
- sheet는 같은 문서내에 sheet를 말하는 것임.
- 코드
import gspread from oauth2client.service_account import ServiceAccountCredentials scope = [ 'https://spreadsheets.google.com/feeds' ] cred_json_file_name = './sheet_credential.json' credentials = ServiceAccountCredentials.from_json_keyfile_name(cred_json_file_name,scope) gc = gspread.authorize(credentials) spreadsheet_key = '<YOUR KEY>' doc = gc.open_by_key(spreadsheet_key) #rows와 cols를 지정해주어야 한다. #추가로 row와 col을 늘리고 싶다면, append_row 또는 add_rows(num) 또는 add_cols(num)를 사용하면 된다. new_sheet = doc.add_worksheet(title="new sheet name", rows=10, cols=10) cell_list = new_sheet.range('A1:C3') for index,cell in enumerate(cell_list): cell.value = index new_sheet.update_cells(cell_list)
-
결과
5-1. 여러가지 방법으로 value 값 넣기
-
cell에 함수 입력하는 예시
doc = gc.open_by_key(spreadsheet_key) sheet = doc.worksheet("sheetname") sheet.update( 'A3', "=MIN(A1:A3)", value_input_option='USER_ENTERED')
기본적으로 text로 들어가기 때문에, 뒤에
value_input_option='USER_ENTERED'
를 지정 해주지 않으면 함수가 그대로 text로 들어가 함수 처리가 되지 않기 때문에 지정해주어야 합니다. -
셀 병합 예시
doc = gc.open_by_key(spreadsheet_key) sheet = doc.worksheet("sheetname") sheet.merge_cells("A1:C1")
-
행/열에 일렬로 데이터 삽입
doc = gc.open_by_key(spreadsheet_key) sheet = doc.worksheet("sheetname") data = ['A','B','C'] cell_list = open_worksheet.range('A1:A3') for i, cell in enumerate(cell_list): cell.value = data[i] sheet.update_cells(cell_list)