やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GASを実行する(HTTP GET)

GASを実行する(HTTP GET)

Google Apps Script のコードをHTTPのGETリクエストで実行する。

目標

ラズパイのCPU温度を定期的にロギングしてアップロードしたい

前回

GASでFusionTablesAPIを叩いてみた

今回

function doGet(e) {...}関数にてGASのコードをHTTPのGETリクエストで実行する。

対象環境

Google Apps Script

新規作成

  1. Google Driveにアクセスし、GASファイルを新規作成する。任意のファイル名にする。手順は前回を参照

f:id:ytyaru:20161127150237p:plain

コーディング

  1. function myFunction()関数が定義されているはず。これを、function doGet(e)に変更する f:id:ytyaru:20161127150309p:plain
  2. プレーンテキストで"Hello GAS doGet(e) !!"と返すようにする f:id:ytyaru:20161127150323p:plain

ようするに、以下のコードを入力する。

function doGet(e) {
  return ContentService.createTextOutput("Hello GAS doGet(e) !!");
}

公開

  1. メニュー→公開ウェブアプリケーションとして導入を選択する f:id:ytyaru:20161127150349p:plain ソースコードを変更したら、毎回上記の手続きが必要。

  2. 変更内容の説明を任意に入力する

  3. アクセスできるユーザが自分だけであることを確認する
  4. 導入をクリックする f:id:ytyaru:20161128080940p:plain
  5. ウェブアプリケーションとして導入しました。と表示される

実行

  1. 最新のコードリンクをクリックする f:id:ytyaru:20161127150639p:plain
  2. ブラウザで新しいウインドウなりタブなりが開く
  3. "Hello GAS doGet(e) !!"と表示されていれば成功 f:id:ytyaru:20161127150714p:plain

分析

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 太郎

f:id:ytyaru:20161127162916p:plain

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」歳です。

f:id:ytyaru:20161127162923p:plain

課題

以下のことを確かめたい。

  • curl, python, javascript などからHTTPリクエストできるか
  • Fusion Tables APIを使ってinsert文が発行できるか
  • 上記と組み合わせた場合でも認証など手入力なしで実行できるか

所感

HTTPのGETリクエストでGASを実行できた。

これでWebAPIが作れるようになった。返却するテキストの内容をjsonにすれば、本格的なWebAPIにできそう。これは楽しみ。

いやまて、べつにそんなことがしたいわけではなかったのだが。認証なしでFusion Tables APIを実行できるか確かめるのが本題だったはず。そこまでたどり着かなかった。

今回は認証不要だった。しかしそれは、すでにログインしているブラウザから実行したためと思われる。curlなどから実行したら、認証を要求されるのではなかろうか。