Google Apps Scriptには、ウェブアプリケーションを公開したりするために「doGet」「doPost」という特別な関数があります。パラメータを加えて渡して上げることで、スプレッドシートのデータなどをJSONで受け取ったり、ウェブページを生成して、ウェブアプリケーションを表示したりなど、非常に重要な機能の1つです。この仕組を使うことで、自作のREST APIを作ることも可能です。

今回は、この「doPost」「doGet」を利用して、実行をするとスプレッドシートに書き込まれるといったものを作ってみたいと思います。

今回使用するスプレッドシートや資料

概要

doGetは、URLに繋げてパラメータを与えて送ります。HTTP通信のGETなわけですが、こちらのほうが利用する範囲が広いんじゃないかなぁと。思いつくだけで言えば、

  1. パラメータ付きで送ってスプレッドシートの値をJSONで取得する(しかも、フィルタした後の値とか)
  2. 予め組んで置いたURLをメールに記載して、クリックすると発動する何か(例えば、承認されるとか、ファイルが作られるとか)
  3. 与えるパラメータに応じて表示するHTMLを切り替える
  4. パラメータを可変でユーザが選んだり、与えたパラメータによってデータを書き換える。
  5. Google Apps Scriptではウェブアプリケーション公開用のメソッドでもある。

doPostは、URLに繋げるのではなくHTTP通信にパラメータを渡すPOST通信です。GETと違いパラメータはURLには出てこないので、認証などを要するようなケースで利用されます。また、バイナリデータを送ったり(アップロード)などでもPOSTを使いますね。

両者の違い、用途としてデータを取得する場合にはGET、送る場合にはPOSTといった感じで使い分けをすると良いでしょう。

※doGetおよびdoPostは、同居は可能ですが1プロジェクトで1個しか用意できないので、複数用意したい場合には仕組みで分けるか?複数プロジェクトを作って運用する必要があります。

doGet

仕組み

仕組みは至って簡単なものです。以下のような感じです。

  • doGetはパラメータを受け取れるようにdoGet(e)という形で記述を行う。
  • 送る側は、公開されてるウェブアプリケーションのURLにパラメータをくっつけて、叩くだけ。
  • 付け加えるパラメータは、?param1=kinoko&param2=takenoko みたいな感じ。この場合2つのパラメータを取得できる
  • パラメータを受け取る側は、e.parameter.param1でkinokoという値が取得できるという塩梅です。
  • 受け取ったパラメータを後は煮るなり焼くなり好きにする。
  • 最後にreturnで、例えばHTML表示をしたり、JSONデータを返して上げれば、プログラムがそのままURLからデータを取得出来るようにもなる。(WebAPI的なものが作れるわけです)。

実行結果

コードを作ってGETパラメータ文字列を組み立ててURLを叩きます。例えば今回使用するスプレッドシートに於いて、【情報通信業】の【2009】の年のデータを引き出したい時には以下のようなURLを組み立てます。

https://script.google.com/macros/s/AKfycbzYnY1ZI3FtspAdnCc9BqC5MpTldd81m1A6KI0bPQilJ4TEU0E/exec?param1=情報通信業&param2=2009

すると、{“value”:194} といったようなJSONで返ってきます。param1が業態の指定・param2が年度の指定になります。業態の指定がおかしかったり、指定した年度の情報がない場合には、valueの値はerrorとして返すようにしています。上記のURLをクリックすると実際に値が返って来ます。

※ただし出力時に、URLはリダイレクトしますので、何かプログラムでデータを取得する場合にはそれを考慮する必要があります。

ソースコード

ポイント

  • 今回の事例は非常に単純な指定したパラメータで値を返すだけですが、複数データを返すような場合には、JSONオブジェクト作成の部分で階層的なコードを書く必要性があるでしょう。
  • 複雑なデータの出力については、SheetAsJsonのコードを再利用するとやりやすいかもしれません。
  • param1やparam2といった部分はソースコード内で決めることができるので、自由にネーミングを付けて下さい。
  • 最終的にContentService.createTextOutputにてJSON文字列を返してあげます。これをやらないと、他のプログラムからJSON出力を取得できません。

doPost

実行結果

※入力して送信するとスプレッドシートに書き込まれます。

ソースコード

GAS側コード

意外とシンプルです。getActiveSpreadsheetが使用できないので、openByIdで開くようにしています。また、formから送られてくるデータはformの各コントロールに付与してるname属性を利用しています。なので、e.parameterの後にname属性を付けると、その値が取得できるので、これを順番に配列に格納し、appendRowで最終行に登録しています。

HTML側コード(POST送信用)

Formの各要素のname属性がdoPost側に渡るe.parameterの値を取り出すときの要素になるので、重複しないようにname属性は付けなければなりません。また、送信ボタンで実行する関数の中で、document.getElementById(“formman”).submit();とあるけれど、これがフォームデータを送るコマンド。その送信先が、formタグのactionに記入されてるURL。これはスプレッドシートの公開URLです。

※全て用意が完了したらウェブページとして一度公開し、URLを取得。一度公開を無効化して、URLをHTML側のFORMの送信先に入れて、再度公開すると使えるようになります。

ポイント

  1. 今回書き込むシートのシート名はPOSTである。
  2. ウェブアプリケーションとして公開した時の公開URLは別途必要になる。
  3. ウェブアプリケーションとして公開する場合、実行権限は今回は自分自身のみにして、他の人が実行しても自分が実行した事になるようにしている。
  4. 完全フリーで公開する場合には、実行権限は自分自身であっても、投稿許可は匿名も可にしておく必要性がある。

関連リンク

共有してみる: