前書き
初学者です。似たような質問を複数回投稿しており、気を悪くされた方がいらっしゃいましたら心よりお詫び申し上げます。
本題
さて、本題なのですが、lineで使用するためのbotを現在作成しております。
botの内容としては、if文にて特定の文字を入力すると特定の文字列が返され、そこに数値を入力すると計算結果が返ってくるというものになります。
実際に完成し、問題なく動作はしているのですが、最初の特定の文字を入力するという部分が、特定の文字を覚えないといけないということが煩わしく、その他という文字を入力するとカルーセルテンプレートを表示させ、入力できないかと考えました。
しかし、カルーセルテンプレートを呼び出すコードと元のコードを上手く合わせることが出来ず、文字を認識してくれなくなったり、関数が長くなりすぎることで動作しなくなってしまったりという現象が起こってしまいました。
うまく動作させるためにはどのようにして組み合わせればいいのか、ご教授のほどよろしくお願いいたします。
現在のbotのソースコード
Javascript
1var ACCESS_TOKEN = "XXXXXXXXXXX"; 2var URL = "https://api.line.me/v2/bot/message/reply"; 3var SS_ID = "XXXXXXXXXXX"; //スプレッドシートのID 4var PUSH = "https://api.line.me/v2/bot/message/push"; 5var REPLY = "https://api.line.me/v2/bot/message/reply"; 6var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; 7var ID = 'XXXXXXXXXXX'; 8var HistorySheet = SpreadsheetApp.openById(SS_ID).getSheets()[0]; 9 10function doPost(e) { 11 var contents = e.postData.contents; 12 var obj = JSON.parse(contents); 13 var events = obj["events"]; 14 for (var i = 0; i < events.length; i++) { 15 if (events[i].type == "message" && events[i].message.type == "text") { 16 reply_message(events[i]); 17 } 18 } 19} 20 21function reply_message(e) { 22 var input_text = e.message.text; 23 var reply_text = ""; 24 const userId = e.source.userId; 25 const history = getLastUserHistory(userId); 26 27 if (history && history.continuous) { 28 if (history.text == "70%*2") { 29 reply_text = input_text + " の 軽減率70%×70%での実質HPは\n約 " + Math.floor(input_text / 0.09) + "です"; 30 } else if (history.text == "50%*2") { 31 reply_text = input_text + " の 軽減率50%×50%での実質HPは\n約 " + Math.floor(input_text / 0.25) + "です"; 32 } else if (history.text == "70%*50%") { 33 reply_text = input_text + " の 軽減率70%×50%での実質HPは\n約 " + Math.floor(input_text / 0.15) + "です"; 34 } else if (history.text == "25%*2") { 35 reply_text = input_text + " の 軽減率25%×25%での実質HPは\n約 " + Math.floor(input_text / 0.5625) + "です"; 36 } else if (history.text == "75%*2") { 37 reply_text = input_text + " の 軽減率75%×75%での実質HPは\n約 " + Math.floor(input_text / 0.0625) + "です"; 38 } else if (history.text == "50%*2+30%*2") { 39 reply_text = input_text + " の 軽減率50%×50%×30%×30%での実質HPは\n約 " + Math.floor(input_text / 0.1225) + "です"; 40 } else if (history.text == "50%*2+25%") { 41 reply_text = input_text + " の 軽減率50%×50%×25%での実質HPは\n約 " + Math.floor(input_text / 0.1875) + "です"; 42 } else if (history.text == "25%+50%*2") { 43 reply_text = input_text + " の 軽減率25%×50%×50%での実質HPは\n約 " + Math.floor(input_text / 0.1875) + "です"; 44 } else if (history.text == "35%*2") { 45 reply_text = input_text + " の 軽減率35%×35%の実質HPは\n約 " + Math.floor(input_text / 0.4225) + "です"; 46 } else if (history.text == "35%*25%") { 47 reply_text = input_text + " の 軽減率35%×25%の実質HPは\n約 " + Math.floor(input_text / 0.4875) + "です"; 48 } else if (history.text == "25%*35%") { 49 reply_text = input_text + " の 軽減率25%×35%の実質HPは\n約 " + Math.floor(input_text / 0.4875) + "です"; 50 } 51 setLastUserHistory(userId, input_text, false); 52 } 53 else { 54 if (input_text == "70%*2") { 55 reply_text = "軽減率70%×70%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 56 } else if (input_text == "50%*2") { 57 reply_text = "軽減率50%×50%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 58 } else if (input_text == "70%*50%") { 59 reply_text = "軽減率70%×50%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 60 } else if (input_text == "25%*2") { 61 reply_text = "軽減率25%×25%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 62 }else if (input_text == "75%*2") { 63 reply_text = "軽減率75%×75%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 64 }else if (input_text == "50%*2+30%*2") { 65 reply_text = "軽減率50%×50%×30%×30%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 66 } else if (input_text == "35%*2") { 67 reply_text = "軽減率35%×35%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 68 }else if (input_text == "50%*2+25%") { 69 reply_text = "軽減率50%×50%×25%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 70 }else if (input_text == "25%+50%*2") { 71 reply_text = "軽減率50%×50%×25%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 72 }else if (input_text == "25%*35%") { 73 reply_text = "軽減率25%×35%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 74 }else if (input_text == "35%*25%") { 75 reply_text = "軽減率35%×25%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 76 } 77 if (reply_text) { 78 setLastUserHistory(userId, input_text, true); 79 } 80 else { 81 setLastUserHistory(userId, input_text, false); 82 } 83 } 84 85 var postData = { 86 "replyToken": e.replyToken, 87 "messages": [{ 88 "type": "text", 89 "text": reply_text 90 }] 91 }; 92 93 var options = { 94 "method": "post", 95 "headers": { 96 "Content-Type": "application/json", 97 "Authorization": "Bearer " + ACCESS_TOKEN 98 }, 99 "payload": JSON.stringify(postData) 100 }; 101 const response = UrlFetchApp.fetch(URL, options); 102 if (response.getResponseCode() !== 200) { 103 throw new Error(response.getContentText()); 104 } 105} 106 107function getLastUserHistory(userId) { 108 const userHistory = HistorySheet.getDataRange().getValues(); 109 for (let i = userHistory.length - 1; 0 < i; i--) { 110 if (userHistory[i][1] === userId) { 111 return { 112 date: userHistory[i][0], 113 userId: userHistory[i][1], 114 text: userHistory[i][2], 115 continuous: userHistory[i][3] 116 }; 117 } 118 } 119 return undefined; 120} 121 122function setLastUserHistory(userId, text, continuous) { 123 const values = [new Date(), userId, text, continuous]; 124 HistorySheet.appendRow(values); 125}
カルーセルテンプレートのソースコード
Javascript
1var ACCESS_TOKEN = "XXXXXXXXXXXXX"; 2 3function doPost(e) { 4 var contents = e.postData.contents; 5 var obj = JSON.parse(contents); 6 var events = obj["events"]; 7 for (var i = 0; i < events.length; i++) { 8 if (events[i].type == "message") { 9 reply_message(events[i]); 10 } else if (events[i].type == "postback") { 11 post_back(events[i]); 12 } 13 } 14} 15 16function reply_message(e) { 17 var input_text = e.message.text; 18 if (input_text == "その他") { 19 var postData = { 20 "replyToken": e.replyToken, 21 "messages": [{ 22 "type": "template", 23 "altText": "カルーセルテンプレート", 24 "template": { 25 "type": "carousel", 26 "columns": [{ 27 "title": "タイトル1", 28 "text": "テキスト", 29 "actions": [{ 30 "type": "message", 31 "label": "A", 32 "text": "テスト1" 33 }, 34 { 35 "type": "message", 36 "label": "B", 37 "text": "テスト2" 38 }, 39 { 40 "type": "message", 41 "label": "C", 42 "text": "テスト3" 43 } 44 ] 45 }, 46 { 47 "title": "タイトル2", 48 "text": "テキスト", 49 "actions": [{ 50 "type": "message", 51 "label": "A", 52 "text": "テスト1" 53 }, 54 { 55 "type": "message", 56 "label": "B", 57 "text": "テスト2" 58 }, 59 { 60 "type": "message", 61 "label": "C", 62 "text": "テスト3" 63 } 64 ] 65 } 66 ] 67 } 68 }] 69 }; 70 } 71 fetch_data(postData); 72} 73 74function fetch_data(postData) { 75 var options = { 76 "method": "post", 77 "headers": { 78 "Content-Type": "application/json", 79 "Authorization": "Bearer " + ACCESS_TOKEN 80 }, 81 "payload": JSON.stringify(postData) 82 }; 83 UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", options); 84}
追記:$を認識できていないのか、うまく作動しませんでした。
バッククォートのままだと返信が来ない、
バッククォートをダブルクォートにすると返信は返ってくる。といった形でした。
Javascript
1// 計算の答えを返す。input_rate:軽減率。input_hp:HP。 2function buildAnswerReply(input_rate, input_hp){ 3 const damage = DAMAGES[input_rate] 4 if(damage == null) return "ERROR"; 5 const detail = damage.detail; 6 const rate = damage.rate; 7 return "${input_hp} の 軽減率${detail} での実質HPは\n約${Math.floor(input_hp / rate)}です"; 8} 9 10 11// HP入力を促すダイアログを返す。input_rate:軽減率。 12function buildRequestReply(input_rate){ 13 const damage = DAMAGES[input_rate] 14 if(damage == null) return "ERROR"; 15 const detail = damage.detail; 16 return "軽減率${detail}で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 17}
回答1件
あなたの回答
tips
プレビュー