Posted at

Google Apps ScriptのdoPostでJSONなパラメータのPOSTリクエストを受ける

More than 1 year has passed since last update.

Google Apps Script(GAS)は HTTPSリクエストを受け取り処理を行うというサーバレスなAPIサーバを導入することができる。(参考: Web Apps  |  Apps Script  |  Google Developers

それを使って、JSONフォーマットで記述されたリクエストパラメータでPOSTリクエストを送り、何かしらやろうとしたところ少しハマった。


JSONパラメータを受けparseする

例えばこんなリクエストを送った場合を想定。リクエストパラメータをJSONフォーマットで記述されている。

curl -X POST -H "Content-Type: application/json" -d '{"value": "AAA"}' <GASウェブアプリケーションのURL>

このような時は以下のように書くことでリクエストパラメータをオブジェクトで受けることができる。

function doPost(e) {

var params = JSON.parse(e.postData.getDataAsString()); // ※
var value = params.value; // => "AAA"が取れる

// 何らかの処理...

var output = ContentService.createTextOutput();
output.setMimeType(ContentService.MimeType.JSON);
output.setContent(JSON.stringify({ message: "success!" }));

return output;
}

少し解説すると、コード内 を付けているところが今回のキモ。

Content-Type: application/json を付けているものの、GAS的にはそれを見ていない(?)ようで e.postDataFileUploadクラスになっており、これはblobクラスを継承したクラス。

なので、.getDataAsString()メソッドでJSON文字列を得ることができ、それをJSON.parseすることでJavaScriptのオブジェクトに変換している、ということを行っている。


ちなみに

以下のように e.parameter を使うと何も取れないので注意。最初これで取れなくてハマっていた。

function doPost(e) {

var value = e.parameter.value;

console.log(e.parameter); // => 空オブジェクト( {} )
console.log(value); // => undefined
...
}

しかし自分の方で何か間違えている気がしてならないので、もしなにかご存知の方がいらっしゃればご教授いただきたいです。