【Python】Pythonを使ってGoogle Spread Sheetを操作してみる
社内でやっているIoT案件にて、PythonからGoogle Spreadsheetにデータを送信する必要があったので試してみた。
環境
手順
1. Google Spread SheetのAPIキーを取得する
Google API コンソールのページに遷移する
「アプリケーションを登録するプロジェクトの選択」から任意のプロジェクトを選択する
プロジェクトが存在しない場合、「プロジェクトの作成」をクリックし、プロジェクトを作成する。
プロジェクトを作成した場合、認証用の鍵がダウンロードされる。
ダウンロードした認証用の鍵は「client_secret.json」というファイル名にリネームし、実行ファイルと同じ場所に置いておく。
2. Google API用のPythonパッケージをダウンロードする
pip
を利用してgoogle-api-python-client
, oauth2client
をダウンロードする
※ サンプルコードはgoogle-api-python-client
だけでいいっぽいけど、うちの環境ではoauth2client
も必要だった。
$ pip install --upgrade google-api-python-client $ pip install --upgrade oauth2client
3. サンプルコードを写経する
サンプルコードのコードをエディタに書き、動かしてみる。
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 # If modifying these scopes, delete your previously saved credentials # at ~/.credentials/sheets.googleapis.com-python-quickstart.json SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly' CLIENT_SECRET_FILE = 'client_secret.json' APPLICATION_NAME = 'Google Sheets API Python Quickstart' def get_credentials(): """Gets valid user credentials from storage. If nothing has been stored, or if the stored credentials are invalid, the OAuth2 flow is completed to obtain the new credentials. Returns: Credentials, the obtained credential. """ 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: # Needed only for compatibility with Python 2.6 credentials = tools.run(flow, store) print('Storing credentials to ' + credential_path) return credentials def main(): """Shows basic usage of the Sheets API. Creates a Sheets API service object and prints the names and majors of students in a sample spreadsheet: https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit """ 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) spreadsheetId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms' rangeName = 'Class Data!A2:E' result = service.spreadsheets().values().get( spreadsheetId=spreadsheetId, range=rangeName).execute() values = result.get('values', []) if not values: print('No data found.') else: print('Name, Major:') for row in values: # Print columns A and E, which correspond to indices 0 and 4. print('%s, %s' % (row[0], row[4])) if __name__ == '__main__': main()
ソースの流れを見る感じ、get_credentials()
でOAuthの認証情報を取得し、ローカルにjson形式で保存。
json形式で保存することで、2回目以降の認証をスキップできるみたい。
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)
このあたりでGoogle SpreadsheetへアクセスするためのServiceを作成している。 Spreadsheetの内容を取得するのは以下コード部分。
spreadsheetId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms' rangeName = 'Class Data!A2:E' result = service.spreadsheets().values().get( spreadsheetId=spreadsheetId, range=rangeName).execute() values = result.get('values', [])
spreadsheetId
でアクセス先のSpreadsheetを設定し、rangeName
で取得する位置を設定している。
データの取得自体はservice.spreadsheets().values().get()
を利用する。
ちなみにデータの書き込みは上記サンプルコードのうち、以下の部分を書き換える。
# SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly' SCOPES = 'https://www.googleapis.com/auth/spreadsheets' # result = service.spreadsheets().values().get(...).execure() ValueInputOption = 'USER_ENTERED' body = { 'values': [[1, 2, 3]] } # データの書き込みは service.spreadsheets().values().update() を利用する # データの追記は service.spreadsheets().values().append() を利用する # valueInputOption='USER_ENTERED`オプションを利用すると、「書式設定」が自動になり、通常入力と同じ状態になる # → 入力時に書式を自動判別してくれる result = service.spreadsheets().values().update( spreadsheetId=spreadsheetId, range=rangeName, valueInputOption=ValueInputOption, body=body).execute()
参考サイト
- PythonとSheets API v4でGoogleスプレッドシートを読み書きする - kumilog.net
- Python Quickstart | Sheets | Google Developers
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
はじめてのGoogleスプレッドシートの教科書2018: データ入力・四則演算・関数の基礎・フィルター・グラフ・ピボットテーブルetc...大学生・新卒のためのはじめてのスプレッドシートの教科書
- 作者: 武田雅人,阿南大輝,久原英之
- 出版社/メーカー: 株式会社Tekuru
- 発売日: 2018/05/12
- メディア: Kindle版
- この商品を含むブログを見る