iT邦幫忙

1

line 機器人 新手問題

有關google表單內容轉成linebot問卷形式的問題,我想在第一段程式內來啟動google表單執行問卷內容,但是經過判斷式後,問卷只會執行1次,也就是表單內容都只會出現1題,要執行下一題又得輸入一次關鍵字,想問看有沒有什麼方法,可以在第一段程式驅動後,問卷全部填完,才跳出第二段程式呢?
或者是要怎麼辦才能重複呼叫同一支function,直到達成目的呢?

//---------**第一段程式碼**-------------
function doPost(e) {
var userData = JSON.parse(e.postData.contents);
console.log(userData);

// 取出 replayToken 和發送的訊息文字
var replyToken = userData.events[0].replyToken;
var clientID = userData.events[0].source.userId;
//*判斷使用者是否想填問卷*
if((userData.events[0].message.text) == "問卷")//*如果關鍵字是問卷,開始填寫問卷*
//--不知道if裡面能+for迴圈嗎?--
{
questionform(e); //*呼叫第二段問卷程式*
}
}




//-----------**第二段程式碼-**----------
///*questionform start*

function questionform(e){
var userData = JSON.parse(e.postData.contents);
console.log(userData);

// *取出 replayToken 和發送的訊息文字*
var replyMessage = [];
var replyToken = userData.events[0].replyToken;
var clientID = userData.events[0].source.userId;
var clientMessage;
var nowTime = new Date();

//判斷使用者回復格式
switch(userData.events[0].type) {
case "message":
switch(userData.events[0].message.type) {
case "text":
clientMessage = userData.events[0].message.text;
break;

case "sticker":
case "location":
return;
break;

case "postback":
switch(userData.events[0].postback.data){
case "DateMessage":
clientMessage = userData.events[0].postback.params.date;
replyMessage.push({type:"text", text:clientMessage});
break;

case "TimeMessage":
clientMessage = userData.events[0].postback.params.time;
replyMessage.push({type:"text", text:clientMessage});
break;

case "ignoreQuestion":
clientMessage = "NULL";
replyMessage.push({type:"text", text:"此題已略過"});
break;

case "otherOption":
replyMessage = replyMessage.concat(otherOptionMessage());//呼叫//其他選項
sendReplyMessage(CHANNEL_ACCESS_TOKEN, replyToken, replyMessage);
return;
break;
}

case "follow":
clientMessage = "follow";
break;

default:
return;
}
//紀錄使用者回復資料+時間
var replyData = getUserAnswer(clientID, clientMessage);//呼叫//判斷使用者回答到第幾題
switch (replyData[1]) {
case -1:
sheet.getRange(replyData[0], 1).setValue(Date());//第'陣列replyData[0]'列,第1行,設定日期

replyMessage = replyMessage.concat(finishTheQuestionnare(replyData[2]));//呼叫//取得最後一個問題之後的東西

sendReplyMessage(CHANNEL_ACCESS_TOKEN, replyToken, replyMessage);//呼叫//確認回復訊息
return;
break;
case 1:
replyMessage = replyMessage.concat(getFormTitle());//呼叫//取得表單名稱及說明
break;
}
replyMessage = replyMessage.concat(getQuestion(replyData[1]));//呼叫//取得要送出的題目

sendReplyMessage(CHANNEL_ACCESS_TOKEN, replyToken, replyMessage);//呼叫//確認回復訊息
}
///questionform end
dragonH iT邦超人 5 級 ‧ 2020-03-10 22:29:23 檢舉
https://ithelp.ithome.com.tw/questions/10197486

去問他

幫你邀請她了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
無敵銅金剛
iT邦新手 5 級 ‧ 2020-03-11 10:07:41

給你一個大概的流程

  1. 對方:問卷
  2. 機器人:問題1
  3. 對方:回答問題1
  4. 機器人:問題2
  5. 對方:回答問題二
    ...以下省略...

把所有對話儲存起來,最後再對應問題把格式正確的答案一項一項填到表單

可參考
.NET Walker: 使用C#開發LineBot(11) – Chat bot如何處理連續對話

1
Han
iT邦研究生 1 級 ‧ 2020-03-11 10:14:46

Linebot想要填問卷這種一步一步引導式操作的需要設計一個流程

例如:問卷
觸發這個指令就進行問卷填寫

那如何讓使用者觸發下一個指令呢?
這邊比較推1.或3.


  1. 選擇題
    Flex Messeage
    或是 Template
    這兩個東西,再使用Postback Action
    將使用者的回答和觸發 下一題的指令包在 Post請求裡面 即可同時回答和進入下一題
  2. 問答題
    這種處理方式比較難,要紀錄使用者填到哪一題,和此使用者的回覆正不正確
    這就要看你跳下一題的機制如何編寫
    因為如果你同時服務多人,你根本不知道每個使用者現在在哪一題,必須紀錄每個人填寫階段
  • 如果使用者輸入 問卷,我就開始紀錄此使用者並給予第一題問題
  • 如果使用者回覆第一題的格式,我就紀錄答案並給予第二題
  • 如果使用者回覆第二題的格式,我就紀錄答案並給予第三題
    or
  • 如果使用者輸入 問卷,我就開始紀錄此使用者並給予第一題問題
  • 不管使用者輸入什麼,我都紀錄並給予下一題(相信使用者)
  1. Liff
    使用Line近期主打的機制Line Fron-End Framwork
    讓使用者在官方帳號裡面就可 以網頁形式 進行問卷填寫
    優點:完全不須處理使用者填寫階段,整份問卷直接送到Google表單!

我要發表回答

立即登入回答