gasを使ったお手軽WebAPI実装
概要
超お手軽にWebAPIを作る方法です。 GASを使って、POSTしてスプレッドシートにデータを保存してそれをGETする方法です。 40秒でAPI作りなと言われた時の対応法です。
実演
POSTするとspreadsheetに保存してくれます。
curl -X POST -d "timestamp=1523790159&content=hoge" https://script.google.com/macros/s/xxxx/exec
GETするとjsonを返してくれます。
curl -L -X GET https://script.google.com/macros/s/xxxx/exec {"timestamp":"1523790159","content":"hoge"}
手順
「新規作成」-> 「スプレッドシート」を選択します。
「ツール」->「スクリプトエディタ」でgasを起動します。
以下のソースコードを実装します。
// データ更新 function doPost(e) { // パラメータのパース var timestamp = e.parameters.timestamp; var content = e.parameters.content; var sheet = SpreadsheetApp.getActive().getSheetByName('シート1'); var sheetData = sheet.getDataRange().getValues(); sheetData.push([timestamp, content]); // シートへの書き込み、getRange(開始行、開始列、行数、列数) sheet.getRange(1,1,sheetData.length,2).setValues(sheetData); } // データ取得 function doGet(e) { var sheet = SpreadsheetApp.getActive().getSheetByName('シート1'); var sheetData = sheet.getDataRange().getValues(); // 最終行を取得する var timestamp = String(sheet.getRange(sheet.getLastRow(),1,1,1).getValue()); var content = sheet.getRange(sheet.getLastRow(),2,1,1).getValue(); var result = {'timestamp': timestamp, 'content': content}; return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON); }
POSTリクエストが来た場合にはdoPost()
がGETリクエストが来た場合にはdoGet()
が呼ばれます。
JSONでのPOST
jsonでpostしたい場合は以下のようにします。
function doPost(e) { var json = e.postData.getDataAsString(); var data = JSON.parse(json); var timestamp = data.timestamp var content = data.content var sheet = SpreadsheetApp.getActive().getSheetByName('シート1'); var sheetData = sheet.getDataRange().getValues(); sheetData.push([timestamp, content]); // シートへの書き込み、getRange(開始行、開始列、行数、列数) sheet.getRange(1,1,sheetData.length,2).setValues(sheetData); }
アクセスできるように公開する
[公開] -> 「ウェブアプリケーションとして導入」を選択します。
以下のように設定して導入をクリックします。
アプリケーションにアクセスできるユーザーは「全員(匿名ユーザーを含む)」にする必要があります。会社などの組織アカウントでは、制限が書けられていてこの選択肢がないこともあります。その場合は個人アカウントを使ってください。
アクセス先のURLが表示されるのでメモします。
注意
スクリプトの更新を行った時には、ウェブアプリケーションの導入を再度行う必要があります。(面倒くさい)その場合でもURLは変わらないようです。
おまけ
Unityからでも問題なく使えます。
using UnityEngine; using System.Collections; using UnityEngine.Networking; public class APITest : MonoBehaviour { void Start() { StartCoroutine(GetText()); } IEnumerator GetText() { UnityWebRequest www = UnityWebRequest.Get("https://script.google.com/macros/s/xxxx/exec"); yield return www.SendWebRequest(); if(www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { // 結果をテキストとして表示します Debug.Log(www.downloadHandler.text); } } }
{"timestamp":"1523790159","content":"hoge"} UnityEngine.Debug:Log(Object)