2022年01月21日 更新

ラズパイからGoogleスプレッドシートへ送信

どうも、クラゲです。
RaspberryPiからGoogleスプレッドシートへデータを送信する方法を紹介します
以下の動画は、Pythonスクリプトを実行し、クラウド上にあるGoogleスプレッドシートにタイムスタンプとデータを書き込んでいる様子です。グラフはスプレッドシートで予め散布図を選択しています

応用すれば、センサー値を定期的に書き込んだり、センサーやボタン等で検知したときの日時を書き込んだりすることができます。またGoogleスプレッドシートはクラウド上にあるので、外出先などいつでもどこでも閲覧可能です。
この手のクラウド連携は有料だったり、無料で使えるけどクレジットカード登録が必要だったりします。しかし、今回の方法は、クレジットカード登録など一切必要なく、全て無料で出来ます!

目次

[TOC]

Google Apps Script作成

事前準備としてGoogleスプレッドシート新規作成までお願いします。インターネットを検索すればたくさん情報がありますし、すぐに簡単にできます。
スプレッドシートでGoogle Apps Script(通称GAS)というプログラミング言語を用いて作成します。プログラミング言語はJavaScriptに近く、実行環境はExcelのVBAに非常に似た感覚で簡単に出来ます。

拡張機能 > Apps Script を選択します



以下のような画面が立ち上がります



コードの中身を以下に書き換えます

function doGet(e) {
  //現状Activeになっているsheetを取得
  var sheet = SpreadsheetApp.getActiveSheet();

  //1を追記
  sheet.appendRow([1]);
}



フロッピーアイコンをクリックして保存します。



無題のプロジェクトをクリックしてプロジェクトタイトルで適当に test などと入力して名前を変更をクリックしてください。



次に、インターネット上から実行できるように設定します。
デプロイから新しいデプロイを選択します。



歯車アイコンからウェブアプリを選択します。



アクセスできるユーザー全員に変更して、デプロイボタンを押します。



しばらくすると、アクセスを承認ボタンが出てきますので選択します。



以下のようなウィンドウが表示されるので、自分のアカウントを選択します。



以下の表示が出たら、左下にある小さな 詳細 をクリックします。



左下の小さな test(安全ではないページ)に移動 をクリックします。



以下の表示が出たら、右下の 許可 ボタンをクリックします。



以下の表示が出たら、コピーをクリックしてウェブアプリのURLをコピーします。その後、完了ボタンを押して下さい。



ブラウザの新しいタブを開いて、アドレスバーに先ほどコピーしたURLを貼り付けてEnterキーを押して下さい。ページはエラーになりますが、スプレッドシートに 1 が追記されていれば成功です。新しく開いたページを更新すると 1 がどんどん追記さてゆきます。



タイムスタンプの追記

今度はURLにアクセスした日時を追記します。
スクリプトエディタに戻り、コードの中身を以下に書き換えて上書き保存して下さい。5行目に new Date(), が追加になっています。

function doGet(e) {
  //現状Activeになっているsheetを取得
  var sheet = SpreadsheetApp.getActiveSheet();

  //1列目に日時、2列目に1を追記
  sheet.appendRow([new Date(), 1]);
}



デプロイからデプロイを管理を選択します。



ペンのアイコンをクリックし、バージョンにて新バージョンを選び、デプロイボタンを押します。



以下の画面が出ますが、URLに変化はありませんのでURLを再びコピーする必要はありません。
完了ボタンを押します。



先ほど開いていたブラウザを更新してください。スプレッドシートの最終行に 年/月/日 時:分1 が追記されていれば成功です。



パラメータ送信

URLにパラメータを付加して、それをGoogle Apps Script側で受け取り、スプレッドシートに記述させます。これは例えばラズパイで取得したセンサデータなどをスプレッドシートに記録する等に役立ちます。

スクリプトエディタに戻り、コードの中身を以下に書き換えます。変化点はデータを取り出す部分の追加と、最終行に ,value の追記があります

function doGet(e) {
  //データdata1を取り出す
  var value = e.parameter.data1;

  //現状Activeになっているsheetを取得
  var sheet = SpreadsheetApp.getActiveSheet();

  //1列目に日時、2列目に1、3行目に送信されたデータ値 を追記
  sheet.appendRow([new Date(), 1, value]);
}



同様の手順で更新してください。そのままブラウザを実行すると同様に動きますが先ほどと変化が無いように見えます。
そこで、URLの最後に ?data1=3776 を付け足してEnterキーを押してください。



3列目に 3776 と表示されれば成功です。



RaspberryPiからGET送信

ここまでラズパイは一切登場しませんでしたが、最後にラズパイとの連携です。
今までブラウザに手打ちでURL入力していた内容をラズパイの中のPythonプログラムで実行します。最も簡単に記述できる requests モジュールを活用します。
ラズパイで以下のPythonコードを記述してください

import requests

url = 'https://script.google.com/macros/s/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/exec?data1=Hello'
requests.get(url)

URLは各自置き換えてください。今回最後のパラメータは ?data1=Hello にしました。これで実行するとどうでしょうか?



スプレッドシート側で、このように表示されていれば成功です!
Google Apps Scriptのコード説明は割愛しますが、短いので分かりやすいかと思います。色々と改造してみたり、不明点はウェブで調べてみて下さい。

アプリの停止やアクセス権の削除についてはこちらのページを参照してください。

以上、「ラズパイからGoogleスプレッドシートへ送信」でした!