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

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

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

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

Google Apps Script

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

Q&A

2回答

729閲覧

LineBotに送信してスプレッドシートに記入し、LineBotが完了通知を送る。うまくできません。。

yotataguchi

総合スコア13

LINE Messaging API

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

Google Apps Script

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

0グッド

1クリップ

投稿2019/06/06 03:58

編集2022/01/12 10:55

lineBotをスプレッドシートに日時の書き込みを行い、その後、書き込みが完了したことを返信するというシステムを作りたいです。

「take」とlineBotに送信するとスプレッドシートに日時を書き込み、「Return」と書き込むとそのセルの隣に日時を書き込みます。

下のコードだと、シートに日時は書き込めるのですが、LineBotが返信してくれないことに加え、
接続確認にも「Webhookが無効なHTTPステータスコードを返しました(期待されるステータスコードは200です)」と表示されます。

GAS

1 2var CHANNEL_ACCESS_TOKEN = 'チャンネルアクセストークン'; 3var spreadsheet = SpreadsheetApp.openById('シートのID'); 4 5var sheets = spreadsheet.getSheets(); //log用のシート 6var book_sheet = sheets[0]; //シート1 7 8function sendMsg(reply_token,message){ 9 10 var reply_token = JSON.parse(e.postData.contents).events[0].replyToken; 11 var url2 = 'https://api.line.me/v2/bot/message/reply'; 12 var response = Url2FetchApp.fetch(url2, { 13 'headers': { 14 'Content-Type': 'application/json; charset=UTF-8', 15 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 16 }, 17 'method': 'post', 18 'payload': JSON.stringify({ 19 'replyToken': reply_token, 20 'messages': [{ 21 'type': 'text', 22 'text': message, 23 }], 24 }), 25 }); 26 Logger.log(response); 27return response.getResponseCode(); 28} 29 30function doPost(e) { 31 32 var date = new Date(); 33 var event_data = JSON.parse(e.postData.contents).events[0] 34 var reply_token= event_data.replyToken; 35 const lastrow1 = box_sheet.getDataRange().getLastRow(); 36 if (typeof reply_token === 'undefined') { 37 return; 38 } 39 40 var user_message = event_data.message.text; 41 42 43 if (user_message =='take'){ 44 box_sheet.getRange(lastrow1 + 1, 1).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); //ここで止まってしまう。。 45 sendMsg(reply_token,"OK!") 46 } else if (user_message=='return'){ 47 box_sheet.getRange(lastrow1, 2).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); 48 sendMsg(reply_token,"OK!") 49 } 50 51 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 52 53}

色々調べた結果、doPost()の関数の中の変数user_messageの下に新たな変数 var user_name = getUserName(user_id); を加えると、LineBot側との接続が成功しますが、返信もない上、シートにも書き込んでくれなくなります。

具体的なコードは下記です。

GAS

1function getUserName(UID){/新しい関数 2 var url = 'https://api.line.me/v2/bot/profile/' + UID; 3 try { 4 var response = UrlFetchApp.fetch(url,{ 5 'headers': { 6 'Content-Type': 'application/json; charset=UTF-8', 7 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 8 } 9 }) 10 }catch(e){ 11 return 0; 12 } 13 var json = JSON.parse(response.getContentText()); 14 return json["displayName"] 15} 16//以下、上と同じ 17function sendMsg(reply_token,message){ 18 19 var reply_token = JSON.parse(e.postData.contents).events[0].replyToken; 20 var url2 = 'https://api.line.me/v2/bot/message/reply'; 21 var response = Url2FetchApp.fetch(url2, { 22 'headers': { 23 'Content-Type': 'application/json; charset=UTF-8', 24 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 25 }, 26 'method': 'post', 27 'payload': JSON.stringify({ 28 'replyToken': reply_token, 29 'messages': [{ 30 'type': 'text', 31 'text': message, 32 }], 33 }), 34 }); 35 Logger.log(response); 36return response.getResponseCode(); 37} 38 39function doPost(e) { 40 41 var date = new Date(); 42 var event_data = JSON.parse(e.postData.contents).events[0] 43 var reply_token= event_data.replyToken; 44 const lastrow1 = box_sheet.getDataRange().getLastRow(); 45 if (typeof reply_token === 'undefined') { 46 return; 47 } 48 49 var user_message = event_data.message.text; 50 var user_name = getUserName(user_id); 51 52 if (user_message =='take'){ 53 box_sheet.getRange(lastrow1 + 1, 1).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); 54 sendMsg(reply_token,"OK!") 55 } else if (user_message=='return'){ 56 box_sheet.getRange(lastrow1, 2).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); 57 sendMsg(reply_token,"OK!") 58 } 59 60 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 61 62}

