# 파이썬 구글 시트 DB처럼 사용하기

- Author: @baealex
- Published: 2020-08-21
- Updated: 2021-08-06
- Source: https://blex.me/@baealex/python-%EA%B5%AC%EA%B8%80-%EC%8A%A4%ED%94%84%EB%A0%88%EB%93%9C%EC%8B%9C%ED%8A%B8-db%EC%B2%98%EB%9F%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
- Tags: 파이썬

---

필자가 제작중인 [노션 도우미](https://notion.doum.app) 에는 익명 댓글 시스템이 존재한다. 이 데이터들을 최대한 안전하고 간편하게 보관할 수 있는 방법을 모색하고 있었다. 깃헙에 올릴까? S3를 사용할까? 노션 자체에 이 기록을 올리게 할 순 없을까? 등등을 고민하다가 각 방법들이 완벽한 해결방법은 아니어서 적용하긴 어려움이 있었다.

어느날 어떤 프로그램( [오렌지3](https://orange.biolab.si/) )에서 구글 스프레드시트를 읽어오는 것을 봤는데 설마 구글 스프레드시트 API가 존재하는 것인지 찾아보았다. 아주 잘 계시더라. 스프레드시트 자체가 DB와 형태가 유사하므로 충분히 활용하면 스프레드시트를 DB대신 사용할 수 있을거라 생각했다. 물론 여기서는 완전하게 DB를 대체할 수 있는 수준으로 주제를 다루진 않는다.

사용한 라이브러리: https://github.com/burnash/gspread

#### 목표

- 원하는 키가 있는 행의 데이터 가져오기
- 원하는 키가 없으면 새로운 행 만들기

#### 선행작업

1. 구글 클라우드 플랫폼 콘솔에서 새로운 프로젝트 생성
2. JSON 키 생성 (key.json으로 저장)
3. Drive API, Sheet API 활성화
4. Sheet 에서 키에 나열된 client_email과 Sheet 공유

#### 작업시작

```python
pip install gspread
```

```python
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 멤버

```python
'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'
```

###### 원하는 키가 있는 행

우선 특정 값을 찾아보자.

```python
value = worksheet.find("<Value>")
```

`value` 라는 녀석의 public 멤버는 다음과 같다.

```python
'address', 'col', 'from_address', 'input_value', 'numeric_value', 'row', 'value'
```

위 멤버 메서드/변수에서 `row` 를 찍어보면 해당 값의 행이 출력된다.

```python
values_list = worksheet.row_values(worksheet.find("<Value>").row)
```

그럼 위와같이 <Value>로 특정 키를 호출한다고 가정하면 해당 키가 존재하는 행을 가져올거다.

###### 업데이트 / 삽입

**업데이트**

해당 키의 값을 업데이트 하고자 한다면?

```python
worksheet.update('B1', '<Value>')
```

위와같이 첫번째 인자에는 행열의 위치를 지정하는데 나 같은 경우엔 소스코드에서 딕셔너리로 열에 대한 정보를 만들어 놓았다.

```python
col = {
    'key': 'A',
    'value': 'B'
}

worksheet.update(col['value'] + str(t.row), '<Value>')
```

**삽입**

```python
worksheet.insert_row(['<Value>', '<Value>'])
```

`insert_row` 메서드를 사용하면 0번 행에 값을 추가한다. 0번 행은 구분 값으로 사용하려던터라 마지막 행에 넣는 방법을 찾고자 하였으나 구분값을 굳이 사용하지 않는다면 활용성이 높을 것으로 보인다.

여하튼 값을 찾을 때 값이 없으면 새로운 행을 삽입하는 코드는 아래처럼 작성할 수 있겠다.

```python
find_row = None
try:
    find_row = worksheet.find("<Value>")
except:
    worksheet.insert_row(['<Value>', '<Value>'])
```

<video autoplay="" class="lazy" loop="" muted="" playsinline="" poster="/resources/media/images/content/2020/8/21/14_kPFUY1s3Z5aZSEjR3HEs.mp4.preview.jpg"><source data-src="/resources/media/images/content/2020/8/21/14_kPFUY1s3Z5aZSEjR3HEs.mp4" type="video/mp4"/></video>
