[Python] Google Sheets API によるスプレッドシートの操作

gspread というモジュールを使うことで、Python で Googleスプレッドシートを操作してみます。

Google APIs

プロジェクトの作成

Google のAPI を通して、gspread はスプレッドシートを操作します。

そのため最初に、 Google APIs のサイトで新しいプロジェクトを作成します。

ここでは、’test spreadsheet’ というプロジェクトを作成しました。

プロジェクトにAPIを追加

スプレッドシートを操作するためには、以下の2つのAPIが必要です。

Google Drive API

Google Sheets API

まずは、API Library で Google Drive API を検索して、有効化します。

このAPIは、google drive へアクセスするための認証を行うAPIなので、プロジェクトの Google Drive API で、’Create credentials’ を選択し、認証の設定を行います。

その後の選択肢は以下のような感じで進めます。

  • Which API are you using? -> Google Drive API
  • Where will you be calling the API from? -> Web server
  • What data will you be accessing? -> Application data
  • Are you planning to use this API with App Engine or Compute Engine? -> No, I’m not using them
  • Service account name -> test spreadsheet
  • Role -> Project > Editor
  • Key type -> JSON

終わると、認証で用いる json ファイルがダウンロードされます。

このファイルを、client_secret.json という名前にして、Python のコードを書くフォルダに保存します。

次に、 API Library で Google Sheets API を検索して、有効化します。 このAPIは、特に認証などは関係しないので、有効化するだけです。

Python から spreadsheet へアクセス

モジュール

以下の2つのモジュールを用いて、スプレッドシートを操作します。

gspread

Authlib: Python Authentication

gspread が spreadsheet を操作するモジュール、Authlib は認証のためのモジュールです。

gspread の公式のドキュメントでは、OAuth2 というモジュールを認証に用いてますが、このモジュールはもう更新しないそうなので、ここでは以下を参照して Authlib を使います。

Using Authlib with gspread

必要な場合はそれぞれインストールします。

pip install gspread
pip pip install Authlib

スプレッドシート側の準備

操作されるスプレッドシート側では、事前に共有の設定を行う必要があります。

client_secret.json "client_email" という項目があるので、このメールアドレスをコピーして、スプレッドシートの Share ボタンから送信を行い、事前にシートを共有をしておきます。

ここでは、test というスプレッドシートを用意して、一行目に、name と tel、2行目に taro と 000-0000-0000 と入力しました。

Python でスプレッドシートの内容を取得

gspread によるスプレッドシートの操作は、以下に一通り載っています。

More examples of gspread usage

ここでは、スプレッドシート test の内容を取得し、内容を更新して、再度取得してみます。

認証部分は、 Using Authlib with gspread のコードをそのまま利用します。

import gspread

import json
from authlib.client import AssertionSession

def create_assertion_session(conf_file, scopes, subject=None):
    with open(conf_file, 'r') as f:
        conf = json.load(f)

    token_url = conf['token_uri']
    issuer = conf['client_email']
    key = conf['private_key']
    key_id = conf.get('private_key_id')

    header = {'alg': 'RS256'}
    if key_id:
        header['kid'] = key_id

    # Google puts scope in payload
    claims = {'scope': ' '.join(scopes)}
    return AssertionSession(
        grant_type=AssertionSession.JWT_BEARER_GRANT_TYPE,
        token_url=token_url,
        issuer=issuer,
        audience=token_url,
        claims=claims,
        subject=subject,
        key=key,
        header=header,
    )

scopes = [
    'https://spreadsheets.google.com/feeds',
    'https://www.googleapis.com/auth/drive',
]

if __name__ == '__main__':

    # 認証、接続
    session = create_assertion_session('client_secret.json', scopes)
    client = gspread.Client(None, session)

    # シートの取得
    sheet = client.open('test').sheet1

    # シートの内容表示
    print(sheet.get_all_records())
    # [{'name': 'taro', 'tel': '000-0000-0000'}]

    # シートの更新
    sheet.update_acell('A3', 'hanako')
    sheet.update_acell('B3', '111-1111-1111')

    sheet.update_acell('A4', 'jiro')
    sheet.update_acell('B4', '222-2222-2222')

    # シートの内容表示
    print(sheet.get_all_records())
    # [{'name': 'taro', 'tel': '000-0000-0000'}, {'name': 'hanako', 'tel': '111-1111-1111'}, {'name': 'jiro', 'tel': '222-2222-2222'}] 

スプレッドシートの内容の取得、更新が無事に行えました。

プロジェクトの削除

更新できることが分かったので、今回のプロジェクトはテスト用なので削除しておきます。

プロジェクトの削除少し分かりずらいですが、 Google APIs Projectsページ右上の Google Account とNotivication の間にある Settings and Utilities から Project Settings を開き、遷移後のページでごみ箱マークの SHUT DOWN を選択することで、プロジェクトの削除が行えます。