想定する挙動は
LINEBOTに「Take」の文字列を送信すると、スプレッドシートの(最終列,1)に送信した時刻が刻まれ、「Return」の文字列をLineBotに送信すると、スプレッドシートの(最終列,2)に時刻が表示されるというものです。

どこか返信ができない原因があるのでしょうか。ご教示よろしくお願いいたします。

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

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

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

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

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

papinianus

2019/06/06 10:20

ラインのapiのリンク貼ってほしい。さがせと?
guest

回答2

0

多分今の挙動は構文エラー。構文は大丈夫なはず

javascript

1const CHANNEL_ACCESS_TOKEN = 'チャンネルアクセストークン'; 2const spreadsheet = SpreadsheetApp.openById('シートのID'); 3 4const sheets = spreadsheet.getSheets(); //log用のシート 5const book_sheet = sheets[0]; //シート1 6 7function sendMsg(reply_token,message){ 8 url2 = 'https://api.line.me/v2/bot/message/reply'; 9 const response = UrlFetchApp.fetch(url2, { 10 'headers': { 11 'Content-Type': 'application/json; charset=UTF-8', 12 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 13 }, 14 'method': 'post', 15 'payload': JSON.stringify({ 16 'replyToken': reply_token, 17 'messages': [{ 18 'type': 'text', 19 'text': message, 20 }], 21 }), 22 }); 23 Logger.log(response); 24 return response.getResponseCode(); 25} 26 27function doPost(e) { 28 const date = new Date(); 29 const event_data = JSON.parse(e.postData.contents).events[0]; 30 const reply_token= event_data.replyToken; 31 const lastrow = book_sheet.getLastRow(); 32 if (typeof reply_token === 'undefined') { 33 return "token error"; 34 } 35 const user_message = event_data.message.text; 36 const user_name = getUserName(event_data.source.userId); 37 if (user_message === 'take'){ 38 book_sheet.getRange(lastrow + 1, 1).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); //ここで止まってしまう。。 39 sendMsg(reply_token,"OK!"); 40 } else if (user_message === 'return' ){ 41 book_sheet.getRange(lastrow, 2).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); 42 sendMsg(reply_token,"OK!"); 43 } 44 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 45} 46function getUserName(UID){ 47 const url = 'https://api.line.me/v2/bot/profile/' + UID; 48 try { 49 const response = UrlFetchApp.fetch(url,{ 50 'headers': { 51 'Content-Type': 'application/json; charset=UTF-8', 52 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 53 } 54 }); 55 const json = JSON.parse(response.getContentText()); 56 return json["displayName"]; 57 }catch(e){ 58 return "error while fetching username"; 59 } 60}

投稿2019/06/19 13:20

papinianus

総合スコア12705

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

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

papinianus

2019/06/19 13:21

ほんとにやりたいことがわかったら質問たてなおしてください
guest

0

GAS も Line Bot もデバッグがめんどくさいので初学者向けの教材としては不適切です。学習用途であれば、もっと log の取りやすい教材を選択することをオススメします

「Webhookが無効なHTTPステータスコードを返しました(期待されるステータスコードは200です)」

期待するステータスコードを返していないということであれば、「Webhook」の指定が間違っているか、「Webhook」が正しく動作していません。
指定アドレスと想定した挙動を質問に追記することで、より適切な回答がつくかもしれません。

投稿2019/06/06 04:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問