🍊

10 分でできる REST API モックサーバ構築(GAS編)

2023/11/30に公開

こんにちは!アルダグラムでエンジニアをしている安政です。

外部サービスとの API 連携開発をおこなっていると、

  • 受け取り側のサービスにテスト環境を用意するのが難しい
  • 開発中のサービスのため、API サーバが構築されていない

といった問題に遭遇することがあるかもしれません。

そのような場合、Google Apps Script を用いるとPOSTされたデータが保存されるモックサーバを簡単に構築できます。

もちろん、業務上重要なデータは送信しないようにしてくださいね。

今回は、「Google Apps Script」 でリクエストを受け取り、「Google Spread Sheets」 にデータが格納されることを試していきたいと思います。

GAS を用いて API サーバーを公開しよう

最初に、データを溜めていきたい Google Spread Sheet を用意してください。
シートに名前をつけましょう。
1 行目に受け取りたいカラム名を入れてください。

今回は「StackOfBooks」というシート名で、「Title」「Status」「URL」というカラムを用意してみました。
読みたい本が溜まっちゃうのは世の常ですね。

用意ができましたら、「ツールバー」の「拡張機能」の箇所から、「Apps Script」を選択してください。

選択をすると「Apps Script」のコード入力画面が出てきたかと思います。

この画面に実行用のスクリプトを記載することで、取得した後の動作等を記載することができます。

この記事では、全体の流れについて記述したいので、各メソッドについての解説はコード内のコメントとして記載しようと思います。


// API を受け取る関数
// 関数名は doPost にする必要がある
function doPost(e){
  let contents = e.postData.getDataAsString();

  // デバッガを用いてテストをする場合は、コメントを外す
  // let contents = '{"Title": "LEADING QUALITY", "Status": "Reading", "URL": "https://www.amazon.co.jp/LEADING-QUALITY-Ronald-Cummings-John/dp/4048931121"}';

  main(contents);

  let outputContent = getOutputContent();
  return outputContent;
}

function getOutputContent(){
  let output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(JSON.stringify({ message: "success" }));
  return output;
}

// 受け取ったパラメータの処理を行う準備をする
function main(message){
  // 格納したいシートを指定
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('StackOfBooks');
  // カラム名と列のマッピングを行う
  let colMapping = createColIndex(sheet)

  // メッセージのパース
  let params = JSON.parse(message);
  
  // データのインサートを行う  
  insertRow(sheet, params, colMapping);
}

//カラム名からカラムidの表を生成する (col_hash)
function createColIndex(sheet){
  // ヘッダー行の指定
  let headerRow = sheet.getDataRange().getValues()[0];
  // 何列めまでカラムが設定されているかを指定する
  let idColomnNum = getIdColomnNum(headerRow);

  // マッピングをおこなっていく
  let currentColomn = idColomnNum
  let result = {}
  let currentRange = sheet.getRange(1, currentColomn)
  while(currentRange.getValue() !== ""){
    result[currentRange.getValue()] = currentColomn
    currentColomn+=1;
    currentRange = sheet.getRange(1, currentColomn)
  }
  return result;
}

// データの左端カラムの位置を取得。
function getIdColomnNum(headerRow){
  let i = 0
  for (const header of headerRow){
    if ( header === ""){
      i++;
      continue;
    } else {
      break;
    }
  }
  return i + 1;
}

// データをインサートしていく
function insertRow(sheet, params, colMapping){
  // 一番下の行を取得
  let lastRowNum = sheet.getLastRow();
  let insertRowNum = lastRowNum + 1;

  for (const colName of Object.keys(params)){
    let value = params[colName]
    let colIndex = colMapping[colName]
    sheet.getRange(insertRowNum, colIndex).setValue(value)
  }
}

Apps Script のデバッグ機能等を用いて、必要な動作の確認を行なってください。

最後に、API の公開を行います。

画面右上に「デプロイ」と大きく表示されていると思うので、「新しいデプロイ」を選択してください。
種類は「ウェブアプリ」を選択しましょう。
「アクセスできるユーザー」は全員としてください。

デプロイが完了すると、ウェブアプリのリンクとIDが表示されるのでコピーしたおきましょう。
これで、誰でも実行可能な API が公開されました。

こちらの API にアクセスすると、Spread Sheet にデータが格納されます。

$ curl -L \
  'https://script.google.com/macros/s/{作成されたIDを指定する}/exec' \
  -d '{"Title": "LEADING QUALITY", "Status": "Reading", "URL": "https://www.amazon.co.jp/LEADING-QUALITY-Ronald-Cummings-John/dp/4048931121"}'
{"message":"success"}

最後に

Google Apps Script を利用すると、とても簡単にモックサーバーを作ることができました。
開発の生産性を上げる一つの選択肢になると嬉しいです。

誰でも簡単に使えるものを作れる Google はやはり素晴らしいと思います。
私たちも利便性と拡張性のバランスをとりながら、プロダクト開発をしていきたいですね。

もっとアルダグラムエンジニア組織を知りたい人、ぜひ下記の情報をチェックしてみてください

アルダグラム Tech Blog

Discussion