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

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

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

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

Q&A

解決済

1回答

796閲覧

音楽URLをスプレッドシートよりLINEから受け取った特定のワードでランダムにURLをLINEに返し、かつ特定のワードを入力されたメッセージ+URLでスプレッドシートにURL部分のみを保存したい。

bot_pat

総合スコア1

LINE Messaging API

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

0グッド

0クリップ

投稿2021/09/05 13:14

編集2021/09/05 23:02

前提・実現したいこと

音楽URLをスプレッドシートよりLINEから受け取った特定のワードでランダムにURLをLINEに返し、かつ特定のワードを入力されたメッセージ+URLでスプレッドシートにURL部分のみを保存したい。

現在reply(json);を入れるか入れないかでどちらかの動きしかしてくれません。
reply(json);を入れると特定ワードに反応してbotがランダムで返してくれます。
reply(json);を入れないとスプレッドシートに書き込みは行ってくれるがワードに反応せずbotが返答してくれません。

```### 該当のソースコード // LINE Developerのアクセストークン var access_token = "botトークン" // リプライ先を特定するためのログ管理スプレッドシートID var spreadsheet_id = "ログスプレッド" // ご飯リストのスプレッドシートID var gohan_spreadsheet_id = "曲URL保存スプレッド" /** reply */ function reply(data) { var url = "https://api.line.me/v2/bot/message/reply"; var headers = { "Content-Type" : "application/json; charset=UTF-8", 'Authorization': 'Bearer ' + access_token, }; var text = ""; if (data.events[0].message.text === "今日の一曲") { // ご飯リストスプレッドシートを取得 var gohan = SpreadsheetApp.openById(gohan_spreadsheet_id).getSheetByName("曲シート"); // A1セルから入力されている最終行まで一気に取得 var gohanData = gohan.getRange(1, 1, gohan.getLastRow()); // ランダムで候補を選ぶ var intRandomNum = Math.round(Math.random()*gohan.getLastRow()); text = gohanData.getValues()[intRandomNum][0]; } else { text = "" } var postData = { "replyToken" : data.events[0].replyToken, "messages" : [ { 'type':'text', 'text':text, } ] }; var options = { "method" : "post", "headers" : headers, "payload" : JSON.stringify(postData) }; return UrlFetchApp.fetch(url, options); } /** LINEからのPOST受け取り */ function doPost(e) { // 投稿されたメッセージを取得 var json = JSON.parse(e.postData.contents); var data = SpreadsheetApp.openById(spreadsheet_id).getSheetByName('log').getRange(1, 1).setValue(json.events); reply(json); if(userMessage.match(/^$/)) { // $から始まるメッセージの場合、$を除いた文字列を再代入 userMessage = userMessage.substr(1); } else { // $から始まらない場合は何もしない(処理終了) return; } var gohan_spreadsheet_id = "曲URL保存スプレッド" var sheetName = "曲シート"; var spreadsheet = SpreadsheetApp.openById(spreadsheetId); var sheet = spreadsheet.getSheetByName(sheetName); // 空白・タブ・改行で区切り配列に変換 var arr = userMessage.split(/\s/); // セルの最下部に配列を転記  sheet.appendRow(arr); // ======================================= return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); }
GAS

試したこと

コピペで作ったので知識がなくて申し訳ないですが。
コードを消したり足したりでfunction doPost(e) {の後に入れているreply(json);がボットの返答を担っているのは分かったのですが、両方の動きをしてくれる代用コードが分からず四苦八苦しております。
お力添えいただければ幸いです。

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

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

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

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

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

y_waiwai

2021/09/05 22:37

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
bot_pat

2021/09/05 23:02

ありがとうございます。 コードを張りなおしました。
退会済みユーザー

退会済みユーザー

2021/09/06 05:59 編集

質問文だけだと詳細がちょっとわからないのですが、コードと合わせて推測したところ、下記のような理解でよろしいですか? <前提> 曲URL保存用のスプレッドシートが1つある。 そのスプレッドシートは、 「曲シート」という名前のシートを持っている。 ・「曲シート」には、A列に曲のURLが入力されている。(B列以降には何も入力されていない) <やりたいこと> ・LINEから「今日の一曲」というメッセージが入力されたら、「曲シート」に記載されているURLからランダムに1つ選択し、そのURLをLINEにリプライとして表示させたい。 ・LINEから、「$」という文字で始まるメッセージ(URLを含む)が入力されたら、入力されたメッセージのうち、URLだけを抜き出して、「曲シート」にそのURLを追記したい。 (この場合は、「曲シート」にURLを追記処理するだけで、LINEには何もリプライとして表示する必要はない) --- 上のような理解でよろしいでしょうか?誤っている点があれば、上記に沿って修正してください。
bot_pat

2021/09/06 06:16

qnoir様 その理解であっております。
guest

回答1

0

ベストアンサー

下記のように、(doPostの中で) 受け取ったメッセージが「今日の一曲」か$で始まる文字列かによって、if文を使って処理を分けるようにしてみてはいかがでしょうか。

(元の質問コードで「reply(json);を削除するかしないかだけで結果が変わる理由」はわかりません。
元の質問コードの場合、userMessage が undefinedになるため、reply(json);を削除してもしなくても、スプレッドシートにデータは記録されませんでした)

js

1// LINE Developerのアクセストークン 2var access_token = "botトークン" 3// リプライ先を特定するためのログ管理スプレッドシートID 4var spreadsheet_id = "ログスプレッド" 5// ご飯リストのスプレッドシートID 6var gohan_spreadsheet_id = "曲URL保存スプレッド" 7 8 9/** 10reply 11引数 12 text :リプライメッセージに表示するテキスト 13 replyToken:リプライトークン 14*/ 15function reply(text, replyToken) { 16 var url = "https://api.line.me/v2/bot/message/reply"; 17 var headers = { 18 "Content-Type": "application/json; charset=UTF-8", 19 'Authorization': 'Bearer ' + access_token, 20 }; 21 22 var postData = { 23 "replyToken": replyToken, 24 "messages": [{ 25 'type': 'text', 26 'text': text, 27 }] 28 }; 29 30 var options = { 31 "method": "post", 32 "headers": headers, 33 "payload": JSON.stringify(postData) 34 }; 35 36 return UrlFetchApp.fetch(url, options); 37} 38 39/** 40LINEからのPOST受け取り 41*/ 42function doPost(e) { 43 var json = JSON.parse(e.postData.contents); 44 //LINEからpostされたイベントJSONをログに記録 45 SpreadsheetApp.openById(spreadsheet_id).getSheetByName('log').getRange(1, 1).setValue(json.events); 46 // 投稿されたメッセージを取得 47 var userMessage = json.events[0].message.text; 48 // リプライトークンを取得 49 var replyToken = json.events[0].replyToken; 50 51 if (userMessage === "今日の一曲") { 52 // LINEから入力されたメッセージが「今日の一曲」だった場合 53 // 曲シートを取得 54 var gohan = SpreadsheetApp.openById(gohan_spreadsheet_id).getSheetByName("曲シート"); 55 // A1セルから入力されている最終行まで一気に取得 56 var gohanData = gohan.getRange(1, 1, gohan.getLastRow()); 57 // ランダムで行番号を1つ選ぶ 58 var intRandomNum = Math.round(Math.random() * gohan.getLastRow()); 59 60 // 選んだ行番号に対応するURLをLINEにリプライとして表示する。 61 var text = gohanData.getValues()[intRandomNum][0]; 62 reply(text, replyToken); 63 64 } else if (userMessage.match(/^$/)) { 65 // $から始まるメッセージの場合、$を除いた文字列を再代入 66 userMessage = userMessage.substr(1); 67 // 空白・タブ・改行で区切り配列に変換 68 var arrs = userMessage.split(/\s/); 69 // URLを抽出 70 var urls = []; 71 for (var arr of arrs){ 72 // http- で始まる文字列にmatchするか判定し、当てはまる場合はurlsにURLを追加 73 var url = arr.match(/.*https?://[\w!?/+\-_~=;.,*&@#$%()'[]]+/); 74 if (url != null) urls.push(url); 75 } 76 // 曲シートにURLを追記 77 if (urls.length > 0){ 78 var spreadsheet = SpreadsheetApp.openById(gohan_spreadsheet_id); 79 var sheetName = "曲シート"; 80 var sheet = spreadsheet.getSheetByName(sheetName); 81 // シートに配列を転記 82 urls.forEach(e => sheet.appendRow(e)); 83 } 84 } 85 // LINEから入力されたメッセージが「今日の一曲」ではなく、$から始まる文字列でもない場合は何もしない 86}

投稿2021/09/06 13:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bot_pat

2021/09/06 13:14

qnoir様 ありがとうございます。 プログラミングの奥の深さ、回答を導くまでの手段の多さに感動しました。 今までやってた作業がまったくの無意味だったのですね。 私の稚拙な質問にも正確に回答いただけ感謝しております。 間違いなくベストアンサーです。
退会済みユーザー

退会済みユーザー

2021/09/06 13:17

質問記載のコードも、いろいろ試行錯誤なされた跡は伺えたので、無意味ということはないと思いますよ。 たまに見かける、コードすら書かずに丸投げで質問される方よりも、よっぽどすごいと思います。 少しずつ、勉強を重ねていけばよいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問