🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

5966閲覧

GASでapiに認証キーを送る際にnot a valid key=value pair (missing equal-sign)とエラーが出ます。

amaturePy

総合スコア131

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/01/15 08:49

GASからREST API経由でデータを取得しようとしています。
認証用のログイントークンを取得後に、そのトークンをヘッダーに入れてデータを取得する形になります。
認証用のトークンは取得でき、id_tokenという変数に格納し、その変数をAPIアクセスの際のヘッダーに入れたのですが、以下のエラーが出ます。。。

not a valid key=value pair (missing equal-sign)

GASとJsの経験が浅くアドバイス頂ければ幸いです。
pythonではうまく取得できております。

GAS function myFunction() { var login_endpoint = "API URL FOR TOKEN"; var params0 = {"adminId": "xxxxxx","password": "xxxxxxxx"}; var request0 = { "method": "post", "payload": JSON.stringify(params0), }; var response0 = UrlFetchApp.fetch(login_endpoint, request0); var data = JSON.parse(response0); var id_token = data.Result.id_token; // Logger.log(id_token); var params1 = {'adminId': 'xxxxx','pgId': 'xxxxxxxxx','extraColumn': []}; var data_endpoint = "API URL FOR USER DATA"; var request1 = { "method": "get", 'contentType': 'application/json', "payload": JSON.stringify(params1), "headers": { "Authorization":'Bearer '+ id_token, }, muteHttpExceptions : true }; var response1 = UrlFetchApp.fetch(data_endpoint, request1); Logger.log(response1); }
Python param0 = {"adminId": "xxxxx","password": "xxxxxxx"} url0 = "API URL FOR TOKEN" response_post = requests.post(url0, json=param0) response_data = response_post.json() id_token = response_data["Result"]["id_token"] headers = {"Content-Type":"application/json", "Authorization":id_token} param1 = {'adminId': 'xxxx','pgId': 'xxxxxxx','extraColumn': []} url1 = "API URL FOR USER DATA" response_get = requests.get(url1, json=param1, headers=headers) response_get.encoding = 'UTF-8' with open('./test.csv','w') as f: f.write(response_get.text)

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

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

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

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

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

回答2

0

ベストアンサー

タムラケントさんはご質問中で

以下のエラーが出ます。。。

エラーとおっしゃっておられますが、こちらの記述もあわせて考えると

So my error is caused in var response1 = UrlFetchApp.fetch(data_endpoint, request1);

"〜〜〜〜 not a valid key=value pair (missing equal-sign) in Authorization header" は Logger.log(response1); で出力されたログなのではないかと思いました。

(エラーがスローされたのではなく、api 側で 200 以外のコードがリターンされた)

となると、

var request1 = {

"method": "get", 'contentType': 'application/json', "payload": JSON.stringify(params1), "headers": { "Authorization":'Bearer '+ id_token, }

ここのパラメータが API 側でうけとれない形式になっているってことで、 get だと payload は無視されると思うので header くらいしか疑うポイントがないです。

"〜〜〜〜 not a valid key=value pair (missing equal-sign) in Authorization header"

の "in Authorization header" とも合致します。

そこで確認すると gas にのみ 'Bearer 'がついていますが、これは Bearer 認証の token として渡せという指示が API にあるのでしょうか。
Python の Header では Bearer 指定がないですが、このコードそのもので動作するのでしょうか。

また、gas のコード上発生したエラーではなく API 側のエラーリターンの場合、その API の仕様がわからなければ有効な回答は得られないものとご理解いただきたいです。

投稿2021/01/15 20:43

papinianus

総合スコア12705

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

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

amaturePy

2021/01/16 02:33 編集

ご回答ありがとうございます! Bearerの文字列は渡す必要が無いのでGAS作成時に私がタイポしています。 気付きませんでした。。。 また回答を多くの意見を参照したくマルチポストしておりました。規約に触れるかもしれ無いので今後は気をつけます。失礼しました。 GASではget だと payload は無視など大変勉強になりました。 API作成者にpostでもデータを取得できるよう相談してみようと思います。
guest

0

こうでは?

Diff

1-var data = JSON.parse(response0); 2+var data = JSON.parse(response0.getContentText());

投稿2021/01/15 09:23

draq

総合スコア2577

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

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

amaturePy

2021/01/15 09:40

ありがとうございます。 試させて頂いて結果変わらずです。。。 でも勉強になりました。地味にvar data = JSON.parse(response0);についてた赤いアラートが消えました。こちらの記法を使わせて頂きます。 ありがとうございます。
amaturePy

2021/01/15 09:43

Pythonのコードでresponse_get = requests.getをpostに変えるとデータが取得できないのが関係しているのかと今調べております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問