見出し画像

【GASでIoT】「お天気インジゲータ」の作成(その3)Googleスプレッドシート上のセルの値をレスポンスするだけの簡単なWEBアプリをGASで用意する

ラズベリーパイを使って傘の要否をLEDの点灯色で表示させる、「お天気インジゲータ」について、先回の記事の続きになります。

先回ではGoogleスプレッドシート上に天気情報を取り込んで、「お天気インジゲータ」で利用するための「判定」値をシート上に表示させるところまでを行いました。

今回の記事では、外部からアクセスして「判定」値をレスポンスする簡単なWEBアプリについてご説明します。

実機が関わる場合は様々な理由により、この説明通りにいかない場合がしばしばあります。申し訳ありませんが、自己責任・自己解決でお進めくださるよう、お願いいたします。

特定のセルの値をレスポンスするだけの簡単なプログラムをGAS(GoolgeAppsScript)で作る

「お天気インジゲータ」では、先回の記事で作成した、Googleスプレッドシートの「判定(MAX)」部分([E10]セル)にある数値を利用しています。

Googleスプレッドシートの状態

ラズベリーパイ側からこの値を利用するために、外部からアクセスすると、この値がレスポンスされる、ごく簡単なWEBアプリをGAS(Goolge Apps Script)で作成します。


ここで、スプレッドシートのIDと、シートの名称を確認しておきます。

IDは、スプレッドシートを表示させた状態で、ブラウザのヘッドラインに映し出される以下の<この部分>のことです。

https://docs.google.com/spreadsheets/d/<この部分>/edit#gid=0

シートの名称は、下側にある見出しを確認し、「天気情報」となっていれば結構です。

シートの見出し

早速プログラムを作成しましょう。

まず、Googleドライブを開き、「新規」メニューから、GASプロジェクトを1つ作成してください。(下図参照)

その他を選択し・・・
Google Apps Script を選択

すると、プロジェクトが作成されますので、適当な名称にしておきます。プロジェクトでは、コードを記載するモジュールが自動表示されます。(「コード.gs」という名前になっています)


ここに、以下のコードを貼り付けてください。

//-----------------------------------------
//----ラズパイで天気情報をLED色表示-----------------
//----レスポンス 100:赤 10:黄 0:緑--------
//---著作:Particlemethod-2021年11月22日-----
//---無断複製・転載・配布を禁じます-------------
//-----------------------------------------
function doGet(e) {


  if(e.parameter.x == null){

  //アプリケーションを取得|スプレッドシートのIDは各自のものを記入
  var myApp = SpreadsheetApp.openById('☆スプレッドシートのID☆');

  //対象シートをシートの名前を指定して取得
  var mySheet = myApp.getSheetByName('天気情報');
  
  //判定指標をレスポンスとして返す
  return ContentService.createTextOutput(mySheet.getRange(10,5).getValue());

  }

}

上記のコード中の ☆スプレッドシートのID☆ はご自身のスプレッドシートのIDに変えて、最後に保存します。

作成したプログラムをデプロイして、WEBアプリとして使える様にする

次に、GASで作成したプログラムをデプロイします。

デプロイとは、URLと紐づけして、外部からWEBアプリとしてアクセスできる様にする事です。

手順については以下の記事をご覧ください。

デプロイで気を付けるのが、公開設定です。実行ユーザーは「自分」アクセスできるユーザーは「全員」を選んでください。

デプロイの公開設定

こうすると、Googleにログインしなくてもこのアプリが実行できます。(ラズベリーパイ側からGoolgeログインを自動的に行うのは困難ですので、この様にします)

最後に、デプロイした時の実行URLをメモして、WEBアプリの準備は終了です。

なお、ここで、このスクリプトが正しく動くか、プロジェクトの上にある「実行ボタン」を押して、デモをしたくなりますが、残念ながらうまくいきません。

WEBから実行しないとエラーになります

このプログラムは外部からアクセスする前提で作成しているため、プロジェクト内で実行した場合、エラーが出されてしまいます。


GASのプログラムについての簡単な説明

以下は、プログラムの内容の説明です。興味の無い方はスルー頂いても差し支えありません。

function doGet(e) {・・・ return xxx}

doGet( )関数は外部からアクセスがあった場合に{ }内を実行します。引数はイベントパラメータを呼ばれるもので、URLに続いて付加情報(URLに続いて ?・・・ の形で追加する)を加えてアクセスされた場合に、それを受け取る変数です。

なお、最後にreturn・・・を記載しておくと、レスポンスとしてその内容がアクセスユーザに返されます。

if(e.parameter.x == null){・・・}

このif文は、イベントパラメータが無かった場合の分岐です。

今回は、すべてイベントパラメータ無しでアクセスしますので、意味のない分岐ですが、今後の利用のために残してあります。(e.parameter.x とは、「?x=・・・」という文字を加えてアクセスした場合に使う処理で、これも今回は意味のない記述ですが、ヒナ型として残しています)

var myApp = SpreadsheetApp.openById('☆スプレッドシートのID☆');

var mySheet = myApp.getSheetByName('天気情報');

この2文は、それぞれ「対象のスプレッドシート」および「天気情報」シートを取得しています。

return ContentService.createTextOutput( );

最も肝心な1文です。ContentService.createTextOutput() により、取得した値をWEB上に投げる準備を行い、returnでレスポンスとして返しています。この時の引数 mySheet.getRange(10,5).getValue()は、対象シート(「天気情報」シート)の10行・5列目のセルの値(つまり「判定(MAX)」の値)を示しています。

今回の記事はここまでです。次は最後の記事で、ラズベリーパイ側の配線およびプログラムについて説明します。




この記事が気に入ったらサポートをしてみませんか?