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の基本と分けて考えます。
