gspread というモジュールを使うことで、Python で Googleスプレッドシートを操作してみます。
Google APIs
プロジェクトの作成
Google のAPI を通して、gspread はスプレッドシートを操作します。
そのため最初に、 Google APIs のサイトで新しいプロジェクトを作成します。
ここでは、’test spreadsheet’ というプロジェクトを作成しました。
プロジェクトにAPIを追加
スプレッドシートを操作するためには、以下の2つの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つのモジュールを用いて、スプレッドシートを操作します。
Authlib: Python Authentication
gspread が spreadsheet を操作するモジュール、Authlib は認証のためのモジュールです。
gspread の公式のドキュメントでは、OAuth2 というモジュールを認証に用いてますが、このモジュールはもう更新しないそうなので、ここでは以下を参照して Authlib を使います。
必要な場合はそれぞれインストールします。
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 を選択することで、プロジェクトの削除が行えます。