おれんじりりぃぶろぐ

きっと何者にもなれないエンジニアのブログ

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

スクリーンショット 2018-04-15 22.43.41.png (80.4 kB)

GETするとjsonを返してくれます。

curl -L -X GET https://script.google.com/macros/s/xxxx/exec
{"timestamp":"1523790159","content":"hoge"}

手順

「新規作成」-> 「スプレッドシート」を選択します。 スクリーンショット 2018-04-15 22.45.01.png (79.8 kB)

「ツール」->「スクリプトエディタ」でgasを起動します。 スクリーンショット 2018-04-15 22.46.02.png (103.3 kB)

以下のソースコードを実装します。

// データ更新
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);
}

アクセスできるように公開する

[公開] -> 「ウェブアプリケーションとして導入」を選択します。 スクリーンショット 2018-04-16 0.23.24.png (53.4 kB)

以下のように設定して導入をクリックします。 スクリーンショット 2018-04-16 1.04.35.png (77.3 kB)

アプリケーションにアクセスできるユーザーは「全員(匿名ユーザーを含む)」にする必要があります。会社などの組織アカウントでは、制限が書けられていてこの選択肢がないこともあります。その場合は個人アカウントを使ってください。

アクセス先の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)

参考