4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

概要

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

gsp.gif

環境

  • Docker
  • Python3系
  • Google Cloud Platform

下準備

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

https://console.cloud.google.com/
gcp_censored.jpg

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

参照記事: これから始めるGCP(GCE) 安全に無料枠を使い倒せ

Google Sheets APIを有効化

スクリーンショット 2021-02-13 17.22.00.png

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

スクリーンショット 2021-02-13 17.22.36.png

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

次に左サイドバーから「APIとサービス→認証情報」を選択。「サービスアカウント」の作成を行います。
参照記事: GCP Service Accountを理解する

スクリーンショット 2021-02-13 17.23.48_censored.jpg

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

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

スクリーンショット 2021-02-13 17.24.53_censored.jpg

秘密鍵を取得

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

Google SpreadSheetsを作成

スクリーンショット 2021-02-13 17.18.49.png

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

スクリーンショット 2021-02-13 17.26.30_censored.jpg

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

コード

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
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
./docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./opt:/root/opt
./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
./opt/test.py
print('test')
$ python test.py

test

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

実装

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

$ touch gs.py
./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

あとがき

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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?