【Python】Google SpreadSheetsから手元のCSVファイルをインポートする

## 概要

タイトルそのまま。
Google SpreadSheetsから手元のCSVファイルの内容を取り込みます。

![gsp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/34af5b29-af88-9a73-cf4e-fdee385133d8.gif)

## 環境

- Docker
- Python3系
- Google Cloud Platform

## 下準備

まず、外部からGoogle SpreadSeetsにアクセスするために「Google Cloud Platform」の設定を行います。

https://console.cloud.google.com/
![gcp_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/0a54f6d8-6ab2-1f0a-f4c4-60d2d6fa9e2c.jpeg)

まだGoogle Cloud Platformのアカウントを持っていない方は下記記事などを参考に作成しておいてください。

参照記事: [これから始めるGCP（GCE） 安全に無料枠を使い倒せ](https://qiita.com/Brutus/items/22dfd31a681b67837a74)

### Google Sheets APIを有効化

![スクリーンショット 2021-02-13 17.22.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/53e72028-b9a8-9a1a-6fad-8a46f591978b.png)

左サイドバーから「APIとサービス→ライブラリ」を選択。各種Google APIが出てくるので、その中から「Google Sheets API」を見つけて有効化します。

![スクリーンショット 2021-02-13 17.22.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/ce2ed9e2-c219-dcd1-8ba4-bf382b15b97f.png)

### サービスアカウントを作成

次に左サイドバーから「APIとサービス→認証情報」を選択。「サービスアカウント」の作成を行います。
参照記事: [GCP Service Accountを理解する](https://qiita.com/t-yotsu/items/5d3d36847fbc71b72b76)

![スクリーンショット 2021-02-13 17.23.48_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/80f45d0a-40c1-027e-ef65-8016ae0453fa.jpeg)

- サービスアカウント名
  - 適当
- サービスアカウントの説明
  - わかりやすければ何でもOK

サービスアカウント名以外は基本的に任意入力項目なので、特にこだわりが無ければ空欄で大丈夫です。

![スクリーンショット 2021-02-13 17.24.53_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/c155a803-04d4-9cf7-2ed3-66758952c567.jpeg)

### 秘密鍵を取得

サービスアカウント詳細ページの下部にいくと「鍵を追加」という項目があるので、JSON形式で秘密鍵を作成。すると手元のデバイスにJSONファイルがダウンロードされるので、「client_secret.json」にリネームして保管しておいてください。（後ほど使用します。）

## Google SpreadSheetsを作成

![スクリーンショット 2021-02-13 17.18.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/566e9e1a-6f19-9e62-a523-d90a4f2ad65a.png)

今回操作するための適当なGoogle SpreadSheetsを作成しておきます。

![スクリーンショット 2021-02-13 17.26.30_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/6ed01622-354e-fb88-2f0b-cc21077e29d5.jpeg)

あと、右の方にある「共有」ボタンから先ほど作成したサービスアカウントのメールアドレスを「編集者」として追加しておくのも忘れずに。

## コード

API経由でGoogle SpreadSheetsにアクセスするための下準備が済んだので、いよいよコードを書いていきます。

### 環境構築

まず、Pythonを実行できる環境をDockerで準備します。

#### ディレクトリを作成

```
$ mkdir csv-to-google-spread-sheets
$ cd csv-to-google-spread-sheets
$ mkdir opt
```

#### 各種ファイルを作成

```
touch Dockerfile
touch docker-compose.yml
touch requirements.txt
```

```dockerfile:./Dockerfile
FROM python:3
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

ADD . /code
WORKDIR /code

RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install -r requirements.txt
```

```yml:./docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./opt:/root/opt
```

```text:./requirements.txt
gspread
oauth2client
```

#### client_secret.jsonを配置

サービスアカウント作成の際にダウンロードした秘密鍵「client_secret.json」をoptフォルダ以下に配置します。


最終的に次のような構成になっていればOK。

```
csv-to-google-spread-sheets
├─ opt
  ├─ client_secret.json
├─ docker-compose.yml
├─ Dockerfile
├─ requirements.txt
```

#### コンテナを起動

```
$ docker-compose up  -d
$ docker exec -it python3 /bin/bash
$ cd opt

root@*********:~/opt# 
```

#### テスト実行

```
touch test.py
```

```python:./opt/test.py
print('test')
```
```
$ python test.py

test
```

ちゃんと「test」と出力されていたら成功です。

### 実装

環境構築ができたので、本格的なコードを書いていきます。

```
$ touch gs.py
```
```python:./opt/gs.py

import gspread
from oauth2client.service_account import ServiceAccountCredentials
import csv

SPREADSHEET_KEY = 'それぞれの値を入力' # 「docs.google.com/spreadsheets/d/xxxxxxxxxxxxx/edit#gid=0」の「xxxxxxxxxxxxx」部分

scope = 'https://spreadsheets.google.com/feeds'
credentials_file_path = './client_secret.json'

credentials = ServiceAccountCredentials.from_json_keyfile_name(credentials_file_path, scope)

gc = gspread.authorize(credentials)
workbook = gc.open_by_key(SPREADSHEET_KEY)

workbook.values_update(
    'シート1', # どのシートに書き込むのかを指定
    params={'valueInputOption': 'USER_ENTERED'},
    body={'values': list(csv.reader(open('./test.csv', encoding='utf_8_sig')))}
)
```

最後に、Google Spread Sheetsに取り込むようのCSVファイルを準備します。

```
$ touch test.csv
```
```./opt/test.csv
Name,Age,Country
Taro,20,Japan
```

次のコマンドを実行し、該当のGoogle SpreadSheetsに↑の内容が書き込まれていれば成功です。

```
$ python gs.py
```

![gsp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/34af5b29-af88-9a73-cf4e-fdee385133d8.gif)

## あとがき

お疲れ様でした。基本的な流れは以上です。あとは各自の目的に合わせてカスタマイズしてみてください。Lambdaとかでも上手く使えそうな気がします。