2018-02-21

Google Apps ScriptのdoGet関数・doPost関数を解説

Google Apps ScriptのdoGet() doPost()について解説


Google Apps ScriptのページのURLに、GET・POSTリクエストが送られたときに、関数を実行することができます。主に、doGet関数と、doPost関数を利用することで、これを実現できます。これらのトリガを利用して、APIを実行したりできます。ドキュメントが英語だったので、日本語にまとめます。




トリガを使用すると、ドキュメントを開くなどの特定のイベントが発生したときにApps Scriptが自動的に機能を実行します。シンプルトリガーは、ユーザーがGoogleドキュメント、スプレッドシート、またはフォームファイルを開いたときに実行される関数onOpen(e)のように、Apps Scriptに組み込まれた予約済みの関数のセットです。インストール可能なトリガーは単純なトリガーよりも多くの機能を提供しますが、使用する前にアクティブ化する必要があります。どちらのタイプのトリガでも、Apps Scriptはトリガされた関数を、イベントが発生したコンテキストに関する情報を含むイベントオブジェクトに渡します。

Simple Triggers | Apps Script | Google Developers

Triggers let Apps Script run a function automatically when a certain event, like opening a document, occurs. Simple triggers are a set of reserved functions built into Apps Script, like the function onOpen(e), 


doGet(e)

WebアプリからGETリクエストが送られたとき、もしくはユーザーがそのWebアプリにアクセスしたときに、実行される関数です。

eはeventオブジェクトが入っていて、そのリクエストの詳細データが含まれているようです。HTTP GETリクエストが送られたときに、そのリクエストをdoGet関数で取得Google Apps Scriptから、作成したHTMLを、doGet関数でかえすことができます。(ここでは、相席アナライザー.htmlを返しています。)

function doGet() {
  return HtmlService.createTemplateFromFile("相席アナライザー").evaluate();
}

doPost(e)


WebアプリにPOSTリクエストが送られたときに、実行される関数です。
eの中には、POSTリクエストで含まれているパラメータがオブジェクト形式で入っています。

たとえば、このようなHTMLからPOSTリクエストを送るとします。


<form action="https://script.google.com/macros/s/[ID]/exec" method="post" target="_blank">   <!-- methodはpostで -->

   <label>Let`s study GoogleAppsScript!
      <input type="hidden" name="event_title" value="Let`s study GoogleAppsScript!">
   </label><br/>   <!-- nameはこれにしないといけないルール -->

   <label>Study GAS,only this.
      <input type="hidden" name="event_description" value="Study GAS,only this.">
   </label><br/>   <!-- nameはこれにしないといけないルール -->

   <select name="event_schedule">   <!-- nameはこれにしないといけないルール -->
      <option value="2013/12/01/09:00,2013/12/01/12:00">9:00~12:00</option>
      <option value="2013/12/01/13:00,2013/12/01/16:00">13:00~16:00</option>
      <option value="2013/12/01/16:30,2013/12/01/19:30">16:30~19:30</option>
      <!-- valueは予定の開始日時、終了日時という順序で入力。new Dateできる書き方で -->
   </select>

   <input type="submit" value="予定を作成!">

</form>

ここでは、Google Apps ScriptのWebアプリにPOSTリクエストを送信しています。

<form action="https://script.google.com/macros/s/[ID]/exec" method="post" target="_blank">   <!-- methodはpostで -->

Google Apps Scriptから、doPost関数で、POSTリクエストの値を取得できます。

function doPost(e){  //このeの中にPOSTされてきた情報が入っている(オブジェクト形式)

  var event_title = e.parameter.event_title;
  var event_description = e.parameter.event_description;

  var event_schedule = e.parameter.event_schedule;  
}

こちらは一例なので、具体的にdoPost関数で取得されるeの中身を見ていきたいと思います。

フィールド説明
e.queryStringURLのクエリ部分を取得します。name=alice&n=1&n=2
e.parameterパラメーターの最初の1組みを連想配列で返します。{"name": "alice", "n": "1"}
e.parametersそれぞれのキーに、配列の値を返す連想配列を返します。{"name": ["alice"], "n": ["1", "2"]}
e.contextPath空白が返されます。使われることはありません。-
e.contentLengthrequest bodyの長さを返します。GETリクエストなら-1を返します。332
e.postData.lengthrequest bodyの長さを返します。GETリクエストなら-1を返します。332
e.postData.typepost bodyのMINEタイプを返します。text/csv
e.postData.contentsPOST bodyのcontent textを返します。Alice,21
e.postData.namepostDataという値を返します。postData

ここのドキュメントを翻訳しました。

Web Apps | Apps Script | Google Developers

It can be desirable to have an Apps Script web app simulate a multi-page application, or one with a dynamic UI controlled via URL parameters. In order to do this well, you can define a state object to represent the app's UI or page, and push the state into the browser history as the user navigates your app.


参考にしたのはこの記事です。

GoogleAppsScriptメモ:doPostでポストデータを取得〜カレンダー登録へ - Qiita

カレンダーに予定を登録する方法が分かったので、外部HTMLのセレクトメニューから予定を追加できるようなテストアプリ制作に挑戦


なかなかドキュメンテーションの翻訳がなかったので、まとめました。


注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...