GASを実行する(HTTP GET)
Google Apps Script のコードをHTTPのGETリクエストで実行する。
目標
ラズパイのCPU温度を定期的にロギングしてアップロードしたい。
前回
今回
function doGet(e) {...}
関数にてGASのコードをHTTPのGETリクエストで実行する。
対象環境
- Firefox 50.0
- Google Account
- Google Developers Console
- Google Drive
- Google Fusion Tables
- Google Apps Script
Google Apps Script
新規作成
- Google Driveにアクセスし、GASファイルを新規作成する。任意のファイル名にする。手順は前回を参照
コーディング
function myFunction()
関数が定義されているはず。これを、function doGet(e)
に変更する- プレーンテキストで"Hello GAS doGet(e) !!"と返すようにする
ようするに、以下のコードを入力する。
function doGet(e) { return ContentService.createTextOutput("Hello GAS doGet(e) !!"); }
公開
メニュー→
公開
→ウェブアプリケーションとして導入
を選択する ソースコードを変更したら、毎回上記の手続きが必要。変更内容の説明を任意に入力する
- アクセスできるユーザが
自分だけ
であることを確認する 導入
をクリックするウェブアプリケーションとして導入しました。
と表示される
実行
最新のコード
リンクをクリックする- ブラウザで新しいウインドウなりタブなりが開く
- "Hello GAS doGet(e) !!"と表示されていれば成功
分析
GETリクエスト
なお、最新のコード
リンクでなく、現在のウェブアプリケーションのURL
でも実行可能。そのURLをコピーして、ブラウザのロケールバーに入力し、Enterキー押下すると実行される。
doGet(e)
関数はHTTPのGETリクエストを受けると実行される。curl, pythonなどでHTTPリクエストできるが、最も簡単な方法はブラウザのロケールバーにURLを入力して実行することである。
URL
最新のコード
と現在のウェブアプリケーションのURL
はURLが違う。末尾をみると、/exec
、/dev
になっている。おそらく本番用と開発用なのだろう。
名称 | URL書式 |
---|---|
現在のウェブアプリケーションのURL |
https://script.google.com/macros/s/{AAAAA}/exec |
最新のコード |
https://script.google.com/macros/s/{BBB}/dev |
実行結果 | https://script.googleusercontent.com/macros/echo?user_content_key={SomeValue1}&lib={SomeValue2} |
{AAAAA}
と{BBB}
のところも違う。
最新のコード
はブラウザで右クリックしてリンクのURLをコピー
すれば取得できる。実行結果のURLとは別物なので注意。
doGet(e)
関数
GASには特殊な関数がある。
特殊な関数 | 説明 |
---|---|
function doGet(e){...} |
HTTPのGETに対して応答する |
function doPost(e){...} |
HTTPのPOSTに対して応答する |
公式文書を参照。英語…。
応用
URLパラメータの取得
公式文書によると、e.parameter.{URLパラメータキー}
で参照できるらしい。パラメータキーは自分で自由に決めることができる。
たとえば、https://script.google.com/macros/s/{BBB}/dev
のURLに、YourName
というパラメータをつけて送信するなら、https://script.google.com/macros/s/{BBB}/dev?YourName=太郎
のようになる。太郎はパラメータキーの値である。値はリクエスト時に任意の値を指定できる。次郎
でもいい。
URL
https://script.google.com/macros/s/{BBB}/dev?YourName=太郎
をブラウザのロケールバーで叩く。
おそらくブラウザが自動でURLエンコードしてくれるので太郎
のように日本語を使ったり、スペースのようなメタ文字も使えると思う。
コード
function doGet(e) { return ContentService.createTextOutput("Your name is " + e.parameter.YourName); }
e.parameter.YourName
の部分で、YourName
というパラメータキーの値を参照するように指定している。
実行結果
ブラウザでURLを叩く。パラメータキーは、大文字と小文字の区別もするらしい。一言一句まちがえないこと。
https://script.google.com/macros/s/{BBB}/dev?YourName=太郎
の実行結果は以下。
Your name is 太郎
https://script.google.com/macros/s/{BBB}/dev
の実行結果は以下。URLパラメータを指定せずリクエストしたら、undefined
になるらしい。
Your name is undefined
複数のURLパラメータ
https://script.google.com/macros/s/{BBB}/dev?YourName=太郎&YourAge=88
のように、&
で複数のパラメータを区切る。
function doGet(e) { return ContentService.createTextOutput("あなたの名前は「" + e.parameter.YourName + "」です。年齢は「" + e.parameter.YourAge + "」歳です。"); }
実行結果は以下のとおり。
あなたの名前は「太郎」です。年齢は「88」歳です。
課題
以下のことを確かめたい。
- curl, python, javascript などからHTTPリクエストできるか
- Fusion Tables APIを使ってinsert文が発行できるか
- 上記と組み合わせた場合でも認証など手入力なしで実行できるか
所感
HTTPのGETリクエストでGASを実行できた。
これでWebAPIが作れるようになった。返却するテキストの内容をjsonにすれば、本格的なWebAPIにできそう。これは楽しみ。
いやまて、べつにそんなことがしたいわけではなかったのだが。認証なしでFusion Tables APIを実行できるか確かめるのが本題だったはず。そこまでたどり着かなかった。
今回は認証不要だった。しかしそれは、すでにログインしているブラウザから実行したためと思われる。curlなどから実行したら、認証を要求されるのではなかろうか。