🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
LINE Messaging API

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

Google スプレッドシート

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1919閲覧

LINE botのスプレッドシートにテキストが記載されない

nezumimuzen

総合スコア19

LINE Messaging API

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

Google スプレッドシート

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/01/06 05:22

編集2021/01/07 03:30

https://qiita.com/WdknWdkn/items/b78ae572e7cb5c9dfdca
上記のサイトを参考にGASでスプレッドシートからLINEの返信を返すbotを作っているのですが、最後debugシートへ値を記載する際、送ったテキストを転記したいと思っております。
素人ながらコードを読み、「postMsg」の部分を取り出すものと思い以下(test)のようにコードを変えましたが、LINEbotが返信しなくなり原因がわかりません。

希望の動作としては
LINEで
「りんご」と打つと
botが
「りんごは美味しい」
と返し、debugシートに
|UserID|UserName|テキスト|送信日時
|:--|:--:|--:|
|xxx|xxx|りんご|xxx

と記載されるようにしたいです。
ご教授いただけますようお願いいたします。

GoogleAppsScript

1// 利用しているシート 2var SHEET_ID = '(①スプレッドシートのIDをコピペ)'; 3// 利用しているSSのシート名(※変えるとみえなくなる) 4var SHEET_NAME = 'faq'; 5// 利用しているもしかしてSSのシート名(※変えるとみえなくなる) 6var SHEET_NAME_MAYBE = 'maybe'; 7 8// LINE Message API アクセストークン 9var ACCESS_TOKEN = '(②LINEのdevelopersアカウント上で取得したTOKENをコピペ)'; 10// 通知URL 11var PUSH = "https://api.line.me/v2/bot/message/push"; 12// リプライ時URL 13var REPLY = "https://api.line.me/v2/bot/message/reply"; 14// プロフィール取得URL 15var PROFILE = "https://api.line.me/v2/profile"; 16 17/** 18 * doPOST 19 * POSTリクエストのハンドリング 20 */ 21function doPost(e) { 22 var json = JSON.parse(e.postData.contents); 23 reply(json); 24} 25 26/** 27 * doGet 28 * GETリクエストのハンドリング 29 */ 30function doGet(e) { 31 return ContentService.createTextOutput("SUCCESS"); 32} 33 34/** 35 * reply 36 * ユーザからのアクションに返信する 37 */ 38function reply(data) { 39 // POST情報から必要データを抽出 40 var lineUserId = data.events[0].source.userId; 41 var postMsg = data.events[0].message.text; 42 var replyToken = data.events[0].replyToken; 43 var action = data.events[0].message.action; 44 // 記録用に検索語とuserIdを記録 45// debug(postMsg, lineUserId); 46 debug(action, lineUserId); 47 48 // 検索語に対しての回答をSSから取得 49 var answers = findResponseArray(postMsg); 50 51 // 回答メッセージを作成 52 var replyText = '「' + postMsg + '」ですね。かしこまりました。以下、回答です。'; 53 // 回答の有無に応じて分岐 54 if (answers.length === 0) { 55 // 「類似の検索キーワード」がないかチェック 56 var mayBeWord = findMaybe(postMsg); 57 if (typeof mayBeWord === "undefined") { 58 // 回答がない場合の定型文 59 sendMessage(replyToken, '答えが見つかりませんでした。別のキーワードで質問してみてください。'); 60 } else { 61 sendMayBe(replyToken, mayBeWord); 62 } 63 } else { 64 // 回答がある場合のメッセージ生成 65 answers.forEach(function(answer) { 66 replyText = replyText + "\n\n=============\n\nQ:" + answer.key + "\n\nA:" + answer.value; 67 }); 68 69 // 1000文字を超える場合は途中で切る 70 if (replyText.length > 1000) { 71 replyText = replyText.slice(0,1000) + "……\n\n=============\n\n回答文字数オーバーです。詳細に検索キーワードを絞ってください。"; 72 } 73 // メッセージAPI送信 74 sendMessage(replyToken, replyText); 75 } 76} 77 78// SSからデータを取得 79function getData() { 80 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME); 81 var data = sheet.getDataRange().getValues(); 82 83 return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; }); 84} 85 86// SSから「もしかして」データを取得 87function getMayBeData() { 88 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME_MAYBE); 89 var data = sheet.getDataRange().getValues(); 90 return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; }); 91} 92 93// 単語が一致したセルの回答を配列で返す 94function findResponseArray(word) { 95 // スペース検索用のスペースを半角に統一 96 word = word.replace(' ',' '); 97 // 単語ごとに配列に分割 98 var wordArray = word.split(' '); 99 return getData().reduce(function(memo, row) { 100 // 値が入っているか 101 if (row.value) { 102 // AND検索ですべての単語を含んでいるか 103 var matchCnt = 0; 104 wordArray.forEach(function(wordUnit) { 105 // 単語を含んでいればtrue 106 if (row.key.indexOf(wordUnit) > -1) { 107 matchCnt = matchCnt + 1; 108 } 109 }); 110 if (wordArray.length === matchCnt) { 111 memo.push(row); 112 } 113 } 114 return memo; 115 }, []) || []; 116} 117 118// 単語が一致したセルの回答を「もしかして」を返す 119function findMaybe(word) { 120 return getMayBeData().reduce(function(memo, row) { return memo || (row.key === word && row.value); }, false) || undefined; 121} 122 123// 画像形式でAPI送信 124function sendMessageImage(replyToken, imageUrl) { 125 // replyするメッセージの定義 126 var postData = { 127 "replyToken" : replyToken, 128 "messages" : [ 129 { 130 "type": "image", 131 "originalContentUrl": imageUrl 132 } 133 ] 134 }; 135 return postMessage(postData); 136} 137 138// LINE messaging apiにJSON形式でデータをPOST 139function sendMessage(replyToken, replyText) { 140 // replyするメッセージの定義 141 var postData = { 142 "replyToken" : replyToken, 143 "messages" : [ 144 { 145 "type" : "text", 146 "text" : replyText 147 } 148 ] 149 }; 150 return postMessage(postData); 151} 152 153// LINE messaging apiにJSON形式で確認をPOST 154function sendMayBe(replyToken, mayBeWord) { 155 // replyするメッセージの定義 156 var postData = { 157 "replyToken" : replyToken, 158 "messages" : [ 159 { 160 "type" : "template", 161 "altText" : "もしかして検索キーワードは「" + mayBeWord + "」ですか?", 162 "template": { 163 "type": "confirm", 164 "actions": [ 165 { 166 "type":"postback", 167 "label":"はい", 168 "data":"action=detail", 169 }, 170 { 171 "type": "message", 172 "label": "いいえ", 173 "text": "いいえ、違います。" 174 } 175 ], 176 "text": "答えが見つかりませんでした。もしかして検索キーワードは「" + mayBeWord + "」ですか?" 177 } 178 179 } 180 ] 181 }; 182 return postMessage(postData); 183} 184 185// LINE messaging apiにJSON形式でデータをPOST 186function postMessage(postData) { 187 // リクエストヘッダ 188 var headers = { 189 "Content-Type" : "application/json; charset=UTF-8", 190 "Authorization" : "Bearer " + ACCESS_TOKEN 191 }; 192 // POSTオプション作成 193 var options = { 194 "method" : "POST", 195 "headers" : headers, 196 "payload" : JSON.stringify(postData) 197 }; 198 return UrlFetchApp.fetch(REPLY, options); 199} 200 201/** ユーザーのアカウント名を取得 202 */ 203function getUserDisplayName(userId) { 204 var url = 'https://api.line.me/v2/bot/profile/' + userId; 205 var userProfile = UrlFetchApp.fetch(url,{ 206 'headers': { 207 'Authorization' : 'Bearer ' + ACCESS_TOKEN, 208 }, 209 }) 210 return JSON.parse(userProfile).displayName; 211} 212 213// userIdシートに記載 214function lineUserId(userId) { 215 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('userId'); 216 sheet.appendRow([userId]); 217} 218 219// debugシートに値を記載 220function debug(text, userId) { 221 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug'); 222 var date = new Date(); 223 var userName = getUserDisplayName(userId); 224 sheet.appendRow([userId, userName, text, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]); 225} 226

