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

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

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

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

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

Q&A

解決済

1回答

2286閲覧

ボットサーバーから200以外のHTTPステータスコードが返されましたと出る。

JetSzero

総合スコア8

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

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

0グッド

0クリップ

投稿2020/09/06 12:52

編集2020/09/09 12:42

先日、同じ質問をしました。そして回答道理試したのですが、うまくいきません。
人任せで申し訳ないのですが、再度ほかに間違っているところがないのか、確認していただけると幸いです。

var global; var ACCESS_TOKEN = '00000000000000000000000000000000'; var id = '000000000000000000000000000000000000000'; var dataSheet = SpreadsheetApp.openById(id).getSheetByName('7月'); var url = 'https://api.line.me/v2/bot/message/reply'; function doPost(e) { // WebHookで受信した応答用Token var replyToken = JSON.parse(e.postData.contents).events[0].replyToken; // ユーザーのメッセージを取得 var userMessage = JSON.parse(e.postData.contents).events[0].message.text; var data = JSON.parse(e.postData.contents).events[0]; var result; // 家計簿閲覧モード if (userMessage.match(/家計簿/)) { // シートの内容を取得するメソッド result = showSpreadSheet(); } else {  // 家計簿記録モード result = insertToSpreadSheet(data); } //取得内容をreplyに渡す reply(data, result); } //返信用のメソッド function reply(data, msg) { UrlFetchApp.fetch(url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': data.replyToken, 'messages': [{ 'type': 'text', 'text': msg, }], }), }); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); } function showSpreadSheet() { var FValues = dataSheet.getRange('B:B').getValues(); var LastRow = FValues.filter(String).length; var spread = ""; var range; var pay = dataSheet.getRange(2,7).getValue(); var balance = dataSheet.getRange(3,7).getValue(); if (LastRow == 1) { spread = spread + "残高: " + balance + "円\n"; return spread; } for(var i = 1; i <= LastRow; i++) { for(var j = 1; j <= 3; j++) { var range = dataSheet.getRange(i, j); var rangeVal = range.getValue(); if (i > 1 && j == 1) { rangeVal = Utilities.formatDate(rangeVal, 'Asia/Tokyo', 'MM/dd'); } if (i > 1 && j == 3) { rangeVal = rangeVal + "円"; } spread = spread + rangeVal + ","; if(j == 3) { spread = spread + "\n"; } } } spread = spread +"----------------------\n"; spread = spread +"支出合計: " + pay + "円\n"; spread = spread + "残高: " + balance + "円\n"; spread = spread +"----------------------\n"; return spread; } function insertToSpreadSheet(data) { var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd'); var FValues = dataSheet.getRange('B:B').getValues(); var LastRow = FValues.filter(String).length; // 入力文字は品名全角or半角スペース金額 var inputArray = data.message.text.split(/\s+/); var product = inputArray[0]; var price = inputArray[1]; dataSheet.getRange(LastRow + 1, 1).setBorder(true, true, true, true, false, false).setValue(date); dataSheet.getRange(LastRow + 1, 2).setBorder(true, true, true, true, false, false).setValue(product); dataSheet.getRange(LastRow + 1, 3).setBorder(true, true, true, true, false, false).setValue(price); var str = [date, product, price].join(" "); return str + "円\n記録しました"; };

前回は【webhookの検証時には特別にreplyTokenが00000000000000000000000000000000のイベントが飛んでくるので。

doPost関数にそれをキャッチする処理を書けばエラーにならないはず】と言われ、

if (replyToken === '00000000000000000000000000000000') { return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); }

を書いたのですが、エラーがでました。
どうしたらいいのかわかりまん。

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

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

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

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

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

Supernove

2020/09/08 18:06 編集

if (replyToken === '00000000000000000000000000000000') { return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); } をどこで書いたかわからないので、ソースコード内に追記してください。そうしないとエラーが特定できません。 あと、悪用されかねないので`id`や`ACCESS_TOKEN`は適当な文字列で伏せてください。ここは知らなくても困らない情報です。
JetSzero

2020/09/09 12:45

`id`や`ACCESS_TOKEN`のご指摘ありがとうございます。 削除するのを忘れていました。 function doPost(e) { // WebHookで受信した応答用Token var replyToken = JSON.parse(e.postData.contents).events[0].replyToken; // ユーザーのメッセージを取得 var userMessage = JSON.parse(e.postData.contents).events[0].message.text; var data = JSON.parse(e.postData.contents).events[0]; var result; // 家計簿閲覧モード if (userMessage.match(/家計簿/)) { // シートの内容を取得するメソッド result = showSpreadSheet(); } else {  // 家計簿記録モード result = insertToSpreadSheet(data); } //取得内容をreplyに渡す reply(data, result); if (replyToken === '00000000000000000000000000000000') { return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); } } という感じで書きました。
guest

回答1

0

ベストアンサー

追記していただきありがとうございます。エラーの出る原因ですが、Webhookの検証を行うときの条件分岐を入れる位置が間違っています。

その位置だと条件分岐を通ることなく、reply関数が実行されてしまうので、条件分岐が全く意味がありません。

なので、replyTokenを定義した直後に条件分岐を持ってきて、以下のようにdoPost関数を直せばいいと思います。

function doPost(e) { // WebHookで受信した応答用Token var replyToken = JSON.parse(e.postData.contents).events[0].replyToken; // Webhookの検証 if (replyToken === '00000000000000000000000000000000') { return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); } // ユーザーのメッセージを取得 var userMessage = JSON.parse(e.postData.contents).events[0].message.text; var data = JSON.parse(e.postData.contents).events[0]; var result; // 家計簿閲覧モード if (userMessage.match(/家計簿/)) { // シートの内容を取得するメソッド result = showSpreadSheet(); } else {  // 家計簿記録モード result = insertToSpreadSheet(data); } //取得内容をreplyに渡す reply(data, result); }

投稿2020/09/09 12:55

編集2020/09/09 12:56
Supernove

総合スコア1154

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

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

JetSzero

2020/09/09 13:11

ご指摘ありがとうございます。 ご指摘通り直しました。 しかし、『不適切なパラメーターまたは値が指定されています。入力内容を確認して、もう一度お試しください。』というエラーがでました。原因分かりますか?
Supernove

2020/09/09 13:33

多分任意に決めたJsonを返すとエラーになるのかもしれません。以下のように書き直すといかがでしょうか? return ContentService.createTextOutput(JSON.stringify({'status': 200})).setMimeType(ContentService.MimeType.JSON);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問