[kor] Google Spread Sheet API with Python

31 Mar 2023 By Moohyun Song

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를 생성 & 선택해야 합니다.
    1. GCP Project 선택 및, APIs & Services 콘솔로 이동.
    2. ENABLE APIS AN SERVICES 클릭합니다.
    3. Google Sheets API 검색 & Enable 합니다.

2. Google Sheets API를 위한 서비스 계정 생성

  1. 1번에서 이어서 작업합니다. 좌측 탭에서 Credentials를 클릭합니다.
  2. CREATE CREDENTIALSService account 를 클릭합니다.
  3. Service account name, Service account ID, Service account description을 지정 후, CREATE AND CONTINUE를 클릭합니다.
  4. project role은 Owner로 지정 후, Done 합니다.
  5. 생성한 사용자를 클릭 후, KEYS 로 이동하여 ADD KEYCreate new key 를 통해 JSON 키를 생성합니다.
    • 여기서 생성한 키를 이용하여 Spread sheet에 데이터를 넣을 것입니다.

3. Spread sheet를 생성하고, 생성한 서비스 계정에 권한 부여하기

  1. Spread sheet 생성 후, 우측 공유 (또는 사용자+ 모양의 그림을 클릭합니다.)
  2. 2단계에서 생성한 서비스 계정의 email 주소를 넣어주고, 권한은 편집자(Editor), 이메일 알림 보내기는 체크해제하고 공유합니다.
  3. 공유가 완료되면 해당 Spread Sheet의 ID를 기록합니다. (이 아이디를 통해 해당 sheet에 접근할 것이다.)

4. Python gspread를 통해 spread sheet의 데이터 가져오기

  • 테스트를 위해 아래와 같이 sheet에 데이터를 넣고, 코드 작성의 편의성을 위해 기본 sheet의 이름을 한글에서 영어로 변경하였습니다.

  1. Google Sheet API를 사용하기 위한 PIP 패키지 설치

     #gspread -> gspread API Package
     #oauth2client -> authentication package (with json)
     pip3 install gspread oauth2client
    
  2. 데이터를 불러오는 예시 코드

     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())
    
  3. 결과

    • 여기서 알 수 있는 것은, 기본적으로 list를 사용하여 value를 가져오는 것을 확인할 수 있습니다.

5. Python gspread를 이용하여 sheet 생성, value값 넣기

  • sheet는 같은 문서내에 sheet를 말하는 것임.
    1. 코드
      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)
    
  1. 결과

5-1. 여러가지 방법으로 value 값 넣기

  1. 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로 들어가 함수 처리가 되지 않기 때문에 지정해주어야 합니다.

  2. 셀 병합 예시

     doc = gc.open_by_key(spreadsheet_key)
     sheet = doc.worksheet("sheetname")
     sheet.merge_cells("A1:C1")
    
  3. 행/열에 일렬로 데이터 삽입

     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)