ラズパイからGoogle DriveへGoogle Spread Sheetを作成してみた。

ラズパイの取得したデータをリアルタイムでグラフで見れたらいいなと思い、Google Spread Sheetを使えばできるというのが分かった。まず、最初のステップとして、ラズパイからGoogle Spread Sheetに書き込むまでを確認した。

# 環境
Python version:3.9.7
OS: windows: 10.0
Linux raspberrypi: 5.10.63+

# プログラムの実行イメージ
ラズパイからコマンドをたたき、Google Driveの指定したディレクトリへGoogle Spread Sheetを作成する。
Google Cloud Platform（GCP）の設定、Google Drive の設定をしてプログラムを走行する必要がある。
![スクリーンショット 2022-03-03 17.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/e31e2c49-673e-f11a-aaaf-c7b8617ad394.png)

## 1.1 GCPの設定
GCPからGoogle Drive APIとGoogle Sheets APIを有効にしたサービスを取得する。Google Driveとスプレッドシートを操作できる。
### 1.1.1 Google Drive APIとGoogle Sheets APIを有効化
1. [Google Cloud Platform](https://console.developers.google.com/)を開く。
2. プロジェクトの選択 -> 新しいプロジェクトを選択する。
3. プロジェクト名を入力し、作成をクリックする。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/290ffcea-04a6-bc4a-284c-caf10f16a817.png)
4. ライブラリ-> Google Drive APIを選択し、「有効にする」をクリック。Google Sheets APIも同様。
### 1.1.2 サービスアカウントキーの取得
5. 認証情報 -> 認証情報を作成 -> サービスアカウントを選択
6. サービスアカウント名を入力、完了をクリック。これでサービスアカウントのメールアドレスが作成される。
7. 認証情報 -> メールアドレス -> キー ->鍵を追加 ->新しいカギを追加 -> JSON -> 作成をクリック。サービスアカウントキーが生成する。ここで生成したjsonファイルをラズパイに置く。

## 2. Google Drive の共有
Google Driveのフォルダを共有し、スプレッドシートを作成できるようにする。
### 2.1 Google Driveの権限付与
1. Google Drive を開き、保存したいフォルダを選択する。ここで「共有」ボタンをクリックし、サービスアカウントで生成したメールアドレスを追加する。
2. Google DriveのフォルダIDを確認する。フォルダIDは、folders以下の分。
※Google Driveを日本語に設定していた場合フォルダIDの末尾に?hl=jaと表示されるが、その部分はフォルダIDではないので不要。

```
 https://drive.google.com/drive/folders/<フォルダのID>
```
### Google DriveのフォルダのIDの補足
フォルダIDをxxxxxxxxxxxx<font color="Blue">?hl=ja</font>としてしまい、下記のようなエラーが出た。
```
pydrive.files.ApiRequestError: <HttpError 404 when requesting https://www.googleapis.com/drive/v2/files?alt=json returned "File not found: 
```
はまってしまったので、解説。<フォルダのID>末尾にある<font color="Blue">?hl=ja</font>は、ページを表示するパラメータなので不要。jaは、日本語を表している。

## 3. プログラムの実行
### 3.3.1 ライブラリのインストール
ラズパイに下記ライブラリをインストールした。
```
pip install gspread oauth2client google-api-python-client google-auth-httplib2 google-auth-oauthlib pydrive
```

### 3.3.2 プログラムの実行
ラズパイにGCPで生成したjosnファイルを置いて、下記プログラムを実行すると、指定したGoogle DriveへGoogle Spread Sheetを書き込むことができた。

```write_spread.py
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import pprint

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
json_keyfile_path = 'サービスアカウントキー.json'

# サービスアカウントキーを読み込む
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    json_keyfile_path, scope)

# pydrive用にOAuth認証を行う
gauth = GoogleAuth()
gauth.credentials = credentials
drive = GoogleDrive(gauth)

folder_id = '<フォルダのID>'
f = drive.CreateFile({
    'title': 'sample_spread',
    'mimeType': 'application/vnd.google-apps.spreadsheet',
    "parents": [{"id": folder_id}]})
f.Upload()

# 作成したスプレッドシートの情報を出力
pprint.pprint(f)

# gspread用に認証
gc = gspread.authorize(credentials)

# スプレッドシートのIDを指定してワークブックを選択
workbook = gc.open_by_key(f['id'])
worksheet = workbook.sheet1

# A1のセルに入力
worksheet.update_acell('A1', 'Hello World!')

# 2行目の1~3列目に入力
cell_list = worksheet.range(2, 1, 2, 3)
cell_list[0].value = '連番'
cell_list[1].value = '名前'
cell_list[2].value = '電話番号'

# スプレッドシートを更新
worksheet.update_cells(cell_list)
```

# 今後
ラズパイから取得したデータをSpread Sheetに書き込めるようにする。
また、Google BigQueryとMetabaseを利用したグラフの作成が面白そうなので、調べて試してみたい。 

# リンク
下記サイトを参考にさせていただいた。
[pythonでGoogle Driveの任意のフォルダにスプレッドシートを作成・編集する](https://qiita.com/koshitake2m2/items/9843ca8e38f425af4896)