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

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

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

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

Google Apps Script

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

Q&A

1回答

1083閲覧

gasでLINEbotの応答型を作りたい

AGLAAGLA

総合スコア54

LINE Messaging API

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/07/28 16:27

現在LINE Messaging APIと、gasを使って、あるゲームの進行役をしてもらうようなシステムを作っています。
そこで、つまづいたので質問させていただきます。
ソースコードは以下の通りです。

javascript

1//LINE Developersで取得したアクセストークンを入れる 2var CHANNEL_ACCESS_TOKEN = ''; 3var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; 4var url = 'https://api.line.me/v2/bot/message/push'; 5var groupID = ''; 6const OutputFolder = DriveApp.getFolderById(''); //保存するフォルダ指定 7const templateFile = DriveApp.getFileById(''); //テンプレートのスプレッドシートを指定 8 9 10//ポストで送られてくるので、送られてきたJSONをパース 11function doPost(e) { 12 var json = JSON.parse(e.postData.contents); 13 14 //返信するためのトークン取得 15 var reply_token= json.events[0].replyToken; 16 if (typeof reply_token === 'undefined') { 17 return; 18 } 19 20 //送られたメッセージ内容を取得 21 var message = json.events[0].message.text; 22 if (message=='ゲーム開始'){ 23 var date = new Date(); 24 date = Utilities.formatDate(date, "Asia/Tokyo", "ゲームを開始しました yyyy/MM/dd hh時mm分"); 25 send_repley(date,reply_token) 26 create_spreadsheet() 27 send_message('チーム名を入力してください') 28 team1=doPost_teamname() 29 send_message(team1)//ちゃんとチーム名が認識されたかの確認 30 } 31 else { 32 send_repley('そのような入力はありません',reply_token) 33 } 34 35 36 //return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 37} 38 39function create_spreadsheet(){ 40 let OutputFileName; 41 OutputFileName = templateFile.getName().replace('template', '')+'スコアシート_'+Utilities.formatDate(new Date(), 'JST', 'yyyyMMddhhss') //語尾に日にち追加 42 new_sheet_id = templateFile.makeCopy(OutputFileName, OutputFolder).getId; 43 new_sheet = SpreadsheetApp.openById(new_sheet_id()); 44} 45 46function send_repley(message,reply_token){ 47 // メッセージを返信 48 UrlFetchApp.fetch(line_endpoint, { 49 'headers': { 50 'Content-Type': 'application/json; charset=UTF-8', 51 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 52 }, 53 'method': 'post', 54 'payload': JSON.stringify({ 55 'replyToken': reply_token, 56 'messages': [{ 57 'type': 'text', 58 'text': message, 59 }], 60 }), 61 }); 62} 63 64function send_message(message){ 65UrlFetchApp.fetch(url, { 66 'headers': { 67 'Content-Type': 'application/json; charset=UTF-8', 68 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 69 }, 70 'method': 'POST', 71 'payload': JSON.stringify({ 72 'to': groupID, 73 'messages':[{ 74 'type': 'text', 75 "text" : message, 76 }] 77 }) 78 }) 79} 80 81 82//ポストで送られてくるので、送られてきたJSONをパース 83function doPost_teamname(e) { 84 var json = JSON.parse(e.postData.contents); 85 86 //返信するためのトークン取得 87 var reply_token= json.events[0].replyToken; 88 if (typeof reply_token === 'undefined') { 89 return; 90 } 91 92 //送られたメッセージ内容を取得 93 var message = json.events[0].message.text; 94 95 96 97 return message 98} 99

理想としては、ゲームを開始した後、チーム名を入力を促した後、doPost_teamnameを実行させ、チーム名の入力を受け取りたいと考えています。
現状、チーム名の入力を促す段階で、チーム名を入れてもdoPost関数から起動してしまうため、そのような入力がありませんと送られてしまいます。
LINEbotでは不可能なのでしょうか?

自分としての最終手段としては、~~チームと入力させ、受け取ったメッセージの語尾が「チーム」という文字が入っていたらそれをチーム名とするという処理かなと思っています。

以上、よろしくお願いいたします。

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

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

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

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

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

YAmaGNZ

2022/07/28 22:26

現在どの入力フェーズなのかを記録して、それで場合分けすればいいんじゃないですか?
AGLAAGLA

2022/07/29 00:57

ありがとうございます。 それはわかっているんですが、コード上でどうそうすればいいかわからない状態です。
YAmaGNZ

2022/07/29 01:38

スプレッドシートのどこかシーケンスを管理するセルでも用意しておいて doPostが呼び出されたら、そのシーケンスを管理するセルの値を読み込んで 0ならmessage=='ゲーム開始'か判断してチーム名入力に移行(シーケンス管理セルに1を書き込む) 1ならチーム名入力(messageは入力されたチーム名として処理し、次のフェーズに移行(シーケンス管理セルに2を書き込む) という感じで各処理を行えばいいのではないですか?
AGLAAGLA

2022/07/29 02:20

早々にお返事ありがとうございます。 なるほど、そういうやり方があるのですね、、 とても私には思い付かないアイデアでした、、 とすると、やはりコード上では入力フェーズを分けるという実装は難しそうですね、、
guest

回答1

0

「ゲーム開始」と入力されdoPostが呼び出されます。
その中でdoPost_teamnameを呼び出しても次の入力がされるまで待つわけではなく実行は終了してしまいます。

なので、どこかに進捗状態を保存しておく必要があります。
Properties Serviceを使用して値を保存してもいいでしょうし、先ほどの案のようにスプレッドシートを使用してもいいでしょう。
そのあたりは「GAS 永続化」などで調べてみてください。

「コード上で入力フェーズを分ける」というのが関数を分けたいというのであれば

GAS

1function doPost(e) { 2 // シーケンスがどこまで進んでいるのかを読み込む 3 4 switch(シーケンス) { 5 case 0: //ゲーム開始 6 start(e); 7 break; 8 case 1: //チーム名入力 9 input_teamname(e); 10 break; 11 } 12}

みたいな感じで分ければいいのではないでしょうか?

投稿2022/07/29 03:36

YAmaGNZ

総合スコア10251

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

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

AGLAAGLA

2022/07/29 15:13

ご丁寧にありがとうございます。 関数に入っっているeとはどのような意味を持つのでしょうか?
YAmaGNZ

2022/07/29 20:16

doPost_teamname(e)としたいようでしたので、doPostのeをそのまま渡せば使えるだろうと思い例として書きました あくまでも例なのでご自身の使いやすいように書けばよろしいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問