pythonでspreadsheetを更新する
- fulline
- 2016年6月7日
- 読了時間: 2分
TgL参加チームの各成績を更新する度にリアルタイムでホームページで反映されるように、googleのspreadsheetを利用しています。spreadsheetは複数ファイル同士のデータ共有ができたり、他のgoogleのサービスとの連携がスムーズに行えたり、かなり便利です。pythonで読み書きすることも可能で、ホント助かっています。
さて、早速pythonでspreadsheetを更新していこうと思いますが、今回はOAuth2.0を利用してアクセスします。
その準備として色々設定をしないといけないのですが、設定方法に関しては
の説明が大変わかり易く、参考にさせていただいたので、そちらをご確認ください。
上記URLでgoogle側の設定が完了しましたら、認証用のソースコード「get_oauth.py」を作成します。ここでは、「gspread」と「oauth2client」というライブラリを利用します。

このファイルと同じディレクトリに新規のpythonファイルを用意して進めていきましょう。
その前に、まずspreadsheetのIDが必要です。このIDは、対象のspreadsheetをブラウザ上で開いた時のURLで見ることが出来ます。
「https://docs.google.com/spreadsheets/d/"この文章部分がID"/~」
ブラウザ上で開いたついでに共有設定もしておきましょう。
さて、準備も整ったので、実際に色々試していきましょう。

gspreadはセル番号を直接指定できるから分かりやすくて良いですね。
TgLの場合、選手の各成績(打席数や安打数など)を行ごとに入力しているので「range()」指定は行単位で行っています。
セルを更新する時ですが、出来れば「update_acell() 」と「update_cell()」は使わずに「range()→update_cells()」を利用することをオススメします。
spreadsheetのAPIにはAPI制限があるので、たくさんのセルを1つずつ更新すると、すぐに制限に引っかかってしまいます。
例えば、A1からA10を「update_acell() 」で更新すると10回更新した扱いになります。
一方で、「update_cells()」の場合、更新処理自体は1回扱いになります。
これを10行分やった場合、前者は100回更新、後者は10回更新となります。明らかに後者の方が制限に引っかかりにくいですよね??
また、もう一つ気をつけなければならないのは、すでにセル内に関数が書かれている場合です。取得した値を見てみると分かりますが、取得できている値は関数ではなく、その関数によって得られた結果が格納されています。つまり、そのまま「update_cells()」で更新すると、関数が入っていたセルは、結果の数値に書き換わってしまいます。ですので、この場合は新たに関数をセルに格納してから更新を行ってください。
他にもシート内に特定の値に該当するセルがないか検索したり(.findall())、セル全体を一気に取得したり(.get_all_values())も可能ですが、今回は利用しなかったので省きます。
留言