LoginSignup
0
0

More than 1 year has passed since last update.

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

Posted at

ラズパイの取得したデータをリアルタイムでグラフで見れたらいいなと思い、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

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を開く。
  2. プロジェクトの選択 -> 新しいプロジェクトを選択する。
  3. プロジェクト名を入力し、作成をクリックする。
    tempsnip.png
  4. ライブラリ-> Google Drive APIを選択し、「有効にする」をクリック。Google Sheets APIも同様。

1.1.2 サービスアカウントキーの取得

  1. 認証情報 -> 認証情報を作成 -> サービスアカウントを選択
  2. サービスアカウント名を入力、完了をクリック。これでサービスアカウントのメールアドレスが作成される。
  3. 認証情報 -> メールアドレス -> キー ->鍵を追加 ->新しいカギを追加 -> 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?hl=jaとしてしまい、下記のようなエラーが出た。

pydrive.files.ApiRequestError: <HttpError 404 when requesting https://www.googleapis.com/drive/v2/files?alt=json returned "File not found: 

はまってしまったので、解説。<フォルダのID>末尾にある?hl=jaは、ページを表示するパラメータなので不要。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の任意のフォルダにスプレッドシートを作成・編集する

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0