PythonからGoogleスプレッドシートを操作する方法 スプレッドシートの設定

Python学習【365日チャレンジ!】355日目のマスターU(@Udemy11)です。

あれよあれよという間に、1月も今日で終了です。
ほんと年を取ると、時間が経つのが速くなるといいますが、1ヶ月なんて、まじであっという間に過ぎ去ってしまいます。

なにかの記事で見かけたのですが、年をとって、時間が経つのが速く感じるのは、感動することが少ないからだそうです。

経験が少ない若いときは、初めて体験することも多くて、何かしら日々感動することが多いため、1日の中で記憶に残ることが多いそうです。

一方で、年齢と経験を重ねると、初めての体験がなくなり、日々の感動が少なくなると、記憶に残すことが少なくなって、1日の記憶が少ないため、時間が速く感じるということらしいです。

感動しそうなことを意識して体験するようにすれば、より充実した日常をおくれるということです。

ということで、今日も、感動を求めてPython学習を始めましょう。

昨日の復習

昨日は、PythonでGoogleスプレッドシートを操作するためにスプレッドシートの初期設定をおこないました。

初期設定は非常に簡単で、新規スプレッドシートもしくは、Pythonから操作したいスプレッドシートに、Google Cloud Platformで作成したプロジェクトのアカウントサービスのメールを入力して共有するユーザーを追加するだけでした。

くわしくは、こちらの記事をごらんください。

また、Pythonからスプレッドシートを操作するためのGoogle Cloud Platformの初期設定はこちらの記事をごらんください。

今日は、Googleスプレッドシートの指定されたセルに入力されている値を取得して、その値を元に計算した結果を指定したセルに書き込むプログラムを作成したいと思います。

必要なライブラリ

今回使うライブラリは次の2つです。

  • gspread
  • oauth2client

gspreadは、スプレッドシートを操作可能にするライブラリで、oauth2clientは、Googleの各種APIへのアクセスを可能にするライブラリです。

これらの外部ライブラリをターミナルからpipでインストールしておきましょう。

pip install gspread
pip install oauth2client

コードの流れ

まず、今回書くコードの流れを見ておきましょう。

  • 必要なライブラリをインポート
  • 認証情報を設定
  • Google Cloud Platformにログイン
  • 操作するスプレッドにアクセス
  • 値を取得し、値を入力する

このような流れで書いたコードがこちら

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scopes = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('ダウンロードしたjsonファイル', scopes)
gc = gspread.authorize(credentials)
SHEET_KEY = 'スプレッドシートキー'
worksheet = gc.open_by_key(SHEET_KEY).sheet1
import_value = int(worksheet.acell('A1').value)

for i in range(10):
    num_v = import_value * (i + 1)
    worksheet.update_cell((i + 1), 2, num_v)

jsonファイルを扱うので、jsonライブラリのインポートが必要な気もしますが、ServiceAccountCredentialsでjsonファイルを読み込むだけなので、jsonライブラリをインポートする必要はありません。

どんな計算をするかというと、9行目から10行目に記述していますが、スプレッドシートのA1に入力されている値を取得して、その値にそれぞれ1から10までを掛けた結果をB1からB10に順番に入力するコードになっています。

コードをパーツに分けてチェックしてみます。

必要なライブラリをインポート

最初に必要なライブラリをインポートしています。

import gspread
from oauth2client.service_account import ServiceAccountCredentials

gspreadoauth2clientからServiceAccountCredentialsをインポートしています。

認証情報を設定

次は、認証情報を保存したjsonファイルを読み込んでクレデンシャル変数に代入します。

scopes = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('ダウンロードしたjsonファイル', scopes)

4行目で使うAPIを2つ指定してscopesに代入します。

5行目でscopesjsonファイルを使ってServiceAccountCredentialsクラスでクレデンシャル変数を作成します。

ダウンロードしたjsonファイルの部分は、Google Cloud Platformでダウンロードした秘密鍵のファイル名で、例えばダウンロードしたファイルが【secret-33892-kcidik89d.json】だとすると、5行目のコードの()部分は次のようになります。

('secret-33892-kcidik89d.json', scopes)

そして、ダウンロードしたファイルをこのコードのPythonファイルと同じ階層に移動させます。

Pycharmの場合はこんな感じになります。

PythonからGoogleスプレッドシートを操作する方法 スプレッドシートの設定

Google Cloud Platformにログイン

次は、作成したクレデンシャル変数を使って、Google Cloud Platformにログインオブジェクトを生成します。

gc = gspread.authorize(credentials)

操作するスプレッドにアクセス

さらに操作するスプレッドシートのスプレッドシートキーを取得して、スプレッドシートにアクセスします。

PythonからGoogleスプレッドシートを操作する方法 スプレッドシートの設定

アドレスバーにあるこの文字列部分です。

https://docs.google.com/spreadsheets/d/1NIfLN8Me4StwedlXIq3Bc7tOaAKm3gOKIpmbvGJ14h0/edit#gid=0

この赤色の部分の文字列を、次のコードのスプレッドシートキーの部分に入力します。

SHEET_KEY = 'スプレッドシートキー'
worksheet = gc.open_by_key(SHEET_KEY).sheet1

8行目で先に生成したログインオブジェクトgcSHEET_KEYを使って操作するスプレッドシートにアクセスします。

値を取得し、値を入力する

スプレッドシートのA1に入力されている値を取得して、計算した結果をB1から順番に入力していきます。

import_value = int(worksheet.acell('A1').value)

for i in range(10):
    num_v = import_value * (i + 1)
    worksheet.update_cell((i + 1), 2, num_v)

9行目でワークシートのセルから取得した値をimport_valueに代入しています。

11行目からrangeを使ったforループで10回繰り返して計算していますが、import_valuei + 1つまり1を掛けた値num_vを、セル(i + 1), 2つまりB1に入力し、次のループに入るコードです。

ループは10回繰り返すので、最後の値はセルのB10に代入されます。

動作確認

今回も動作がわかりやすいように、動画にしてみました。

たった16秒の動画ですが、実行したあとのスプレッドシートの値の自動入力が写っていなかったり、Googleスプレッドシートのセルに値を入れ忘れていたりで何度か撮り直しをしました。

きちんと動画が取れたら、あとはYoutubeにアップロードして、ちょこちょこっと説明文を入れるだけなので、ほんとすごい世の中になりましたね。

まとめ

Google Cloud PlatformとGoogleスプレッドシードの設定が問題なくできていれば、今日のコードはスムーズに動くはずです。

ただ、秘密鍵をおいているフォルダが違ったり、単純にスペルミスをしているとエラーが起こるので、エラーの原因を見極めてコードを修正するようにしましょう。

Googleスプレッドシートの値を取得したり、計算結果を自動で入力したりするだけなら、普通にスプレッドシートを使うだけでこと足りますが、この連携が本領を発揮するのはやはりデータベースとしてGoogleスプレッドシートを活用できるところだと思うので、データベース的な使い方を模索していこうと思います。

それでは、明日もGood Python!