GAS x API Gateway x Lambda(Python)でレスポンスが日本語の時の実装

自動化をしていると、GASからAPI Gateway経由でLambdaを呼び出し、レスポンスデータ(json)をスプレッドシートとかに出力したいケースは間々あると思います。(Google Workspace環境なら)

しかし、レスポンスデータに日本語が含まれているとき、Unicodeになっていること、結構ありませんか?私はあります。それも頻繁にやらかす。

Unicodeにならないようにしたら、/”バリュー”みたいに不要な文字列が入っちゃったり。

そこで今回は、同様のケースで混乱しないよう、どう書けば適切に処理できるかを記録しておきます。

目次

今回の構成

  • 呼び出し元のGAS: Lambdaで処理したjsonデータが欲しい
  • API Gateway: 私の環境ではプロキシ統合してません
  • Lambda(Python 3.12): jsonデータ(日本語を含む)を生成してGASに返す

とりあえず結論

まず結論としては、以下のように書きました。

  1. Lambda側ではjson.dump()しないでそのまま値を返す
  2. 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になったり、\”バリュー”みたいな表記にならないはず。

まとめ

重たい問題になることはまずありませんが、シンプルに渡して受け取れるのが一番ですね。

たまに混乱してしまう仲間(がいれば)の参考になれば嬉しいです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内Edtech企業のコーポレートエンジニア。
業務改善・自動化についての開発をしています。
エンジニア歴9年、コーポレートエンジニア歴4年。

目次