PythonからSheets APIを使ってGoogleスプレッドシートを操作してみました。Pythonのクイックスタートの内容を中心に紹介します。
Google Sheets API を使うための準備
まずはじめにAPIを使うためにいくつかの準備を行います。
Google API コンソールでSheets APIを有効化
Google API コンソールでSheets APIを有効化します。こちらのページにアクセスして、任意のプロジェクトを選択するとSheets APIを有効化することができます。
認証情報を作成
OAuth同意画面でサービス名を適当に設定します。その他の項目は記載しなくても大丈夫です。
次にOAuth クライアント IDの認証キーを作成します。APIキーではなくOAuth クライアント IDであることに注意します。アプリケーションの種類は「その他」を選びます。
認証キーが作成されたら、⬇を押してJSONをダウンロードします。ダウンロードしたファイルはclient_secret.json
にリネームして、スクリプトを実行するフォルダに格納しておきます。
Pythonパッケージのインストール
pip
でgoogle-api-python-clientをインストールします。
pip install --upgrade google-api-python-client
APIを使ったGoogleスプレッドシートの読み書き
OAuth認証
APIを使うときは、先程作成した認証キーを使って、認証を行う必要があります。クイックスタートにあるコードですが、get_credentials()
関数を使うことで認証ができます。
実行するとブラウザが起動し、認証画面に飛ぶので、許可ボタンを押します。一度認証が成功すると、~/.credentials
に認証情報が保存されます。
from __future__ import print_function import httplib2 import os from apiclient import discovery from oauth2client import client from oauth2client import tools from oauth2client.file import Storage try: import argparse flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() except ImportError: flags = None SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly' CLIENT_SECRET_FILE = 'client_secret.json' APPLICATION_NAME = 'Google Sheets API Python Quickstart' def get_credentials(): home_dir = os.path.expanduser('~') credential_dir = os.path.join(home_dir, '.credentials') if not os.path.exists(credential_dir): os.makedirs(credential_dir) credential_path = os.path.join(credential_dir, 'sheets.googleapis.com-python-quickstart.json') store = Storage(credential_path) credentials = store.get() if not credentials or credentials.invalid: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME if flags: credentials = tools.run_flow(flow, store, flags) else: credentials = tools.run(flow, store) print('Storing credentials to ' + credential_path) return credentials
スプレッドシートからデータを読む
get_credentials()
関数で認証情報を取得してserviceオブジェクトを作成します。おまじないみたいなものです。
credentials = get_credentials() http = credentials.authorize(httplib2.Http()) discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?' 'version=v4') service = discovery.build('sheets', 'v4', http=http, discoveryServiceUrl=discoveryUrl)
データの取得はspreadsheets.values.getメソッドを使うことでできます。spreadsheetId
とrange
が必須のパラメータです。
spreadsheetId
は、スプレッドシートのURLに記載されているIDになります。https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms
の1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms
の部分です。ちなみにこのIDのスプレッドシートはGoogleが用意しているサンプルです。
range
は読み込む範囲です。Excelと同じ表記です。シート名を指定しない場合(例えばA2:E
のように)は最初のシートになります。
spreadsheetId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms' rangeName = 'Class Data!A2:E' result = service.spreadsheets().values().get( spreadsheetId=spreadsheetId, range=rangeName).execute() values = result.get('values', [])
また、ドキュメントのページは、ブラウザ上でAPIを試すこともできます。
スプレッドシートにデータを書き込む
データの書き込みは、spreadsheets.values.updateメソッドでできますが、OAuth認証でのコードではSCOPES
をhttps://www.googleapis.com/auth/spreadsheets.readonly
とreadonlyにしているため、書き込むことができません。
なので、SCOPES
をhttps://www.googleapis.com/auth/spreadsheets
に変更します。変更したらもう一度認証画面に飛ぶように、古い認証情報が格納されている~/.credentials
を削除しておきます。
なお、必要なスコープは、メソッドのドキュメントのAuthorizationの項に書いてあります。
必須パラメータは、同じくspreadsheetId
とrange
ですが、ValueInputOptionをUSER_ENTERED
に指定しておくと、Googleスプレッドシートに入力したのと同じように文字列が日付に変換されたりします。
rangeName = 'A1:C1' ValueInputOption = 'USER_ENTERED' body = { 'values': [1, 2, 3]], } result = service.spreadsheets().values().update( spreadsheetId=spreadsheetId, range=rangeName, valueInputOption=ValueInputOption, body=body).execute()
spreadsheets.values.updateメソッドは上書きですが、spreadsheets.values.appendメソッドを使うと一番下の行に追記できます。使い方はまったく同じです。
rangeName = 'A:C' ValueInputOption = 'USER_ENTERED' body = { 'values': [1, 2, 3]], } result = service.spreadsheets().values().append( spreadsheetId=spreadsheetId, range=rangeName, valueInputOption=ValueInputOption, body=body).execute()
このコードの場合、1行目になにか書かれていると、2行目に追記する形になります。
さいごに
PythonとSheets APIを使ってGoogleスプレッドシートの読み書きを操作してみました。認証まわりが少し面倒ですが、一度設定してしまえば、get
メソッドやupdate
メソッドを使って読み書きすることはとても簡単でした。