test

1// debugシートに値を記載 2function debug(text, userId) { 3 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug'); 4 var date = new Date(); 5 var userName = getUserDisplayName(userId); 6 sheet.appendRow([userId, userName, postMsg, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]); 7} 8//textの部分をpostMsgに変えました

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

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

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

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

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

guest

回答1

0

ベストアンサー

タイトルには、スプレッドシートに記載されないと書いてありますけど、
質問内容が、lineBotが返信を返さないとなっています。
どちらの質問が正しいのでしょうか?><

ソースコードを読んだところ
参考ページにある

googleAppScript

1 return UrlFetchApp.fetch(PUSH, options);

この部分が書かれていないので、これを参考ページを見ながら実装してあげてください。
Botが返信するようになるはずです。

最初は複雑なプログラムを組まず、まず単純に返信する動作を実装してテストしてみるといいかもしれません。

投稿2021/01/06 08:36

moromon

総合スコア86

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

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

nezumimuzen

2021/01/07 01:04

moromon様 回答ありがとうございます。 質問が紛らわしく申し訳ございません。 質問を確認したところ、参考URLのリンクを間違えて貼っていました。 こちら、または質問部分のリンクを修正しましたためよろしければ再度ご覧いただければ幸いです。 「https://qiita.com/WdknWdkn/items/b78ae572e7cb5c9dfdca」 現在、上記の参考ページのコードの通り書くとLINEbotは返信はするのですが、debugシートに記載される内容が、UserID,UserName,一つ飛んで送信日時となっており、ユーザーが何を送信したのかが記載がされないため、自分なりにコードを読み、書き換えたところLINEbotも反応しなくなってしまったと言う経緯となります。
moromon

