Raspberry Pi(ラズパイ) から Node-RED を使って Google SpreadSheetを更新する方法
目次
はじめに
本記事ではラズパイから収集したデータを Googleが提供しているGoogle SpreadSheetに書き込む方法について説明します。
GCPのアカウントの作成については複雑な手順もありませんので、記事からは割愛します。
GCPアカウントでやっておくこと
APIの有効化
Google SpreadSheetをラズパイから制御するにあたり、APIを有効化しておく必要があります。GCPのWebコンソールにログインしたら、メニューにあるAPIとサービスのライブラリを選択してください。
APIの検索欄が表示されますので、そこで sheet を入力し、表示される Google Sheets APIをクリックして下さい。
有効にするをクリックしてGoogle Sheets APIを使える状態としてください。
サービスアカウントの作成と秘密鍵の作成
次にサービスアカウントの作成と秘密鍵の作成を行います。こちらはラズパイからGoogle SpreadSheetを更新するためのアカウント作成と、先の手順で説明した Google Sheets APIをコールするための手続きとなります。
GCPのWebコンソールメニューのIAMと管理のサービスアカウントを選択してください。
サービスアカウントの画面の上部にあるサービスアカウントを作成をクリックして下さい。
サービスアカウント名を任意の名前で設定し、完了をクリックして下さい。
これでアカウントが作成されますので、今度は操作のところにあるボタンをクリックし、鍵の作成を選択して下さい。
以下のように聞かれるので、JSONタイプを選択し、作成をクリックして下さい。
自動的に xxxxx.json という名前の秘密鍵のダウンロードが始まると思います。このファイルは大切に保管しておいてください。自分以外の人に見せたり、渡してはいけません。
Google SpreadSheetの準備
Google SpreadSheetの使い方については説明不要かと思いますので、適当なシートを1つ作成してください。
作成したシートの画面右上に共有のボタンがありますので、こちらをクリックして下さい。
すると以下の画面が開きます。
ここでユーザーを追加するのですが、ここには先ほどGCPの手順の中でダウンロードを実施した秘密鍵(xxxxx.json)に記載されている client_email を入れてください。
“client_email": “gcp-test@XXXXXXXX.iam.gserviceaccount.com“,
設定がすんだら以下の画面になりますので、共有をクリックして下さい。
これで Google SpreadSheetの設定も完了です。
ラズベリーパイのNode-REDの設定
node-red-contrib-google-sheets のインストール
使うノードは node-red-contrib-google-sheets となります。ラズベリーパイのNode-REDを起動し、画面右上のメニューからパレットの管理からこちらのノードをインストールしてください。
Gsheetの設定
インストールが完了したらGsheetのノードを置いて設定を行っていきます。
creds .. Google SpreadSheetにアクセスするためのcredentialを設定します。鉛筆マークをクリックすると、以下の画面になりますので、先ほどダウンロードした秘密鍵(xxxxx.json)の中身をそのままコピーして貼り付けてください。
Method .. 指定したセルに対するActionを以下の4つから選択します。今回はUpdate Cellsを使用します。
SpreadsheetID .. 書き込みを行いたいSheetのIDを指定します。SpreadSheetを開いた時のURLから抽出したものを設定してください。IDはURLの中で以下の赤字部分となります。
https://docs.google.com/spreadsheets/d/XXXXX/edit#gid=0
Cells .. 書き込みを行いたいSheetのタブ名+セルで指定します。
例:sheet1!C2
Name .. 任意の名前を設定してください。
これでGsheetの設定も完了です。
その他のノードの設定
SpreadSheetへの書き込み動作を確認するために以下のようなフローを作成します。
タイムスタンプのノードはそのままで問題ありません。create payloadの中身は以下のような形です。Gsheetに書き込む値はmsg.payloadのなかみであることに注意してください。
また、Gsheetの後ろには正常にSpreadSheetへの書き込みが行えたかを確認するためにデバッグのノードを接続しておきます。
動作確認
タイムスタンプのノードの左のボタンをクリックすることで動作を確認します。正常に動作している場合はNode-REDのデバッグ欄に以下のようなメッセージが表示されているかと思います。(もしほかのメッセージが表示されている場合にはおそらく正常に動作しておりません。)
また、少し時間をおいてからSpreadSheetのほうを確認すると、以下のように書き込みが行われていることを確認が出来るかと思います。
最後に
皆さんの環境でも同様に動作の確認が出来ましたでしょうか?少し、いろんな要素が混じってしまい、難しい部分もあったかと思います。
もし何か不明なところがありましたらお気軽にお問合せ下さい。
ディスカッション
コメント一覧
こんにちは。
すばらしい投稿誠にありがとうございます。
無事、Google Sheetに文字の出力ができました。
すみません、1月1日をA列に、1月2日をB列にと、記載する場所を変更したいと思ったのですが、
方法はございますか??
VBAならば、cell(1,1)、cell(2,1)などと表示すると思うので、試してみたのですがエラーが発生してしまったので、お問い合わせさせていただいております。
Paoさん
こんにちは。
確認が遅くなり申し訳ありませんでした。また記事を読んで頂き有難うございます。
既に解決されているかもしれませんが、Google Sheetへの書き込みを行うセルは
GsheetのCellsのプロパティにて指定されております。そのため、
A列1行目に書き込む行うときはこちらを
sheet1!A1
B列3行目に書き込む行うときはこちらを
sheet1!B3
のようにご指定頂くことでご所望の動作が可能かと思います。
別のシート名のセルを編集したい場合は
sheet1
となっている部分を別のシート名にご変更下さい。
こちらで解答になっていれば良いのですが、もし他に気になる点が御座いましたらお知らせください。
Shikya様、
お返事誠にありがとうございます。
例えば10月1日は、sheet1!A1
10月2日は、sheet1!B1に順次日付で変えたいと思っています。
その場合、1ノード手前のfunctionノードで指定すればよいものでしょうか?
dayを日付で変わる変数とした場合、
VBAであれば、Worksheets(“sheet1”).Cells(1,day)などのように記載すると思うのですが、
もしご存じでしたら、ご教示頂くことは可能でございますか?
Pao様
返信が遅くなり大変申し訳御座いません。2度目以降のコメントに対して通知が来ず、気づくのに遅れてしまいました。
ご質問頂いた内容ですが、残念ながら記事で紹介している方法ではPao様の実現したいことは出来ないように見えております。
現状ではセルの指定をGSHEETのノードのCellsのプロパティに行う必要があります。1ノード前のfunctionノードから
環境変数等を利用してGSHEETのプロパティにデータを渡せないかも検討してみましたが、この方法では難しいようです。
もしデータを書き込む度に入力する行を変更出来れば良い、ということであればGSHEETのノードのMethodのプロパティを、
現状、Update CellとしているところをAppend Rowとすることで以前の書き込みデータを消すことなくデータを追加して
いくことが可能ですが、こちらでは如何でしょうか?