はじめに
Google Apps Script (GAS) のWebアプリをデプロイする機能を利用すると Web API を作ることができます。
Web API を利用すればスプレッドシートのデータを外部ページから参照・更新するなど、Google Workspaceアプリの利用幅を広げることができます。
Web APIの作り方
シンプルなAPIを作る
まずはJSON文字列を返すだけのシンプルなWeb APIから作ってみましょう。
-
スクリプトプロジェクトを作成する
任意のフォルダにWebアプリとして公開するGASのスクリプトプロジェクトを作成します。 -
スクリプトを編集する
GASでWebアプリを作成するにはGETリクエストに応答する doGet関数 かPOSTリクエストに応答する doPost関数 を定義する必要があります。
以下はGETリクエストに応じて固定された文字列を返すシンプルなWeb APIの例です。function doGet(e) { let data = {author: "__SATO__"}; let json = JSON.stringify(data); // ※1 let response = ContentService.createTextOutput(json); // ※2 response.setMimeType(ContentService.MimeType.JSON); // ※3 return response; }
※1 WebAPIは文字列を返す必要があるのでJSONオブジェクトは文字列化します。
※2 Webアプリとして公開できるようTextOutputオブジェクトに変換します。
※3 レスポンスデータの種類を指定します。
-
APIをデプロイする
スクリプトエディタで「デプロイ」→「新しいデプロイ」と選択し、デプロイの種類を「ウェブアプリ」にしてから「デプロイ」ボタンをクリックしてください。 -
動作を確認する
デプロイが完了すると下図のようにウェブアプリのURLが表示されるのでブラウザでアクセスしてみましょう。すると下図のようにJSON文字列が表示されるはずです。
GoogleWorkspaceアプリと連動させる
doGet関数 や doPost関数 の中は AppsScriptサーバ環境 なので、GoogleWorkspaceアプリと連携する処理は普段のGASの開発と同じ方法で記述できます。
ここでは試しに自分自身にGmailで通知を出すAPIを作ってみましょう。
-
スクリプトプロジェクトを作成する
任意のフォルダにWebアプリとして公開するGASのスクリプトプロジェクトを作成します。 -
スクリプトを編集する
GETリクエストに応答して固定された内容のメールを送信する doGet関数 を定義します。function doGet(e) { // Gmailで通知を出す let recipient = Session.getActiveUser().getEmail(); let subject = "GETリクエストを受け付けました" let timestamp = Utilities.formatDate( new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss" ); let body = `${timestamp}にGETリクエストを処理しました`; GmailApp.sendEmail(recipient, subject, body); // レスポンスを返す let response = ContentService.createTextOutput(body); response.setMimeType(ContentService.MimeType.TEXT); return response; }
-
APIをデプロイする
スクリプトエディタで「デプロイ」→「新しいデプロイ」と選択し、デプロイの種類を「ウェブアプリ」にしてから「デプロイ」ボタンをクリックしてください。 -
動作を確認する
デプロイが完了すると下図のようにウェブアプリのURLが表示されるのでブラウザでアクセスしてみましょう。すると下図のようにブラウザに文字列が表示され、Gmailに通知が届いているはずです。
パラメータを受け取る
ここまではHTTPリクエストに対して固定的された応答を返していましたが、実際のAPIはユーザ入力に応じて動作が異なる場合の方が多いと思います。
そこで、ここからはユーザ入力を受け取って処理する方法を少し紹介していきます。
パスパラメータの処理
GASで作成したWebアプリのULRは基本 "exec" (※テストの場合は"dev") で終わりますが、GASのWebアプリはその後に "/hoge/huga" のようなパスを追加することもでき、"exec"ないし"dev"以降のパスパラメータは doGet関数や doPost関数 の引数として与えられるイベントオブジェクトの pathInfoプロパティ を参照することで取得できます。
以下はGETリクエストのパスパラメータに応じて挨拶を返すAPIのサンプルです。
function doGet(e) {
let pathInfo = new String(e.pathInfo); // "greeting/morning"などの形式
let pathList = pathInfo.split('/'); // ["greeting", "morning"]に変換
let response = null;
if (pathList[0] == 'greeting' && pathList[1] == 'morning') {
response = ContentService.createTextOutput('おはようございます!');
} else if (pathList[0] == 'greeting' && pathList[1] == 'afternoon') {
response = ContentService.createTextOutput('こんにちは!');
} else if (pathList[0] == 'greeting' && pathList[1] == 'evening') {
response = ContentService.createTextOutput('こんばんは!');
} else {
response = ContentService.createTextOutput('ハロー!');
}
response.setMimeType(ContentService.MimeType.TEXT);
return response;
}
上記のAPIがデプロイできたら、デプロイURLの末尾にパスパラメータを付けることで次のような動作を確認できるはずです。
パラメータの処理(GET編)
GASでGETリクエストのクエリパラメータを受け取るには doGet関数 の引数として与えられるイベントオブジェクトのparameterプロパティを参照します。
以下はGETリクエストのクエリパラメータを文字列に埋め込んで表示するAPIのサンプルです。
function doGet(e) {
let name = e.parameter.name;
let age = e.parameter.age;
let response = ContentService.createTextOutput(
`パラメータ: name = ${name}, age = ${age}`
);
response.setMimeType(ContentService.MimeType.TEXT);
return response;
}
上記のAPIがデプロイできたら、デプロイURLの末尾にクエリパラメータを付けることで次のような動作を確認できるはずです。
パラメータの処理(POST編)
GASでPOSTリクエストのリクエストボディパラメータを受け取るには doPost関数 の引数として与えられるイベントオブジェクトのpostDataプロパティを参照します。
以下はPOSTリクエストのリクエストボディパラメータを文字列に埋め込んで表示するAPIのサンプルです。
function doPost(e) {
let postData = JSON.parse(e.postData.contents);
let name = postData.name;
let age = postData.age;
let response = ContentService.createTextOutput(
JSON.stringify({"user input": `name=${name}, age=${age}`})
);
response.setMimeType(ContentService.MimeType.JSON);
return response;
}
doPost関数が保存出来たら以下の設定でAPIをデプロイしてください。
- デプロイの種類:ウェブアプリ
- 次のユーザーとして実行:自分
- アクセスできるユーザー:全員
デプロイが完了したら、次のようなcurlコマンドでAPIの動作を確認しましょう。
curl -L -H "Content-Type: application/json" -d '{"name":"SATO","age":"33"}' https://script.google.com/(中略)/exec
doPostの利用について