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

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

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

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

Google スプレッドシート

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

Google Apps Script

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

1回答

2083閲覧

LINE公式アカウントで自動応答したトーク履歴を残したい

two_back_low

総合スコア20

LINE Messaging API

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

Google スプレッドシート

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

Google Apps Script

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

1クリップ

投稿2021/11/01 02:24

編集2021/11/02 04:17

前提・実現したいこと

非エンジニアながらLINE公式アカウントをbotとして自動返信ツールを作成してます。
(LINE Messaging API+GAS+スプレッドシート)
自動応答したトーク履歴を別のシートへログとして残したいのですが、どのようにしたら良いかご教示ください。

超ド級の素人ですので、全体のコードをご教示いただけたら幸甚です。

現在の応答用のスプレッドシート

”list”というシート名のスプレッドシートに受信語句と対応する返信語句を登録していて自動返信はできています。

受信語句Type返信語句packageIdstickerIdoriginalContentUrlpreviewImageUrl
こんにちはtextこんにちは
ありがとうtextどういたしまして
さようならsticker123456
画像image画像のURL記載サムネ画像のURL
動画video動画のURL記載サムネ画像のURL
メニューflexJSON記載

ログとして残したい情報

”debug”というシート名に

GAS

1[userId, userName, text, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]

この形でログを残したいです。

userIduserNametextdate
U164165c43516b66deb相手のアカウント表示名こんにちは2021-10-08 14:35:12
U164165c43516b66deb相手のアカウント表示名さようなら2021-10-08 14:38:36
次のID次の表示名次の受信語句日時
その次のID表示名受信語句日時

該当のソースコード

GAS

