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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1168閲覧

LINE botでオウム返しができない

jyojyotk

総合スコア22

LINE Messaging API

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/04/04 15:58

bot初心者です。LINE botを作ってみようと思って、
https://qiita.com/tetrapod117/items/e7b48485c98f6b88f311
上記の記事を読みながらやりましたが、うまく動きません。
なぜ動かないのかとエラー原因をgasで見つける方法を教えてください。

  • 挙動

lineでbotと友達になって、botと自分が入っているグループにメッセージを送っても既読がつくのみで何も返信が来ません。

  • gasに書いたコード
//LINE Developersで取得したアクセストークンを入れる var CHANNEL_ACCESS_TOKEN = 'CHANNEL_ACCESS_TOKEN'; var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; //ポストで送られてくるので、送られてきたJSONをパース function doPost(e) { var json = JSON.parse(e.postData.contents); //返信するためのトークン取得 var reply_token= json.events[0].replyToken; if (typeof reply_token === 'undefined') { return; } //送られたメッセージ内容を取得 var message = json.events[0].message.text; // メッセージを返信 UrlFetchApp.fetch(line_endpoint, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': [{ 'type': 'text', 'text': message, }], }), }); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); };

-詳細
GAS側でアプリケーションにアクセスするユーザは「全員(匿名ユーザを含む)」になっています。
LINE Developers側でWebhookの接続確認を行うと「✔︎成功しました」となります。
そして下記の質問の回答に書いてある解決方法もやって見ましたが反応しませんでした
https://teratail.com/questions/160664

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

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

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

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

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

jyojyotk

2022/04/05 02:39

TypeError: Cannot read property 'postData' of undefined 上のようなエラーが出て、YAmaGNZさんの書いてくださった質問の回答のような結果が出ませんでした。
YAmaGNZ

2022/04/05 02:47

私が提示した内容にpostDataを指定するような箇所はありませんし、質問に提示されているソースのUrlFetchApp.fetchの部分にもpostDataを指定している箇所はありません。 どのように書いてそのエラーが出たのでしょうか?
jyojyotk

2022/04/05 02:51

//LINE Developersで取得したアクセストークンを入れる var CHANNEL_ACCESS_TOKEN = 'CHANNEL_ACCESS_TOKEN'; var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; //ポストで送られてくるので、送られてきたJSONをパース function doPost(e) { var json = JSON.parse(e.postData.contents); //返信するためのトークン取得 var reply_token= json.events[0].replyToken; if (typeof reply_token === 'undefined') { return; } //送られたメッセージ内容を取得 var message = json.events[0].message.text; // メッセージを返信 let res=UrlFetchApp.fetch(line_endpoint, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': [{ 'type': 'text', 'text': message, }], }), }); Logger.log(res.getResponseCode() + ' ' + res); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); }; 上記のように書きました
YAmaGNZ

2022/04/05 04:24 編集

もしかして、デバッグ実行などで直接doPostを実行されたのでしょうか? もしそうなのであれば正しい実行方法ではありません。 Logger.logでUrlFetchApp.fetchを確認する方法を提示すべきではありませんでした。 申し訳ありません。 ログに出力して確認するのではなく、スプレッドシートなどに出力して確認してみてください。
YAmaGNZ

2022/04/05 04:38

質問にあるソースをコピペして動作させて見ましたが正常に動作しました。 変更した箇所はCHANNEL_ACCESS_TOKENの部分のみなのでCHANNEL_ACCESS_TOKENが間違っている (コードに記載した以降に再発行してしまいトークンが変わっている等)可能性があるかと思います。 それもUrlFetchApp.fetchの戻り値を確認できれば判明するかと思います。
jyojyotk

2022/04/05 15:58

CHANNEL_ACCESS_TOKENを入れて見ても無理でした。 gasで作ったapiって反応したり、しなかったりすることってありますか? UrlFetchApp.fetchの戻り値がスプシで出力されませんでした。 これって、UrlFetchApp.fetchの戻り値を得られなかったということですか?
YAmaGNZ

2022/04/05 22:10

既読がつくということはWebhookURLは呼ばれているかと思います。 スプレッドシートに出力されないのはどのようなコードで出力されたのか不明ですので何とも言えません。
jyojyotk

2022/04/06 01:04

すいません、コードは下のように書きました。 //LINE Developersで取得したアクセストークンを入れる var CHANNEL_ACCESS_TOKEN = 'CHANNEL_ACCESS_TOKEN'; var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; //ポストで送られてくるので、送られてきたJSONをパース function doPost(e) { if (typeof e === "undefined"){ //eがundefinedの場合動作を終了する return; } //JSON文字列をパース(解析)し、変数jsonに格納する var json = JSON.parse(e.postData.contents); log(json) //受信したメッセージ情報を変数に格納する var reply_token = json.events[0].replyToken; //reply token log(reply_token); //送られたメッセージ内容を取得 var message = json.events[0].message.text; log(message); // メッセージを返信 var result=UrlFetchApp.fetch(line_endpoint, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, },   'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': [{ 'type': 'text', 'text': message, }], }) }); log(result); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); }; function log(message2){ var spreadsheet = SpreadsheetApp.openById('1WJtGzpHwOzWv3DvFmImQwjOH4-4g5MJthpHzU6_k2Fg'); var ss = spreadsheet.getSheetByName('シート1'); ss.appendRow([message2]);};
YAmaGNZ

2022/04/06 02:51

一応の確認ですが、出力されないのはUrlFetchApp.fetchの結果のみで、他のlog(message);等は出力されるのですよね? 提示されたソースを実行してみましたがCHANNEL_ACCESS_TOKENをわざと間違えた場合にUrlFetchApp.fetchにてExceptionが発生しスプレッドシートにログが出力されていませんでした。 try { // メッセージを返信 var result=UrlFetchApp.fetch(line_endpoint, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, },   'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': [{ 'type': 'text', 'text': message, }], }) }); log(result); } catch (e) { log(e); } という感じでtry~catchにてExceptionをキャッチしログを出力するとどうでしょうか? ログの出力が全くされないというのであれば、スプレッドシートのIDをミスっているとかデプロイのミスとかが考えられるかと思います。
jyojyotk

2022/04/06 10:09

教えていただいたtry~catchによってスプシにexceptionがログに書かれるようになり、 解決することができました。 エラーが起こった原因は、CHANNEL_ACCESS_TOKENをコピーするページがgoogle翻訳により日本語になるようになっていて、google翻訳がCHANNEL_ACCESS_TOKENの+や-を全角にしていたためでした。 2日間デバッグ方法やコードを見ていただきありがとうございました。
guest

回答1

0

自己解決

lineのCHANNEL_ACCESS_TOKENの文字列がところどころが全角になっていて、それがgoogle翻訳によって起きていたのでgoogle翻訳を消したあとのCHANNEL_ACCESS_TOKENを書くといけました!

投稿2022/04/07 03:06

jyojyotk

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問