2021/01/07 02:20

リンク先が間違っていること、承知しました。しかし、Botが返事を返さない理由は、リンク先が違えど原因は一緒です。UrlFetchApp.fetch←これが実装されていないことにより、Botが返事を返せていません。(新しいリンク先でも同じ記述があります!)それとも、実装しているけど、質問文に貼っていないソースコードがあるのでしょうか? そして、すみません、ちょっと経緯がわかりづらいので 現時点のソースコードをそのままはっていただいてもいいですか? 質問文のfunction debug()が二つあって、どっちが現時点のソースコードかわかりづらいので><
nezumimuzen

2021/01/07 03:34

moromon様 ご返信ありがとうございます。 URLのコードと同じものを貼るのはよろしくないと判断し省略してしまいました。 基本的にはリンクにあるプログラムをそのまま使用したいと思っているのですが、スプレッドシートに記録として相手が何を送ったのかを転記したかったのですが、現在のコードでは記録がされないため質問をさせていただきました。 質問文のtestのコードは自分なりに修正した後のものになります。 相違点としてはLINEbotが var replyText = '「' + postMsg + '」ですね。かしこまりました。以下、回答です。'; でスプレッドシートに転記したい内容「postMsg」を回答できていたため、sheet.appendRowでtextをpostMsgに変えたのですが、変えた際にLINEbotそのものが動作しなくなってしまいました。
moromon

2021/01/07 04:01 編集

なるほど!理解しました。 sheet.appendRow([userId, userName, postMsg, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]); ここのpostMsgをtextに戻して、 // 記録用に検索語とuserIdを記録 // debug(postMsg, lineUserId); debug(action, lineUserId); ここの部分を // 記録用に検索語とuserIdを記録 debug(postMsg, lineUserId); // debug(action, lineUserId); こうかえてみてください。どうなりますか?
nezumimuzen

2021/01/07 04:24

moromon様 ご回答ありがとうございます! ご指摘通り直しましたら希望の動作をするようになりました!
moromon

2021/01/07 04:33

よかったです^^技術的な話もありますがとりあえず動いてよかったです! 引き続きがんばってくださいm(_ _"m) そしてフォローありがとうございます。フォロバさせていただきますねm(_ _"m)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問