1//★★LINE Messaging APIのチャネルアクセストークン★★ 2var LINE_ACCESS_TOKEN = "アクセストークン"; 3 4//★★スプレッドシートID★★ 5var ss = SpreadsheetApp.openById("スプレッドシートID"); 6 7//★★シート名★★ 8var sh = ss.getSheetByName("list"); 9 10 11//LINEからPOSTリクエストを受けたときに起動する 12//eはJSON文字列 13function doPost(e){ 14 if (typeof e === "undefined"){ 15 //動作を終了する 16 return; 17 } else { 18 //JSON文字列をパース(解析)し、変数jsonに格納する 19 var json = JSON.parse(e.postData.contents); 20 21 //変数jsonを関数replyFromSheetに渡し、replyFromSheetを実行する 22 replyFromSheet(json) 23 } 24 } 25 26//返信用の関数replyFromSheet 27//dataには変数jsonが代入される 28function replyFromSheet(data) { 29 // POST情報から必要データを抽出 30 var lineUserId = data.events[0].source.userId; 31 var postMsg = data.events[0].message.text; 32 // 記録用に検索語とuserIdを記録 33debug(postMsg, lineUserId); 34// debug(action, lineUserId); 35 //返信先URL 36 var replyUrl = "https://api.line.me/v2/bot/message/reply"; 37 38 //シートの最終行を取得する 39 var lastRow = sh.getLastRow(); 40 41 //シートのA~G列を二次元配列で取得する 42 var wordList = sh.getRange(1,1,lastRow,7).getValues(); 43 44 //受信したメッセージ情報を変数に格納する 45 var reply_token = data.events[0].replyToken; //reply token 46 var text = data.events[0].message.text; //ユーザーが送信した語句 47 48 //返信メッセージのタイプを格納するための空配列を宣言する 49 var replyType = []; 50 51 //返信メッセージを格納するための空配列を宣言する 52 var replyList = []; 53 54 //LINEで受信した語句がシートの受信語句と同じ場合、 55 //返信メッセージのタイプをreplyTypeにpushし、 56 //さらにその行のA列~G列をreplyListにpushする 57 for(var i = 1; i < wordList.length; i++) { 58 if(wordList[i][0] == text) { 59 replyType.push(wordList[i][1]); 60 replyList.push(wordList[i]); //ポイント: 一次元配列をpushする 61 } 62 } 63 64var messageArray = []; 65 //LINEで受信した語句がシートの受信語句と一致しない場合、messageを送信する 66 if (replyType.length < 1) { 67 var message = "質問の答えがありません。ほかの言葉で質問をお願いします。"; 68 messageArray.push({ 69 type: "text", 70 text: message, 71 }); 72 sendMessage(messageArray, reply_token); 73 return; 74 75 76 //replyTypeのLengthが5より大きい場合、messageLengthを5にする 77 //※※一度に最大5つの吹き出ししか返信できないため※※ 78 } else if(replyType.length > 5) { 79 var messageLength = 5; 80 } else { 81 var messageLength = replyType.length; 82 } 83 84 //"messages"に渡す配列を格納するための空配列を宣言する 85 var messageArray = []; 86 87 //replyTypeに格納されている返信メッセージのタイプと 88 //replyListに格納されている返信メッセージを最大5つ、 89 //messageArrayにpushする 90 for(var j = 0; j < messageLength; j++) { 91 switch (replyType[j]) { 92 case "text": 93 messageArray.push({"type": replyType[j], "text": replyList[j][2]}); 94 break; 95 96 case "sticker": 97 messageArray.push({"type": replyType[j], "packageId": replyList[j][3], "stickerId": replyList[j][4]}); 98 break; 99 100 case "image": 101 messageArray.push({"type": replyType[j], "originalContentUrl": replyList[j][5], "previewImageUrl": replyList[j][6]}); 102 break; 103 104 case "video": 105 messageArray.push({"type": replyType[j], "originalContentUrl": replyList[j][5], "previewImageUrl": replyList[j][6]}); 106 break; 107 108 //replyList[j][2]はJSON.parseを使ってパースする必要がある 109 case "flex": 110 messageArray.push({"type": replyType[j], "altText": "this is a flex message", "contents": JSON.parse(replyList[j][2])}); 111 break; 112 } 113 } 114 115sendMessage(messageArray, reply_token); 116} 117 118// メッセージ送信関数 119// messageArrayは配列 120function sendMessage(messageArray, reply_token) { 121 var replyUrl = "https://api.line.me/v2/bot/message/reply"; // 追加する 122 var headers = { 123 "Content-Type": "application/json; charset=UTF-8", 124 Authorization: "Bearer " + LINE_ACCESS_TOKEN, 125 }; 126 127 var postData = { 128 replyToken: reply_token, 129 messages: messageArray, 130 }; 131 132 var options = { 133 method: "post", 134 headers: headers, 135 payload: JSON.stringify(postData), 136 }; 137 138 //LINE Messaging APIにデータを送信する 139 UrlFetchApp.fetch(replyUrl, options); 140} 141 142/** ユーザーのアカウント名を取得 143 */ 144function getUserDisplayName(userId) { 145 var url = 'https://api.line.me/v2/bot/profile/' + userId; 146 var userProfile = UrlFetchApp.fetch(url,{ 147 'headers': { 148 'Authorization' : 'Bearer ' + LINE_ACCESS_TOKEN, 149 }, 150 }) 151 return JSON.parse(userProfile).displayName; 152} 153 154// debugシートに値を記載 155function debug(text, userId) { 156 var SHEET_ID = ss; 157 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug'); 158 var date = new Date(); 159 var userName = getUserDisplayName(userId); 160 sheet.appendRow([userId, userName, text, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]); 161}

試してみたこと

こちらのサイトに出てる【30分でやる】Google Spread Sheetで管理するLINE BOTの作り方を参考にコードの組み合わせをしてみましたがうまくいきません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

