いつかIoTに役立つように、PythonでGoogleスプレッドシートを編集できるようにする

# 始めに
 何か手軽にIoTに関係するものを自作したいなと思っていたら、
[『訪問者をスマホに通知！Googleスプレッドシートに履歴を保存できるIoTドアベル「Wello」』](https://getnews.jp/archives/2101816/gate)
という記事を見つけました。クラウド上のファイルを読み書きするのは、IoTをやるうえでは必須っぽいので、これを機に勉強してみようかと思います。


# 環境、参考サイト
【環境】
python       3.6.4
conda        4.5.10
gspread      3.0.1
oauth2client 4.1.2

gspreadは直感的に、Googleスプレッドシートを編集するためのライブラリだとわかるけど、
oauth2clientは正直何かわからない:disappointed_relieved:（⇒[oauthとは](https://qiita.com/akabei/items/0eac37cb852ad476c6b9)、[oauth2clientとは](https://hacknote.jp/archives/8474/))



【参考サイト】
1. [PythonでGoogleスプレッドシートを編集](https://qiita.com/akabei/items/0eac37cb852ad476c6b9)
2. [gspreadを使ってpythonからGoogle Spreadsheetsを編集する](http://scuel-developer.hatenablog.jp/entry/2016/06/10/gspread%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6python%E3%81%8B%E3%82%89Google_Spreadsheets%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B)
3. [[Python] Google SpreadSheetをAPI経由で読み書きする](https://www.yoheim.net/blog.php?q=20160205)

基本的に1,2を参考にして進めました。
3はgspreadの使用例が記載されています。


#手順
　まずGoogleスプレッドシート側の準備として、プロジェクトを立ち上げ、APIを有効化してサービスアカウントキーを取得します。そして、GoogleスプレッドシートをAPI経由で編集できるように設定します。これができれば後はpythonプログラムを作成するだけです。

##プロジェクトの立ち上げ
　[Google API コンソール](https://console.developers.google.com/cloud-resource-manager)に行き、プロジェクトを作成をクリックします。
![Google API コンソール](https://qiita-image-store.s3.amazonaws.com/0/325072/46757375-e01e-f68d-e086-3a23dc7bcb54.png)
　そうすると、プロジェクト名を決める画面に変わります。ここでは適当に「TEST」と名付けました。
![プロジェクト作成画面](https://qiita-image-store.s3.amazonaws.com/0/325072/a113d615-9b05-2ae2-10e4-ff429e4cd015.png)
　プロジェクトが作成できたかは、Google API コンソールの画面に戻ると確認できます。
![プロジェクトの確認](https://qiita-image-store.s3.amazonaws.com/0/325072/10de9102-0588-d1ab-6b6d-536377f80add.png)
##APIの有効化
　作成したプロジェクトの名前をクリックして、このプロジェクトのAPIを有効化していきます。
番号の順にクリックしてダッシュボードのページに行きます。
![](https://qiita-image-store.s3.amazonaws.com/0/325072/2208ae38-bb04-f05e-2c91-7cb8c5751122.png)
　ダッシュボードのページに行けたなら、Google Drive APIとGoogle Sheets APIの両方を有効化します。GoogleスプレッドシートはGoogle Drive上に作成されるので、編集するにはGoogle Drive APIも必要です。
　各APIの有効化の方法は簡単で、検索ボックスにAPIの名前を入力し、
![APIの検索](https://qiita-image-store.s3.amazonaws.com/0/325072/44144256-54b5-0439-4288-5811c15d78b4.png)
 「有効にする」というボタンをクリックすればいいです。ここではGoogle Sheets APIの図しか載せていませんが、Google Drive APIも同様に行います。
<img width="525" alt="APIの有効化" src="https://qiita-image-store.s3.amazonaws.com/0/325072/70127bff-2c6f-f98e-2fae-2567dcdd306d.png">
##サービスアカウントキーの取得
　APIが有効化できたなら、サービスアカウントキーを取得します。おそらく通常は認証情報を登録して、不正アクセスなどを防止するのだと思いますが、今回は試しにやってみるだけなので、登録はすっ飛ばします:expressionless:
　まずプロジェクトの画面に行き、下図の左側にある「認証情報」を選択し、右側に現れるウインドウの「サービスアカウントキー」をクリックします。
![認証情報のページ](https://qiita-image-store.s3.amazonaws.com/0/325072/23c1260c-43e9-2b66-165b-9cadfb3a7e6e.png)
　クリックするとサービスアカウントキーの作成画面に切り替わります。アカウント名は適当で良いですが、役割は、「編集者」にしてください。キーのタイプはjsonが推奨されているので、今回はこれにします。
(jsonって何？と思った方のための[リンク](https://thinkit.co.jp/article/70/1))
![サービスアカウントキーの作成](https://qiita-image-store.s3.amazonaws.com/0/325072/69297c08-23bc-3287-2b98-289c0a5c972f.png)
##Google スプレッドシートの設定変更
　キーが取得できたら、GoogleスプレッドシートをAPIで編集できるようにします。
まず、[こちら](https://docs.google.com/spreadsheets/create)からファイルを作成します。画面左上の「無題のスプレッドシート」をクリックして、適当にファイル名を記入します。その後、画面右にある「共有」というボタンをクリックします。
![Google スプレッドシートにある共有ボタン](https://qiita-image-store.s3.amazonaws.com/0/325072/fa6f187f-8b94-abbd-3221-2e725c33d7ed.png)
　下のウインドウが現れるので、共有したいユーザーのアドレスとして、先ほど取得したサービスアカウントキーの「client_email」の行を貼り付けます。これでGoogle スプレッドシート側の準備は完了です。
![共有](https://qiita-image-store.s3.amazonaws.com/0/325072/f99bd14a-04d2-a9f0-f94b-d4bbb7fdbd77.png)

##Pythonによる編集
　ここまでくれば、あとはコードを書くだけです。まずはgspreadとoauth2clientをcondaを使ってインストールしましょう。

```python:
conda install -c conda-forge gspread
conda install -c conda-forge oauth2client 
```

それぞれを無事にインストールできたら、APIを編集するコードを書きましょう。
途中[https://www.googleapis.com/auth/drive](https://www.googleapis.com/auth/drive)というURLが出てきますが、[リファレンス](https://developers.google.com/drive/api/v2/about-auth)によると、これはGoogle Drive上のファイルを編集するのに必要みたいです。

```python:sample.py
import gspread
from oauth2client.service_account import ServiceAccountCredentials

#認証が必要なURL
scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
#Google Drive, Googleスプレッドシートから認証を得る
credentials = ServiceAccountCredentials.from_json_keyfile_name('サービスアカウントキー名（jsonファイル）', scope)
gc = gspread.authorize(credentials)
#ファイルの編集
wks = gc.open('スプレッドシート名').sheet1
wks.update_acell('A1', 'Hello World!')
#変更の確認
print(wks.acell('A1'))
```
これで無事、編集することができるようになりました。
もっと色々なことがしたい人はgspreadの[リファレンス](https://gspread.readthedocs.io/en/latest/)に様々なメソッドが書かれているのそれを参考にしてください。

#終わりに
　今回様々な人がこれに取り組んでいたのもあって、かなりスムーズにできました。取り組んでいて面白かったことは、GoogleのAPIを有効化していく中で、GmailとかいろいろなアプリのAPIがあるのを知ったことです。ネットニュースとかで知ってはいましたが、実際に自分で取り組んでいるときに気づくと、その活用方法に意識が行き、次のモチベーションにつながりました。ゆくゆくは複雑なIoTシステムを作ってみたいと思います。