GASを使おうとしている人へ
クライアント用にwebアプリのデモシステムを、GoogleAppScript + Googleスプレッドシートを使って実装していました。先に言っておくと、ちゃんとしたwebアプリを作るならFastAPIやNodejsのexpress、honoなど得意な言語でvscodeをしばいて作った方がいいです。
理由は主にこうです。
- REST APIの構築がめんどい
- エラーハンドリング未対応
- ログが出力されない
-
post
時のjson通信がまじでやばい
Google App Scriptの立ち上げ
今回はSpread SheetをデータベースとしてAPIを組んでみます。
テキトーに無題のスプレッドシートをつくり、拡張機能からリンクできます。
「概要」をみたときに、コンテナにリンクしたスプシが表示されていればOK
APIを書いていく
Getメソッド
doGet()
とすることで、get
メソッドにあたる処理をかけます。
function doGet() {
return ContentService.createTextOutput("get is ok")
};
return ContentService
で基本リクエストボディを返すのですが、何をミスったかtext
で返すことが前提となっており、json
を返したい場合は以下のようにする必要があります。
function doGet() {
let response = JSON.stringify({
text: "get is ok"
});
return ContentService.createTextOutput(response).setMimeType(ContentService.MimeType.JSON)
};
Postメソッド
doPost()
とすることで、post
メソッドにあたる処理をかけます。
function doPost(request) {
return ContentService.createTextOutput("post is ok")
};
json
リクエストを受け取る場合、引数のrequest
に対し、以下のようにします。これで通常通りjsonとしてプロパティを参照できます。
function doPost(request) {
let request_body = JSON.parse(request.postData.getDataAsString());
let response = JSON.stringify({
text: request_body.text
});
return ContentService.createTextOutput(response).setMimeType(ContentService.MimeType.JSON)
};
デプロイ & fetch
URLが公開されるので、post
メソッドにfetch
してみます。
fetch("https://script.google.com/macros/s/[デプロイID]/exec",
{
method: "POST",
body: JSON.stringify({text: "post is ok"})
}
).then(
(response) => response.json()
).then(
(data) => {
console.log(data);
}
);
ここで、Content-Type: "application/www-form-urlencoded"
とかいうheaderをつけないと、受け取れなかったり。CORSのエラーが発生した場合は、mode: no-cors
をつけると解決したりします。
ご自身の環境で試してみてください。