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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

0回答

1173閲覧

GASを使用したLineBotを作成しています。対話型処理の進捗を管理したい(ステータス管理?)のですが方法がわりません。

tatatace

総合スコア2

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クリップ

投稿2020/10/20 00:20

編集2020/10/21 01:09

前提・実現したいこと

ユーザーから送信される特定文字列に識別して動作が分岐するLineBotをGASで製作したいです。

例えば、

1 : 製作しているLineBotにユーザが「水を注文」と送信する
2 : LineBotから「お水ですね。軟水にしますか?硬水にしますか?」とメッセージを送る
3 : ユーザが「軟水」か「硬水」と送信する
4 : 軟水か硬水かで処理を分岐させて「〇水ですね。注文完了しました。」とメッセージをおくる

といったようにユーザからのアクションによって処理を分岐しながら進行させるBotの完成を目指しています。

2番までに関してはfunction doPost(e) 内で

// WebHookで受信した応答用Token var replyToken = JSON.parse(e.postData.contents).events[0].replyToken; // ユーザーのメッセージを取得 var userMessage = JSON.parse(e.postData.contents).events[0].message.text; if(userMessage === "水を注文する") { UrlFetchApp.fetch(url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + channel_token, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': replyToken, 'messages': [{ 'type': 'text', 'text': "お水ですね。軟水にしますか?硬水にしますか?", }], }), }); }

のようにして実現できているのですが、このあと3番と4番の処理をどのようにすればいいのかよくわかりません。

"お水ですね。軟水にしますか?硬水にしますか?"と尋ねた後、ユーザからレスポンスがあるまで入力待ちし、コードの進行を一旦止めて入力があった場合IF式で条件分岐 → 一定時間入力がなかった場合処理を終了する。といった構造にするのかなと勝手に想像しているのですが如何せん処理が複雑になりすぎる気がします。

いろいろググってみたのですが、これといった具体的な方法を見つけることができないのです。
世によくある対話型で処理を進めるLineBotはどういった作りになっているのでしょうか?

当方初学者につき、見当はずれの質問をしている可能性が高いことは重々認識しています。
回答して頂くにあたって不足している情報などありましたらできる限り対応させて頂きますのでお声がけください。
お付き合い頂ける方がいらっしゃいましたらお力添えを頂ければ幸いです。
よろしくお願いいたします。

追記 : 2020/10/21時点進捗

LINE BOT側が状態を維持しなければならないので、セッション(のようなもの)を管理しなければならないのだと思います。 「LINEBOT セッション」などと検索すると関連する話題がヒットします。 そういったものを調べ、必要であれば質問内容を更新するか、引き続き有識者からの回答をお待ちください。 (当方で検証できる環境にはないので以上、コメントのみです)

dodox86様より、以上のコメントを頂いたので、早速「LINEBOT セッション」で検索した結果、以下の有益な記事を発見することができました。
コメントありがとうございました。

LINEBOTで会話のステータス(文脈)管理(セッション管理?) https://qiita.com/shima-218/items/643406e5a8c0ed3b2176

記事内のコードにjavaが使用されていること、私にjavaの知識とプログラミング知識が欠如していることから、残念ながら記事内容の完璧な理解には及びませんでした。
検索エンジンを駆使してらこの記事内の内容を解読した結果、どうやらHashMapクラス、連想配列というものを使用して、UserIdと処理の進行具合を紐づけることで"セッション(のようなもの)"を管理し、If式で進行度による処理分岐を行っているという暫定解釈になりました。

連想配列の状態をLineBot側に維持させる方法はよくわかっていません。
ユーザが"水を注文"と送信したら連想配列に送信者のUserIdと水を注文しようとしているという進捗を保存し、"お水ですね。軟水にしますか?硬水にしますか?"とメッセージを送る処理をした後、いったんfunction doPost(e)を終了させて、ユーザから軟水か硬水かのレスポンスがあった時、改めてfunction doPost(e)が作動するわけですが、一回目のfunction doPost(e)処理で連想配列に情報を格納させた後、function doPost(e)を終了させた時点で連想配列の内容がクリアされてしまうように思います。これを維持させる方法を記事から読み解くことが現状できていません。

連想配列はよくわからないので、スプレッドシートにUserIdと処理の進捗を保存するシートを作ってそこにIdと進捗を保存しておいて、ユーザのレスポンスがあったときにスプレッドシートの内容を読み取って処理を分岐するという妥協策を検討しています。
このLineBotは完成後50名前後の程度のユーザーが毎日利用する予定なのですが、このような処理でも問題ないでしょうか?セルに書き込んだり読み込んだりする処理は負荷が高く不安定になるという話を聞くのでこれでいいのか疑問です。

連想配列を使った処理の勉強と妥協案の模索は平行して現在も続行しております。
この質問を見られた方で協力いただける方いらっしゃいましたらご助力いただければ幸いです。

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

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

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

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

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

dodox86

2020/10/20 00:51

LINE BOT側が状態を維持しなければならないので、セッション(のようなもの)を管理しなければならないのだと思います。「LINEBOT セッション」などと検索すると関連する話題がヒットします。そういったものを調べ、必要であれば質問内容を更新するか、引き続き有識者からの回答をお待ちください。(当方で検証できる環境にはないので以上、コメントのみです)
tatatace

2020/10/21 01:12

コメントありがとうございます。 検索して得た情報を元に記事に追記を行いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問