//★★LINE Messaging APIのチャネルアクセストークン★★ var LINE_ACCESS_TOKEN = "アクセストークン"; //★★スプレッドシートID★★ var ss = SpreadsheetApp.openById("スプレッドシートID"); //★★シート名★★ var sh = ss.getSheetByName("list"); //LINEからPOSTリクエストを受けたときに起動する //eはJSON文字列 function doPost(e){ if (typeof e === "undefined"){ //動作を終了する return; } else { //JSON文字列をパース(解析)し、変数jsonに格納する var json = JSON.parse(e.postData.contents); //変数jsonを関数replyFromSheetに渡し、replyFromSheetを実行する replyFromSheet(json) } } //返信用の関数replyFromSheet //dataには変数jsonが代入される function replyFromSheet(data) { // POST情報から必要データを抽出 var lineUserId = data.events[0].source.userId; var postMsg = data.events[0].message.text; var action = data.events[0].message.action; // 記録用に検索語とuserIdを記録 debug(postMsg, lineUserId); //返信先URL var replyUrl = "https://api.line.me/v2/bot/message/reply"; //シートの最終行を取得する var lastRow = sh.getLastRow(); //シートのA~G列を二次元配列で取得する var wordList = sh.getRange(1,1,lastRow,7).getValues(); //受信したメッセージ情報を変数に格納する var reply_token = data.events[0].replyToken; //reply token var text = data.events[0].message.text; //ユーザーが送信した語句 //返信メッセージのタイプを格納するための空配列を宣言する var replyType = []; //返信メッセージを格納するための空配列を宣言する var replyList = []; //LINEで受信した語句がシートの受信語句と同じ場合、 //返信メッセージのタイプをreplyTypeにpushし、 //さらにその行のA列~G列をreplyListにpushする for(var i = 1; i < wordList.length; i++) { if(wordList[i][0] == text) { replyType.push(wordList[i][1]); replyList.push(wordList[i]); //ポイント: 一次元配列をpushする } } var messageArray = []; //LINEで受信した語句がシートの受信語句と一致しない場合、messageを送信する if (replyType.length < 1) { var message = "質問の答えがありません。ほかの言葉で質問をお願いします。"; messageArray.push({ type: "text", text: message, }); sendMessage(messageArray, reply_token); return; //replyTypeのLengthが5より大きい場合、messageLengthを5にする //※※一度に最大5つの吹き出ししか返信できないため※※ } else if(replyType.length > 5) { var messageLength = 5; } else { var messageLength = replyType.length; } //"messages"に渡す配列を格納するための空配列を宣言する var messageArray = []; //replyTypeに格納されている返信メッセージのタイプと //replyListに格納されている返信メッセージを最大5つ、 //messageArrayにpushする for(var j = 0; j < messageLength; j++) { switch (replyType[j]) { case "text": messageArray.push({"type": replyType[j], "text": replyList[j][2]}); break; case "sticker": messageArray.push({"type": replyType[j], "packageId": replyList[j][3], "stickerId": replyList[j][4]}); break; case "image": messageArray.push({"type": replyType[j], "originalContentUrl": replyList[j][5], "previewImageUrl": replyList[j][6]}); break; case "video": messageArray.push({"type": replyType[j], "originalContentUrl": replyList[j][5], "previewImageUrl": replyList[j][6]}); break; //replyList[j][2]はJSON.parseを使ってパースする必要がある case "flex": messageArray.push({"type": replyType[j], "altText": "this is a flex message", "contents": JSON.parse(replyList[j][2])}); break; } } sendMessage(messageArray, reply_token); } // メッセージ送信関数 // messageArrayは配列 function sendMessage(messageArray, reply_token) { var replyUrl = "https://api.line.me/v2/bot/message/reply"; // 追加する var headers = { "Content-Type": "application/json; charset=UTF-8", Authorization: "Bearer " + LINE_ACCESS_TOKEN, }; var postData = { replyToken: reply_token, messages: messageArray, }; var options = { method: "post", headers: headers, payload: JSON.stringify(postData), }; //LINE Messaging APIにデータを送信する UrlFetchApp.fetch(replyUrl, options); } /** ユーザーのアカウント名を取得 */ function getUserDisplayName(userId) { var url = 'https://api.line.me/v2/bot/profile/' + userId; var userProfile = UrlFetchApp.fetch(url,{ 'headers': { 'Authorization' : 'Bearer ' + LINE_ACCESS_TOKEN, }, }) return JSON.parse(userProfile).displayName; } // debugシートに値を記載 function debug(text, userId) { var sheet = ss.getSheetByName('debug'); var date = new Date(); var userName = getUserDisplayName(userId); sheet.appendRow([userId, userName, text, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]); }

投稿2021/11/02 03:30

編集2021/11/02 04:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

two_back_low

2021/11/02 04:03

ご教示いただいたコードに下記コードも追加しましたが、debugシートにログとして記載されませんでした。 // プロフィール取得URL var PROFILE = "https://api.line.me/v2/profile";
退会済みユーザー

退会済みユーザー

2021/11/02 04:08 編集

現状のコードを質問文に全部記載してください(このコメントの続きに書くとコードのインデントがなされず見にくいため、コメントに続けず、必ず質問文を編集して記載して下さい)
退会済みユーザー

退会済みユーザー

2021/11/02 04:12 編集

重複のため削除
two_back_low

2021/11/02 04:10

質問文へ現在のコードを記載しました!
退会済みユーザー

退会済みユーザー

2021/11/02 04:17

修正し全体コードとして記載しました。
two_back_low

2021/11/02 04:25

返信語句の返信とdebugシートへの期待通りの記載が確認できました! 2度もお助けいただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問