GoogleHomeからRESTを叩いて、実行結果を喋らせる[その2]

[GoogleHomeからRESTを叩いて、実行結果を喋らせるその[0～1]](https://qiita.com/sahksas/items/f35e8b96ca7a25e00a32)
の続き。

# 記事一覧
 - [[0] Raspberrypiのセットアップ](https://qiita.com/sahksas/items/f35e8b96ca7a25e00a32#0-rasberrypi%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)
 - [[1] IFTTTからGoogleAssistant⇒GoogleSpreadSheetでタスク名を書き込む](https://qiita.com/sahksas/items/f35e8b96ca7a25e00a32#1-ifttt%E3%81%8B%E3%82%89googleassistantgooglespreadsheet%E3%81%A7%E3%82%BF%E3%82%B9%E3%82%AF%E5%90%8D%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80)
 - [[2] ローカルネットワークに繋いだRaspberrypiで[1]を受け取る](https://qiita.com/sahksas/items/11944574ca3c24ba0193#2-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AB%E7%B9%8B%E3%81%84%E3%81%A0raspberrypi%E3%81%A71%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B)
 - [[3] Raspberrypiでそのまま[2]を叩く](https://qiita.com/sahksas/items/b7311b139048dd70b532#3-raspberrypi%E3%81%A7%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE2%E3%82%92%E5%8F%A9%E3%81%8F)
 - [[4] Raspberrypiで[3]の結果を受け取る](https://qiita.com/sahksas/items/b7311b139048dd70b532#4-raspberrypi%E3%81%A73%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B)
 - [[5] Raspberrypiで[4]の結果をGoogleHomeに喋らせる](https://qiita.com/sahksas/items/b7311b139048dd70b532#5-raspberrypi%E3%81%A74%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92googlehome%E3%81%AB%E5%96%8B%E3%82%89%E3%81%9B%E3%82%8B)

# [2] ローカルネットワークに繋いだRaspberrypiで[1]を受け取る
RaspBerrypiからgspreadを使ってGoogleSpreadSheet内の値取得と書き込みを行う。

参考:[Using OAuth2 for Authorization — gspread 3.0.0 documentation](http://gspread.readthedocs.io/en/latest/oauth2.html)
## Google側のAPI設定
![処理済～rapture_20180530152729.jpg](https://qiita-image-store.s3.amazonaws.com/0/69848/6e4ddba3-3544-52cf-4ec4-1a58e2531ab6.jpeg)


[Google Developers Console](https://console.developers.google.com/project)にアクセスして、プロジェクトを作成。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69848/c4c1c673-9008-9447-bf4c-9ac12e1c0650.png)

左上メニューからAPIとサービス>ライブラリ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69848/1db729b4-0552-4895-b730-3ec96d1e9b21.png)

「Google Sheet API」と「Google Drive API」を選択して有効にする。

先程と同じ左上メニューで「ライブラリ」の下に合った「認証情報」を押下。
認証情報を作成>サービス アカウント キーの作成

![処理済～rapture_20180530153642.jpg](https://qiita-image-store.s3.amazonaws.com/0/69848/44b88bf8-ee39-5366-0fe4-b67d8f4d0f46.jpeg)

アカウント名を適当につけて、役割はとりあえずProject>編集者。
キーのタイプはJSONを選択。

![処理済～rapture_20180530155455.jpg](https://qiita-image-store.s3.amazonaws.com/0/69848/dfadb3a6-e317-b501-c587-5d24b5e88df3.jpeg)

作成されたjsonファイルの中には色々ごちゃごちゃと書かれているが
ここで必要なのはとりあえず「client_email」。アドレスをコピー。

![処理済～rapture_20180530155918.jpg](https://qiita-image-store.s3.amazonaws.com/0/69848/0482f935-5f61-92e7-def4-6bcb2d125f2e.jpeg)

[[1] IFTTTからGoogleAssistant⇒GoogleSpreadSheetでタスク名を書き込む](https://qiita.com/sahksas/items/f35e8b96ca7a25e00a32#1-ifttt%E3%81%8B%E3%82%89googleassistantgooglespreadsheet%E3%81%A7%E3%82%BF%E3%82%B9%E3%82%AF%E5%90%8D%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80)で作成したSpreadSheet画面の右上から「共有」。

アドレスを貼り付けて「送信」で共有完了。

↑のjsonファイルは後ほど使うのでどこかに保存しておく。

## Raspberry側でGoogleSpreadSheetを弄る準備
```
 $ sudo apt install python3-pip
```
pip3をインストール

```
 $ sudo pip3 install gspread
 $ sudo pip3 install oauth2client
 $ sudo pip3 install PyOpenSSL
```
gspreadとoauth2clientをインストール
PyOpenSSLも環境によっては必要になるらしい。一応インストール。

```
 $ mkdir google_test
```
適当にフォルダを作成。先程作成したサービスアカウントキーのjsonをこの中に入れる。

```py:google_test/test.py
# -*- coding: utf-8 -*-
import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']

credentials = ServiceAccountCredentials.from_json_keyfile_name('保存したjsonファイルの名前.json', scope)
gc = gspread.authorize(credentials)
wks = gc.open('cue').sheet1

print(wks.acell('B1'))
```

pythonファイルを作ってこれもフォルダの中に入れちゃう。

![処理済～rapture_20180530161117.jpg](https://qiita-image-store.s3.amazonaws.com/0/69848/d3b01e02-907d-134e-47c4-714a486ada57.jpeg)

テスト実行。
SpreadSheetのB1セルから「RobotName」が取得出来た。
連携に成功。
サービスアカウントキーを作成してすぐに実行するとエラーが返ってきたので、10分くらい待ってみるといいかもしれない。

## 未実行のタスクをSpreadSheet追加順に受け取る

```py:google_test/test.py
# -*- coding: utf-8 -*-

import gspread
import datetime
from oauth2client.service_account import ServiceAccountCredentials

.
.
.

gc = gspread.authorize(credentials)
wks = gc.open('cue').sheet1

i = 1
for i in wks.col_values(1):
    if wks.cell(i,3).value != '': #C列(RobotDirectory)がブランクでなければ
        if wks.cell(i,5).value == '': #E列(start)がブランクなら
            wks.update_cell(i,5,datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S")) #E列に実行開始日時を入力
            robotdir = wks.cell(i,3).value #C列(RobotDirectory)を取得
            print(robotdir)
```

先程テストしたpythonの11行目以降を書き換え。日時を書き込むのでdatetimeもインポートする。

[[1] IFTTTからGoogleAssistant⇒GoogleSpreadSheetでタスク名を書き込む](https://qiita.com/sahksas/items/f35e8b96ca7a25e00a32#1-ifttt%E3%81%8B%E3%82%89googleassistantgooglespreadsheet%E3%81%A7%E3%82%BF%E3%82%B9%E3%82%AF%E5%90%8D%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80)で準備したGASと関数により3列目には2列目から自動で変換された値が入るようになっているので、それを受け取る。

1行目から最終行までループして、C列に入力があり且つE列に入力がない行からC列の値を取ってくる。
つまり、「命令済みだが未実行の行」ということ。

取得したらE列には日時を入れ、実行済みのフラグとする。

![処理済～rapture_20180530165925.jpg](https://qiita-image-store.s3.amazonaws.com/0/69848/78f56aa2-c297-3722-d25f-33e80bfd0ecf.jpeg)

実行。
C2、C3の値を受け取ることが出来た。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69848/f02c137a-d3d0-a7e6-7ca7-083ea047e665.png)

SpreadSheetを見ると、E列に実行済みを示す日時が入っている。

もう1度同じコマンドを入力しても未実行の行は無いので何も取得できない。
ここまで確認でテスト完了。


[続く](https://qiita.com/sahksas/items/b7311b139048dd70b532)