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 を選択することで、プロジェクトの削除が行えます。