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

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

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

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

Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

2113閲覧

GAS クイックリプライを使用したい

SN____R

総合スコア8

LINE Messaging API

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

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2021/07/09 06:00

編集2021/07/10 10:07

GASを使用したLinebotを作成しているのですが、if文にて特定の文字列に返信するといったプログラムを記述していたのですが、特定の文字列をクイックリプライにて簡単に送信できるようにしたいと考えました。
流れとしましては
・その他 という文字列をリッチメニューにて送信

10~12個の文字列一覧をクイックリプライにて表示
といったことが出来る様にしたいです。ご教授のほどよろしくお願いいたします。

追記:自分なりにクイックリプライ機能を搭載しようと思い、その他という文字が入力されたらクイックリプライを返す。という記述をしたのですが、その他と入力しても何も返ってきませんでした。

こちらを参考にさせていただきましたが、やはりできませんでした。
https://gist.github.com/arukayies/d2773ac02d363226e301503853166936

Javascript

1var ACCESS_TOKEN = "XXXXXX="; 2var PUSH = "https://api.line.me/v2/bot/message/push"; 3var REPLY = "https://api.line.me/v2/bot/message/reply"; 4var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; 5var ID = '1CIyC69Mn7mCOgLpW2wObf_fVMDLD301kVYwTs4QsCKg/'; 6var URL = 'https://api.line.me/v2/bot/message/reply'; // 応答メッセージ用のAPI URL 7var SS_ID = "XXXXXXXXXX"; //スプレッドシートのID 8 9var HistorySheet = SpreadsheetApp.openById(SS_ID).getSheets()[0]; 10 11function doPost(e) { 12 var contents = e.postData.contents; 13 var obj = JSON.parse(contents); 14 var events = obj["events"]; 15 for (var i = 0; i < events.length; i++) { 16 if (events[i].type == "message" && events[i].message.type == "text") { 17 reply_message(events[i]); 18 } 19 } 20} 21 22function reply_message(e) { 23 var input_text = e.message.text; 24 var reply_text = ""; 25 const userId = e.source.userId; 26 const history = getLastUserHistory(userId); 27 28 if (history && history.continuous) { 29 if (history.text == "70%*2") { 30 reply_text = input_text + " の 軽減率70%×70%での実質HPは\n約 " + Math.floor(input_text / 0.09) + "です"; 31   setLastUserHistory(userId, input_text, false); 32 } 33 else { 34 if (input_text == "70%*2") { 35 reply_text = "軽減率70%×70%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 36 }else if (input_text == "その他") { 37 UrlFetchApp.fetch('https://api.line.me/v2/bot/message/push', { 38 'headers': { 39 'Content-Type': 'application/json', 40 'Authorization': 'Bearer ' + prop.TOKEN, // スクリプトプロパティにトークンは事前に追加しておく 41 }, 42 'method': 'POST', 43 'payload': JSON.stringify({ 44 "to": prop.DEBUGID, // スクリプトプロパティに送信先IDは事前に追加しておく 45 "messages": [ 46 { 47 "type": "text", 48 "text": "選択してください!", 49 "quickReply": { 50 "items": [ 51 { 52 "type": "action", 53 "imageUrl": "https://example.com/sushi.png", 54 "action": { 55 "type": "message", 56 "label": "A", 57 "text": "70%*2" 58 } 59 }, 60 { 61 "type": "action", 62 "imageUrl": "https://example.com/sushi.png", 63 "action": { 64 "type": "message", 65 "label": "B", 66 "text": "50%*2" 67 } 68 } 69 ] 70 } 71 } 72 ], 73 "notificationDisabled": false // trueだとユーザーに通知されない 74 }), 75 }); 76 }if (reply_text) { 77 setLastUserHistory(userId, input_text, true); 78 } else { 79 setLastUserHistory(userId, input_text, false); 80 } 81 } 82 83 var postData = { 84 "replyToken": e.replyToken, 85 "messages": [{ 86 "type": "text", 87 "text": reply_text 88 }] 89 }; 90 91 var options = { 92 "method": "post", 93 "headers": { 94 "Content-Type": "application/json", 95 "Authorization": "Bearer " + ACCESS_TOKEN 96 }, 97 "payload": JSON.stringify(postData) 98 }; 99 const response = UrlFetchApp.fetch(URL, options); 100 if (response.getResponseCode() !== 200) { 101 throw new Error(response.getContentText()); 102 } 103} 104function getLastUserHistory(userId) { 105 const userHistory = HistorySheet.getDataRange().getValues(); 106 for (let i = userHistory.length - 1; 0 < i; i--) { 107 if (userHistory[i][1] === userId) { 108 return { 109 date: userHistory[i][0], 110 userId: userHistory[i][1], 111 text: userHistory[i][2], 112 continuous: userHistory[i][3] 113 }; 114 } 115 } 116 return undefined; 117} 118 119function setLastUserHistory(userId, text, continuous) { 120 const values = [new Date(), userId, text, continuous]; 121 HistorySheet.appendRow(values); 122}

