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

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

解決済

2回答

448閲覧

【GAS】直近のメッセージを取得して分岐するプログラムの記述の仕方

cheeees_0707

総合スコア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/11/14 08:17

編集2020/11/15 02:32

実現したいこと

こちらの質問への回答で

・会話履歴に基づく返答
webhookで送信が来たときに、送信元のタイプとそれに対応するIdから、直近の会話履歴を探す。先の会話(ボット側の返答も含め)から、継続メッセージであることを識別して分岐をする。
フローとしては、
着呼
→idからタイムアウトしていない会話の検索
→無
→初期対応
→有
→会話継続のパターンを特定
→パターンAの応答
→パターンBの応答

という物がありました。このような処理をしたいです。

現在使用しているコード

一応記述しておきます。
(できれば返信テキストはbotMessageに格納しておきたいです。)

gs

1var TOKEN = //アクセストークン ; 2var URL = "https://api.line.me/v2/bot/message/reply"; 3function doPost(event) { 4 var request = JSON.parse(event.postData.contents); 5 var replyToken = request.events[0].replyToken; 6 7 var botMessage;//ここで返答テキストを決定 8 //中略、ここでbotMessageの内容を決定している 9 10var payload = JSON.stringify({ 11 "replyToken": replyToken, 12 "messages": [{ 13 "type": "text", 14 "text": botMessage 15 }] 16 }); 17 18 UrlFetchApp.fetch(URL, { 19 "headers": { 20 "Content-Type": "application/json; charset=UTF-8", 21 "Authorization": "Bearer " + TOKEN 22 }, 23 "method": "post", 24 "payload": payload 25 }); 26 return; 27}

補足

GoogleDriveを使用。
私自身全くの初心者なので、何か一例を添えていただけるとありがたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

javascript

1const doPost = (e) => { 2 const request = JSON.parse(e.postData.contents); 3 const type = request.events[0].source.type; 4 if (type !== 'user') return; // user でなかったら無視。(follow とか考えると面倒なので) 5 const contentsType = request.events[0].message.type; 6 if (contentsType !== 'text') return; // テキストメッセージでなかったら無視 7 const userId = request.events[0].source.userId; 8 const message = request.events[0].message.text; 9 const botMessage = handleBook(userId,message); 10 // 送信してください。 11} 12const fetchRow = (array,pos,needle) => { 13 const found = array.filter(e=>e[pos] === needle); 14 return found.length > 0 ? found[0] : found; 15} 16const isTimedOut = (target) => { 17 const timeout = 5; 18 const now = new Date(); 19 const delta = now - target / (1000 * 60); 20 return delta > timeout; 21} 22const findStatusForUser = (dat,uid) => { 23 const row = fetchRow(dat,0,uid); 24 if(row.length < 0) { 25 return undefined; 26 } 27 if(isTimedOut(row[1])) { 28 return undefined; 29 } 30 return row.slice(2); 31} 32const updateStatusForUser = (sheet, dat, uid, arr) => { 33 const row = fetchRow(dat,0,uid); 34 if(row.length < 0) { 35 sheet.appendRow([uid,new Date(), ...arr]); 36 return; 37 } 38 const value = dat.map(e=> e[0] === uid ? [uid, new Date(), ...arr]:e); 39 sheet.getRange(1,1,value.length,value[0].length).setValues(value); 40} 41const getAnswer = (message, e) => { // この先適当に会話を膨らましてください 42 if(e === undefined) { 43 return ["どうしました?", "waitfor1", "none"]; 44 } 45 if(message !== "天気") { 46 return [`${message}ってなんですか? わかりません`, "waitfor1", "none"] 47 } 48 if(e[0] === "waitfor2") { 49 return [`${message} の天気は晴れです`, "complete", "none"]; 50 } 51 return ["どこの天気ですか?", "waitfor2", "none"]; 52} 53const handleBook = (uid, message) => { 54 const sheetName = "シート1"; 55 const sheet = SpreadsheetApp.getActive().getSheetByName(sheetName); 56 const dat = sheet.getDataRange().getValues(); 57 const previous = findStatusForUser(dat,uid); 58 const ans = getAnswer(message, previous); 59 updateStatusForUser(sheet, dat, uid, ans.slice(1)); 60 return ans[0]; 61} 62

投稿2020/11/20 16:29

編集2020/11/20 18:00
papinianus

総合スコア12705

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

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

0

他の方法(スプレッドシート)で解決しました。

投稿2020/11/17 14:42

cheeees_0707

総合スコア2

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

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

papinianus

2020/11/20 16:28

では、解決にしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問