[Python] Google SpreadSheetをAPI経由で読み書きする
こんにちは、@yoheiMuneです。
今日は、Google SpreadSheetをAPI経由で読み書きする方法をブログに書きたいと思います。
- PythonからOAuth2.0を利用してスプレッドシートにアクセスする
上記の手順ののちに、以下のようなJSONファイルをゲットできれば成功です。
そして最後に、ライブラリ系をインストールしておきます。
もし上記でエラーになる場合には、いくつか原因が考えられるので、それぞれ対応する必要があります。
本ブログでは、フロントエンド・Python・機械学習を中心に発信していきます。気になった方はぜひ、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!
今日は、Google SpreadSheetをAPI経由で読み書きする方法をブログに書きたいと思います。
目次
事前準備
まずはGoogle Developer Consoleから、Google Drive APIの有効化と秘密鍵を取得します。具体的な手順は、以下の記事でスクショ記事で説明されていますのでそちらをごらんください。- PythonからOAuth2.0を利用してスプレッドシートにアクセスする
上記の手順ののちに、以下のようなJSONファイルをゲットできれば成功です。
{ "private_key_id": "2cd … ba4", "private_key": "-----BEGIN PRIVATE KEY-----\nNrDyLw … jINQh/9\n-----END PRIVATE KEY-----\n", "client_email": "473 … hd@developer.gserviceaccount.com", "client_id": "473 … hd.apps.googleusercontent.com", "type": "service_account" }また上記の
client_email
を、操作したいスプレッドシートの共有に追加して読み書きできる状態にしておきます。そして最後に、ライブラリ系をインストールしておきます。
pip install --upgrade gspread pip install --upgrade "oauth2client<2.0"ここではPythonではよく利用されているライブラリ(gspread)を利用します。 ここで
oauth2client
はv2より以下で使いたいものが削除されているようですので、上記のようにここでは1系を利用します。認証を行う
上記の事前準備ができたら、認証処理を行います。以下のようなコードで実装することができます。import json import gspread import oauth2client.client # 認証 json_key = json.load(open('client_secret.json')) scope = ['https://spreadsheets.google.com/feeds'] credentials = oauth2client.client.SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'].encode(), scope) gc = gspread.authorize(credentials)最後の
gc
インスタンスが生成できればOKです。もし上記でエラーになる場合には、いくつか原因が考えられるので、それぞれ対応する必要があります。
原因例:モジュール不足
pip install --upgrade pyopenssl, pycrypto
◆2016年3月31日追伸
認証方法に変更があり、oauth2clientのバージョンが2以上の場合は、Google各種サービスのAPIの認証方法(v.2)で認証を行う必要があります。アクセスして読み書きを行う
上記の認証処理が完了すれば、あとはgspreadのAPIリファレンスを参照しながら実装できます。以下のような実装を行って、スプレッドシートの取得/読み取り/書き込みを行うことができます。# 基本的な操作 ##################################### # ワークブックを開く # 引数にワークブック名を指定する wb = gc.open("Python_API_ACCESS_SAMPLE") # シートを取得する # 引数にシート名を指定する sh = wb.worksheet("Sheet1") # 指定したセルの値を更新する sh.update_acell('B2', "it's down there somewhere, let me take another look.") # Rangeでセル一覧を取得する cell_list = sh.range('A1:B7') print(cell_list) # 開く ##################################### # ファイル名を指定してワークブックを開く wb = gc.open("Python_API_ACCESS_SAMPLE") # シートIDを指定してワークシートを開く sht1 = gc.open_by_key('1VTHyBs-EmWh7WVhFG7WmcuImZUsIPtrjP3hpLqQQhCc') # URLを指定してワークシートを開く sht2 = gc.open_by_url('https://docs.google.com/spreadsheets/d/1VTHyBs-EmWh7WVhFG7WmcuImZUsIPtrjP3hpLqQQhCc/edit#gid=0') # ワークシートを選択する ##################################### # インデックスを指定して開く worksheet = wb.get_worksheet(0) # シート名を指定して開く worksheet = wb.worksheet("私のシート") # シート1を開く worksheet = wb.sheet1 # シート一覧を取得する worksheet_list = wb.worksheets() # ワークシートを作成する ##################################### worksheet = wb.add_worksheet(title="A worksheet", rows="100", cols="20") # ワークシートを削除する ##################################### wb.del_worksheet(worksheet) # セルの値を取得する ##################################### # ラベルを指定する val = sh.acell('B1').value print(val) # 行番号と列番号を指定する val = sh.cell(1, 2).value print(val) # 指定した行/列の値を全て取得する ##################################### # 指定した行の値を全て取得する values_list = sh.row_values(1) print(values_list) # 指定した列の値を全て取得する values_list = sh.col_values(1) print(values_list) # シートの全ての値を取得する ##################################### list_of_lists = sh.get_all_values() print(list_of_lists) # セルを見つける ##################################### # 文字列で探す cell = sh.find("John") print("Found something at R%sC%s" % (cell.row, cell.col)) # 正規表現で探す amount_re = re.compile(r'(Big|Enormous) dough') cell = sh.find(amount_re) print(cell) # 合致する全てのセルを取得する ##################################### # 文字列で探す cell_list = sh.findall("Rug store") print(cell_list) # 正規表現で探す criteria_re = re.compile(r'(Small|Room-tiering) rug') cell_list = sh.findall(criteria_re) print(cell_list) # Cellオブジェクト ###################################### cell = sh.acell('A1') value = cell.value # 値 row_number = cell.row # 行番号 column_number = cell.col # 列番号 # セルの更新 ###################################### # 指定したセルの値を更新する sh.update_acell('B1', 'Bingo!') sh.update_cell(1, 2, 'Bingo!') # セルを纏めて更新する(バッチ処理) cell_list = sh.range('H3:K4') for cell in cell_list: cell.value = 'O_o' sh.update_cells(cell_list)ちょっと長くなりましたが、これらの処理があれば大体のことはできそうですね〜。
最後に
今日は、Google SpreadsheetをPythonから利用する方法をブログに書きました。データをプログラムから扱えるようになれば、様々な処理の自動化ができるようになるのでいいですよね。今後もPythonを用いた作業自動化に役立つ記事をいくつか書きたいと思います。本ブログでは、フロントエンド・Python・機械学習を中心に発信していきます。気になった方はぜひ、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!