2016/04/01更新

[Python] Google SpreadSheetをAPI経由で読み書きする

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
今日は、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・機械学習を中心に発信していきます。気になった方はぜひ、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。