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などから実行したら、認証を要求されるのではなかろうか。