質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

5158閲覧

GASでPost時のPayloadの中身が通らない

hosei

総合スコア0

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/06/30 15:35

編集2021/06/30 15:43

前提・実現したいこと

GASからNature RemoのAPIを経由して、エアコンを操作しようとしています。Payloadとして設定情報を載せているのですが、どうもうまく通りません。同じコマンドをCurl側から送ろうとすると通るので、何かしらGAS側の書き方が悪いのだと思っています。

発生している問題・エラーメッセージ

エアコンの電源が切られ、buttonがpower-offとなって返ってくるはずが、エアコンも動かず、Postの返り値も更新されていません。

エアコン自体からは音がするので、何かしらの信号が送られているようです。Nature Remoの仕様として、buttonの値が無い時には電源がオンにされる、というものがあるようで、Post自体は成功しているものの、Payloadが届かず、結果button = (null)の操作がされているのかと思われます。

{ temp: '23', temp_unit: 'c', mode: 'dry', vol: 'auto', dir: 'auto', dirh: '', button: '', updated_at: '2021-06-30T15:20:11Z' }

該当のソースコード

GAS

1function airconTest(){ 2 var url = "https://api.nature.global/1/appliances/[エアコンのID]/aircon_settings"; 3 var headers = { 4 "Content-Type" : "application/json", 5 "Authorization" : "Bearer " + access_token 6 }; 7 var postData = { 8 "button":"power-off" 9 }; 10 var options = { 11 "method" : "post", 12 "headers" : headers, 13 "payload" : JSON.stringify(postData) 14 //"payload" : JSON.stringify({"button":"power-off"}) 15 //"payload" : postData 16 //"payload" :{"button": "power-off"} 17 //"payload" :'{"button": "power-off"}' 18 }; 19 var reply = UrlFetchApp.fetch(url, options); 20 console.log(JSON.parse(reply)); 21} 22"Payload"の書き方はなんパターンか試してみたのですが、どれもうまく通らず、です。 23

試したこと

CURLで同等のコードを実行したところ

curl

1curl -X POST "https://api.nature.global/1/appliances/[エアコンのID]/aircon_settings" -H "Authorization: Bearer access_token" -d "button=power-off"

エアコンはちゃんと切られ、以下のようにpower-off状態となります。

{ "temp": "23", "temp_unit": "c", "mode": "dry", "vol": "auto", "dir": "auto", "dirh": "", "button": "power-off", "updated_at": "2021-06-30T15:22:49Z" }

参考情報

Nature Remo API
https://swagger.nature.global/

GASでのPOST方法
https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

友人に相談して解決しました。
Header から Content-Typeを除き、PayloadをStringifyしないにしたところ無事に通りました。

function airconTest(){ var url = "https://api.nature.global/1/appliances/[エアコンのID]/aircon_settings"; var headers = { //"Content-Type" : "application/json", "Authorization" : "Bearer " + access_token }; var postData = { "button":"power-off" }; var options = { "method" : "post", "headers" : headers, //"payload" : JSON.stringify(postData) //"payload" : JSON.stringify({"button":"power-off"}) "payload" : postData //"payload" :{"button": "power-off"} //"payload" :'{"button": "power-off"}' }; var reply = UrlFetchApp.fetch(url, options); console.log(JSON.parse(reply)); }

また、以下のサイトにPostすると、自分のPostしている内容がわかり、デバッグに役立ちましたのでご参考までに
https://webhook.site/

投稿2021/06/30 17:03

hosei

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問