dogrunjp
5/28/2015 - 6:09 AM

PythonでSheets APIを使ってGoogle spreadsheetのレコードを取得する方法(OAuth2.0対応バージョン)

PythonでSheets APIを使ってGoogle spreadsheetのレコードを取得する方法(OAuth2.0対応バージョン)

PythonでSheets APIを使ってGoogle spreadsheetのレコードを取得する方法

Sheets APIはこれまで OAuth 1.0対応していて Google spreadsheetからワークシート全件のリストを取得するための認証は

client = gdata.spreadsheet.service.SpreadsheetsServie(email, password)

のように非常に簡単でした。延々アナウンスされていたことではありますが、 つい先日 Sheet APIのOAuth 1.0のサポートがついに完全に停止してしまったようで 上のような簡単なクライアントの認証はもうできません。

ここは素直にAuth 2.0対応するしかないのですが、Sheets APIは なぜかPython用の公式ドキュメントが無く自分にとっては認証部分を実装するのはかなり苦行。

ということでOAuth 2.0対応した gspreadというSpreadsheetsのwrapperが公開されていたのでこれを利用し、これまでの認証部分をアップデートすることにしました。

準備

はじめに Google Developers Consoleでプロジェクトを作成しJSONキーをダウンロードする必用があります。

  • (サイドバーから)APIと認証>認証情報画面を表示
  • サービスアカウント選び「クライアンIDを作成」
  • JSONキーをダウンロード

「APIと認証」画面では使用するAPIを選択するのですがSheets APIはDrive APIに含まれるようなのでDrive APIを有効にします。

このJSONキーにはclient_emailが含まれますがこれをSpreadsheetの共有作業者として「share」に登録しておきます。

credential clientの作成

JSONキーの情報でcredentialクライアントを作成します。

json_key  = json.load(open(json_key_name.json'))
scope = ['https://spreadsheets.google.com/feeds/']
credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'], scope)
client = gspread.authorize(credentials)

worksheetの取得

これまでgdata.spreadsheet.text_dbを使いワークシート全件を取得していたクラスの アップデートを行いたいので、gspreadでもの全件取得のメソッドを探してみます。 get_all_records()が使えそうなのでこれを試してみます。

gc = gspread.authorize(credentials)
worksheet = gc.open(title).sheet1
# 上記は最初のシートを直接取得しているが、worksheetの名前を指定することも可能
# doc = gc.open(title)
# worksheet = doc.worksheet("Sheet1")
list = worksheet.get_all_records(empty2zero=False, head=1)

とすると辞書型のリストを得ることができました。