自動化をしていると、GASからAPI Gateway経由でLambdaを呼び出し、レスポンスデータ(json)をスプレッドシートとかに出力したいケースは間々あると思います。(Google Workspace環境なら)
しかし、レスポンスデータに日本語が含まれているとき、Unicodeになっていること、結構ありませんか?私はあります。それも頻繁にやらかす。
Unicodeにならないようにしたら、/”バリュー”みたいに不要な文字列が入っちゃったり。
そこで今回は、同様のケースで混乱しないよう、どう書けば適切に処理できるかを記録しておきます。
目次
今回の構成
- 呼び出し元のGAS: Lambdaで処理したjsonデータが欲しい
- API Gateway: 私の環境ではプロキシ統合してません
- Lambda(Python 3.12): jsonデータ(日本語を含む)を生成してGASに返す
とりあえず結論
まず結論としては、以下のように書きました。
- Lambda側ではjson.dump()しないでそのまま値を返す
- GAS側でJSON.parse()して取得する
という感じです。
少しだけ具体的に
それぞれの実装を少しだけ具体的にまとめますね。
Lambda側はjson.dump()しない
レスポンスを返す際に以下のように記述します。
return_json = {[
{"key1": "バリュー"},
{"key2": "ばりゅー"}
]} # サンプルです
return {
"statusCode": 200,
"body": return_json
}
私は惰性で json.dump(return_json) って書いてミスります。
GAS側でJSON.parseして受け取る
GAS側に帰ってくるデータはjsonだけど、bodyの中身はjsonをテキストデータにしたものが帰ってくるはずなので、parseして適切に処理します。
const resData = UrlFetchApp.fetch(url, options) // API Gatewayにリクエスト
const body = JSON.parse(resData.getContentText()).body
console.log(body.key1)
これでUnicodeになったり、\”バリュー”みたいな表記にならないはず。
まとめ
重たい問題になることはまずありませんが、シンプルに渡して受け取れるのが一番ですね。
たまに混乱してしまう仲間(がいれば)の参考になれば嬉しいです。