追記:再度修正しましたが、やはり別のところでエラーが出てしまいます。
エラー内容:SyntaxError: Unexpected end of input(行 156、ファイル「コード.gs」)

Javascript

1function reply_message(e) { 2 var input_text = e.message.text; 3 var reply_text = ""; 4 const userId = e.source.userId; 5 const history = getLastUserHistory(userId); 6 7 if (history && history.continuous) { 8 if (history.text == "70%*2") { 9 reply_text = input_text + " の 軽減率70%×70%での実質HPは\n約 " + Math.floor(input_text / 0.09) + "です"; 10 } else if (history.text == "50%*2") { 11 reply_text = input_text + " の 軽減率50%×50%での実質HPは\n約 " + Math.floor(input_text / 0.25) + "です"; 12 } else if (history.text == "70%*50%") { 13 reply_text = input_text + " の 軽減率70%×50%での実質HPは\n約 " + Math.floor(input_text / 0.15) + "です"; 14 } else if (history.text == "25%*2") { 15 reply_text = input_text + " の 軽減率25%×25%での実質HPは\n約 " + Math.floor(input_text / 0.5625) + "です"; 16 } else if (history.text == "75%*2") { 17 reply_text = input_text + " の 軽減率75%×75%での実質HPは\n約 " + Math.floor(input_text / 0.0625) + "です"; 18 } else if (history.text == "50%*2+30%*2") { 19 reply_text = input_text + " の 軽減率50%×50%×30%×30%での実質HPは\n約 " + Math.floor(input_text / 0.1225) + "です"; 20 } else if (history.text == "50%*2+25%") { 21 reply_text = input_text + " の 軽減率50%×50%×25%での実質HPは\n約 " + Math.floor(input_text / 0.1875) + "です"; 22 } else if (history.text == "25%+50%*2") { 23 reply_text = input_text + " の 軽減率25%×50%×50%での実質HPは\n約 " + Math.floor(input_text / 0.1875) + "です"; 24 } else if (history.text == "35%*2") { 25 reply_text = input_text + " の 軽減率35%×35%の実質HPは\n約 " + Math.floor(input_text / 0.4225) + "です"; 26 } else if (history.text == "35%*25%") { 27 reply_text = input_text + " の 軽減率35%×25%の実質HPは\n約 " + Math.floor(input_text / 0.4875) + "です"; 28 } else if (history.text == "25%*35%") { 29 reply_text = input_text + " の 軽減率25%×35%の実質HPは\n約 " + Math.floor(input_text / 0.4875) + "です"; 30 } 31 setLastUserHistory(userId, input_text, false); 32 } 33 else { 34 if (input_text == "70%*2") { 35 reply_text = "軽減率70%×70%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 36 } else if (input_text == "50%*2") { 37 reply_text = "軽減率50%×50%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 38 } else if (input_text == "70%*50%") { 39 reply_text = "軽減率70%×50%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 40 } else if (input_text == "25%*2") { 41 reply_text = "軽減率25%×25%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 42 }else if (input_text == "75%*2") { 43 reply_text = "軽減率75%×75%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 44 }else if (input_text == "50%*2+30%*2") { 45 reply_text = "軽減率50%×50%×30%×30%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 46 } else if (input_text == "35%*2") { 47 reply_text = "軽減率35%×35%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 48 }else if (input_text == "50%*2+25%") { 49 reply_text = "軽減率50%×50%×25%で計算します。\n計算したいパーティーの最大HPを、半角英数字でカンマ区切りをせずに入力してください。"; 50 }else if (input_text == "その他") { 51 message = { 52 "type": "text", 53 "text": "その他の軽減率を設定してください", 54 "quickReply": { 55 "items": [ 56 { 57 "type": "action", 58 "action": { 59 "type": "message", 60 "label": "A", 61 "text": "A" 62 } 63 }, 64 { 65 "type": "action", 66 "action": { 67 "type": "message", 68 "label": "B", 69 "text": "B" 70 } 71 }, 72 { 73 "type": "action", 74 "action": { 75 "type": "message", 76 "label": "C", 77 "text": "C" 78 } 79 } 80 ] 81 } 82 } 83 }if (reply_text) { 84 setLastUserHistory(userId, input_text, true); 85 } else { 86 setLastUserHistory(userId, input_text, false); 87 } 88 } 89

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

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

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

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

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

draq

2021/07/09 08:35

作業の丸投げになっています。ご自分が試したこと、試してわからなかった事等を記載してください。
SN____R

2021/07/09 10:15

申し訳ございません。修正を施しました。
draq

2021/07/09 10:26

そもそも追記部分はPythonのコードになってませんか?
SN____R

2021/07/09 10:43

本当ですね...Javaにてどうにかできないか、調べています。
SN____R

2021/07/09 10:50

すみません。見当がつかないのですが、この場合はどうしたらよいのでしょうか。
guest

回答1

0

ベストアンサー

「その他」メッセージを入力されたら、クイックリプライ付きメッセージを返信する。
クイックリプライの各ボタンのアクションのタイプはポストバックアクションにしておき、doPost内でイベントのタイプがpostbackだっだ場合はevent.postback.dataからどのボタンがタップされたのか判断してください。
後は普通に"70%*2"とか入力された場合と同じです。

クイックリプライ

https://developers.line.biz/ja/reference/messaging-api/#quick-reply

クイックリプライボタンオブジェクト

https://developers.line.biz/ja/reference/messaging-api/#quick-reply-button-object

ポストバックアクション

https://developers.line.biz/ja/reference/messaging-api/#postback-action

ポストバックイベント

https://developers.line.biz/ja/reference/messaging-api/#postback-event

投稿2021/07/09 11:45

draq

総合スコア2577

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

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

SN____R

2021/07/10 04:11

教えていただいた通りに試してみたのですが、失敗しました。 間違いを指摘していただけると助かります。
draq

2021/07/10 07:11

明らかに文法間違ってます。else if (input_text == "その他") のブロック内がめちゃくちゃです。
SN____R

2021/07/10 07:49

初心者なのでどこをどうすればいいのかも検討がつかないです...すみません。
draq

2021/07/10 09:54

どこをどうすればいいのかも検討がつかない状態なら、いきなり完成形を目指すのではなく返信とか考えずにクイックリプライ付きメッセージをポストしてみるとかもっと単純な機能の確認から初めてはどうでしょうか。
SN____R

2021/07/10 10:09

全体が追記しきれなかったのですが、コードを書き換えました。エラー表示になっている場所はコード全文の最後の行の } になります。
draq

2021/07/10 11:21

ちゃんと見れてませんが、括弧の対応が間違ってるんじゃないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問