MENU

GASのContentServiceでJSONを返す

当ページのリンクには広告(PR)が含まれていることがあります。
GASのContentServiceでJSONを返す。読み取り用データ、JSON に変換、応答形式を指定の処理例。

GASのURLから別の道具へデータを渡すなら、画面のHTMLではなくJSONを返す方法があります。ContentServiceで文字列を作り、MIMEタイプをJSONに指定します。ブラウザで見えている文章を読み取るより、項目の名前を決めて受け渡しできます。

最初は固定の架空データだけを返し、認証や更新を伴わない読み取りの形を確認します。以下は商品コードから練習用の在庫数を返す例です。実際の在庫シートや顧客情報を公開するコードではありません。

目次

戻り値の形を先に決める

成功ならok:trueと商品コード、在庫数を返し、不正な入力や対象なしならok:falseと理由を返します。在庫0と、商品が見つからない状態は意味が違うので、0を判定に使って対象なしとしないようにします。

公式のContent Serviceガイドは、ContentService.createTextOutputとJSONのMIMEタイプを使う方法を示しています。JavaScriptのオブジェクトをそのまま返すのではなく、JSON.stringifyで文字列にしてから出力します。

入力はP01のように英大文字1文字と数字2桁に限定します。これは例のコード体系です。自分の業務へ使う場合は、実際のコード形式と、返してよい項目を確認してから変えます。

doGetからJSONを返すコード

P01とP02の在庫数は、説明用に作った12と0です。プロパティや外部ファイルから機密データを読む処理はありません。

function practiceStockResult(code) {
  if (typeof code !== 'string' || !/^[A-Z]\d{2}$/.test(code)) {
    return {ok: false, error: 'invalid_code'};
  }
  const stock = {P01: 12, P02: 0};
  if (!Object.prototype.hasOwnProperty.call(stock, code)) {
    return {ok: false, error: 'not_found'};
  }
  return {ok: true, code: code, quantity: stock[code]};
}

function jsonText(value) {
  return ContentService.createTextOutput(JSON.stringify(value))
    .setMimeType(ContentService.MimeType.JSON);
}

function doGet(e) {
  const value = e && e.parameter && e.parameter.code;
  return jsonText(practiceStockResult(typeof value === 'string' ? value : ''));
}

Webアプリのテスト用URLへ?code=P01を付けた場合、期待する本文は{"ok":true,"code":"P01","quantity":12}です。P02ならquantityは0、存在しないZ99なら{"ok":false,"error":"not_found"}、コードなしならinvalid_codeになります。

HTTP成功と業務上の成功を分ける

このコードは、対象がない場合もJSONの本文にok:falseを入れます。HTTPコードが200でも、商品を取得できたと決めず、本文のokと必要な項目を確認してください。今回のTextOutputは本文のエラー理由に合わせて任意のHTTPステータスを設定する例ではありません。

JSONとして解析できることと、利用先が期待する項目がそろうことも別です。quantityが数値か、負数を許すかなどは、受け取る道具の条件として確かめます。HTMLのエラーページが返った場合は、JSON解析より前に通信や権限の問題を調べます。

MIMEタイプの設定はTextOutputで確認できます。見た目がJSON風の文字列でも、返す形式を指定したことにはならない点に注意します。

リダイレクトと公開範囲

ContentServiceの応答は、セキュリティ上の理由で別の一時URLへリダイレクトされます。呼び出す道具がリダイレクトへ対応するかを確認し、その一時URLを恒久的な呼び出し先として保存しないようにします。元のWebアプリURLを呼び出し先にします。

JSONを返すだけでも、公開範囲の設定は必要です。公開URLを知っていれば誰でも本物の在庫を読める構成にしてよいかは、別に判断します。テスト用の固定データから始め、Webアプリの公開範囲を確認してください。

ローカルでは純粋関数と代用TextOutputで、P01・P02・未存在・形式不備、JSON化とMIME指定を確認しました。Google上のデプロイ、認証、HTTP応答は未実行です。画面そのものを作る用途はHTML Serviceの基本と分けて考えます。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次