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

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

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

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Q&A

解決済

1回答

1980閲覧

GAS, LINE API, Chaplusを使ってLINEの雑談チャットボットを作っております

Soukyuu777

総合スコア4

LINE Messaging API

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

0グッド

0クリップ

投稿2021/04/23 15:45

編集2021/05/02 08:05

初質問失礼いたします

前提・実現したいこと

GAS, LINE API, Chaplusを使って雑談チャットボットを作っております
自分が送信したメッセージに応じてbotから適切なメッセージが送られてくるようにしたいと思っております

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

Botから返事が返ってきません
doPostでは TypeError: Cannot read property 'postData' of undefined sendMessageでは Exception: Request failed for https://api.line.me returned code 400. Truncated server response: {"message":"The request body has 2 error(s)","details":[{"message":"May not be empty","property":"messages[0].text"},{"message":"May not be empty",... (use muteHttpExceptions option to examine full response) sendUserNameでは Exception: Request failed for https://api.line.me returned code 400. Truncated server response: {"message":"The value for the 'userId' parameter is invalid"} (use muteHttpExceptions option to examine full response) appendRowでは Cannot read property 'appendRow' of null とそれぞれエラーが出ています

該当のソースコード

GAS

1var TOKEN = 'LINE Botのチャネルアクセストークン' 2 3var userId = 'ユーザーID'; 4 5function doPost(e) { 6 var event = JSON.parse(e.postData.contents).events[0]; 7 var replyToken= event.replyToken; 8 9 if (typeof replyToken === 'undefined') { 10 return; 11 } 12 13 var username = getUserName(userId); 14 15 if(event.type == 'message') { 16 var userMessage = event.message.text; 17 var replyMessage = getChaplusMessage(userMessage, username); 18 appendRow(userMessage); 19 sendMessage(replyToken, replyMessage); 20 return ContentService.createTextOutput( 21 JSON.stringify({'content': 'ok'}) 22 ).setMimeType(ContentService.MimeType.JSON); 23 } 24} 25 26function sendMessage(replyToken, replyMessage) { 27 var url = 'https://api.line.me/v2/bot/message/reply'; 28 UrlFetchApp.fetch(url, { 29 'headers': { 30 'Content-Type': 'application/json; charset=UTF-8', 31 'Authorization': 'Bearer ' + TOKEN, 32 }, 33 'method': 'post', 34 'payload': JSON.stringify({ 35 'replyToken': replyToken, 36 'messages': [{ 37 'type': 'text', 38 'text': replyMessage, 39 }], 40 }), 41 }); 42} 43 44function getUserName(userId){ 45 var url = 'https://api.line.me/v2/bot/profile/' + userId; 46 var userProfile = UrlFetchApp.fetch(url,{ 47 'headers': { 48 'Authorization' : 'Bearer ' + TOKEN, 49 }, 50 }) 51 return JSON.parse(userProfile).displayName; 52} 53 54 55function getChaplusMessage(mes, username) { 56 var dialogue_options = { 57 'utterance': mes, 58 'username' : username, 59 'agentState' : { 60 'agentName' : 'ユイカ', //LINE Botのチャネル名を入力してください 61 'age' : '22歳', //任意で数字を変更してください 62 'tone' : 'normal' //normal(標準)、kansai(関西弁)、koshu(甲州弁)、dechu(赤ちゃん言葉)の中から設定できます 63 } 64 } 65 var options = { 66 'method': 'POST', 67 'contentType': 'text/json', 68 'payload': JSON.stringify(dialogue_options) 69 }; 70 71 var chaplusUrl = "https://www.chaplus.jp/v1/chat?apikey=自分のAPIKEY"; 72 var response = UrlFetchApp.fetch(chaplusUrl, options); 73 var content = JSON.parse(response.getContentText()); 74 75 var answer = content.bestResponse.utterance; 76 return answer; 77} 78 79function appendRow(text) { 80 var spreadsheet = SpreadsheetApp.openById("スプレッドシートのID"); 81 var sheet = spreadsheet.getSheetByName("Yuika_Bot"); 82 sheet.appendRow([new Date(),text]); 83 return text; 84}

試したこと

ネットからコピペしてそれを少しいじったものですが、
TypeError: Cannot read property 'postData' of undefined の解決方法は調べましたが、ちゃんとなりませんでした
更新ではなく新規作成、匿名含むすべてのユーザーにアクセス、Webhook URLの更新、アクセストークンやユーザーIDのチェック、スプレッドシートのIDのチェック・・諸々行いましたがだめでした

補足情報(FW/ツールのバージョンなど)

GASは新しいエディタを使っています
プログラミングは基礎を覚えたばかりでその次の段階としてこれを試しております
先輩方、ご教授お願いいたします

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

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

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

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

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

guest

回答1

0

ベストアンサー

同様のコードで試しましたが特にエラーは出ませんでした。

今一度、ユーザーID、トークン、スプレッドシートID、シート名が正しく設定されているか
確認してはいかがでしょうか。

強いて言うならユーザ名のところは汎用的になるように下記のようにしてもよいかと思います。

diff

1- var username = getUserName(userId); 2+ var username = getUserName(event.source.userId);

投稿2021/05/02 02:28

編集2021/05/02 02:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Soukyuu777

2021/05/02 09:19

何度か確認して実行しましたが返事はかえってきませんでした・・ やはりコードが間違っているのかそれともLINEのほうの設定が間違っているのかわかりませんが、謎です。(設定方法もきちんと確認いたしました)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問