iT邦幫忙

2

Google Apps Script製作line bot關鍵字回應問題

  • 分享至 

  • xImage

看了幾位前輩的文章,使用Google Apps Script做了一個簡單的機器人(第一段程式碼)

但我現在想在其中再加入第二段程式碼

希望若使用者發送"查詢",則跑第一段程式碼的回覆

如果發送的是"我想填問券"則發送第二段程式碼的回覆

請問以上功能該如何寫呢?

我自己的嘗試是在第一段程式碼的IF判斷,TURE的地方加入第二段程式碼,但不知道哪裡有問題,失敗了xd

我的嘗試:
//第一段程式碼IF的部分
if(userMessage.indexOf("查詢")<=-1){

//自己加上一個if跟第二段程式碼
if(userMessage.indexOf("我想填問券")<=-1){
return;
}
第二段程式碼

}

第一段程式碼

function doPost(e) {
  //與Line連結
    var CHANNEL_ACCESS_TOKEN = 'iJWsCIoiy9ide49Vf / 7SlRLu8gjLhbLMkm + aHkMISFeT7CZJXn1Hy6NKSaDISMRSO4gj3GkDVvyS + WQdGiP04IKVPfLqXXG88Q4X9Rnony3v2z + Qf04u5S + l2VzQ7Mkz1pG4j0HXX6rpV3GYgV2bhQdB04t89 / 1O / w1cDnyilFU =';
  var msg= JSON.parse(e.postData.contents);
  console.log(msg);
  
  //讀取儲存格數值
  var url = 'https://docs.google.com/spreadsheets/d/1HvHYaVFuJijOJzbCfTLRaRVM8krwn2ooxtCIlYDKeY8/edit#gid=1602240186';
  var name = '「2月傷害簽到」'
  var SpreadSheet = SpreadsheetApp.openByUrl(url);
  var SheetName = SpreadSheet.getSheetByName(name);
  var Nowboss = SheetName.getSheetValues(2,2,1,1);

       // 取出 replayToken 和發送的訊息文字
  var replyToken = msg.events[0].replyToken;
  var userMessage = msg.events[0].message.text;

  
//當line使用者發送訊息,即傳送指定訊息
if (typeof replyToken === 'undefined') {
return;
}
//----- 加這段,<=-1 表示找不到
if(userMessage.indexOf("查詢")<=-1){
return;
}
//----- 加這段
var url = 'https://api.line.me/v2/bot/message/reply';
  UrlFetchApp.fetch(url, {
      'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': [{
        'type': 'text',
        'text': ' 《PCR-1》戰隊戰目前存活Boss為: '+Nowboss,
      }],
    }),
  });
  }
 

第二段程式碼

var CHANNEL_ACCESS_TOKEN = 'iJWsCIoiy9ide49Vf / 7SlRLu8gjLhbLMkm + aHkMISFeT7CZJXn1Hy6NKSaDISMRSO4gj3GkDVvyS + WQdGiP04IKVPfLqXXG88Q4X9Rnony3v2z + Qf04u5S + l2VzQ7Mkz1pG4j0HXX6rpV3GYgV2bhQdB04t89 / 1O / w1cDnyilFU =';
var spreadSheetID = '1gBwNE6vlWTkNvsVAST91D_pdxJLLFjk-1e7WMJI4VA8';
var welcomeTitle = "您好,歡迎使用問卷段查,請依照下列問題填入相應回答";
var finishTitle = "記錄google表格完畢,感謝填寫";

var spreadSheet = SpreadsheetApp.openById(spreadSheetID);
var sheet = spreadSheet.getActiveSheet();
var lastRow = sheet.getLastRow();
var lastColumn = sheet.getLastColumn();
var sheetData = sheet.getSheetValues(1, 1, lastRow, lastColumn);

function doPost(e) {
  
  var userData = JSON.parse(e.postData.contents);
  console.log(userData);
  
  // 取出 replayToken 和發送的訊息文字
  var replyToken = userData.events[0].replyToken;
  var clientMessage = userData.events[0].message.text;
  var clientID = userData.events[0].source.userId;
  var QandO = [sheetData[0], sheetData[1]];          //取得題目和選項
  var replyData = getUserAnswer(clientID, clientMessage);
  
  switch (replyData[1]) {
    case 0:
      var replyMessage = finishTitle;
      break;

    case 2:
      var replyMessage = welcomeTitle + "\n\n" + QandO[0][replyData[1] - 1] + "\n\n" + QandO[1][replyData[1] - 1];
      break;
    
    default:
      var replyMessage = QandO[0][replyData[1] - 1] + "\n\n" + QandO[1][replyData[1] - 1];
  }
  
  sendReplyMessage(CHANNEL_ACCESS_TOKEN, replyToken, replyMessage);
}


//傳送訊息給使用者
function sendReplyMessage(CHANNEL_ACCESS_TOKEN, replyToken, replyMessage) {

  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", {
    "headers": {
      "Content-Type": "application/json; charset=UTF-8",
      "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN,
    },
    "method": "post",
    "payload": JSON.stringify({
      "replyToken": replyToken,
      "messages": [{
        "type": "text",
        "text":replyMessage,
      }],
    }),
  });
}

//判斷使用者回答到第幾題
function getUserAnswer(clientID, clientMessage) {

  var returnData = [];
  for (var i = lastRow - 1; i >= 0; i--) {
    if (sheetData[i][0] == clientID && sheetData[i][lastColumn - 1] == "") {
      for (var j = 1; j <= lastColumn -1; j++) {
        if (sheetData[i][j] == "") {break;}
      }
      sheet.getRange(i + 1, j + 1).setValue(clientMessage);
      //如果使用者已經回答了最後一題,就把完成時間填上。不然就送出下一題給使用者
      if (j + 2 == lastColumn) {
        sheet.getRange(i + 1, lastColumn).setValue(Date());
        returnData = [i + 1, 0];
      }
      else {
        returnData = [i + 1, j + 2];
      }
      return returnData;
      break;
    }
  }
  //如果使用者還沒有回答過任何資料,就新增加一列在最後,把使用者ID輸入並開始送出題目
  sheet.insertRowAfter(lastRow);
  sheet.getRange(lastRow + 1, 1).setValue(clientID);
  returnData = [lastRow + 1, 2];
  return returnData;
}
Han iT邦研究生 1 級 ‧ 2019-03-14 12:05:59 檢舉
是不是在進"我想填問券"的指令之前
你查詢的判斷就return了
所以沒有繼續往下判斷?

看不太清楚你程式的寫法
這是兩隻程式嘛?
------------------------
下面補回答了
doPost 不能這樣玩滴XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
Han
iT邦研究生 1 級 ‧ 2019-03-14 15:50:29
最佳解答

中午時段腦袋空空沒看懂XD

原來意思是

如果沒有 '查詢' 這兩個字
則判斷
有沒有 '我想填問卷' 這五個字
沒有就return
如果沒被return 就會執行到第二段程式

那問題就在於
你第二段如果真的是你po的那樣
裡面還放上doPost 是不會被驅動的

Google Apps Script是使用post請求時
會進入doPost的function

你程式的進入點已經是doPost了
也就是你po的第一段程式碼

第二段你放在 我想填問卷那邊
裡面全部都是function
沒有去呼叫他 他是不會驅動的

應該寫成

function doPost(e)
{
    //Line常數宣告
    //.
    //.
    //.
    
    //先定義一下message為使用者傳的內容
    if(message.indexOf('查詢')<=-1)  //如果關鍵字不是查詢
    {
        //進這裡代表內容不包含'查詢'這兩字
        
        if(message.indexOf('我想填問卷')<=-1)
        {
            //進這裡代表內容不包含'我想填問卷'五個字
            return;
        }
        //到這裡還能執行到 代表使用者想填問卷了
        feedback();
        return;   //return 才能避免繼續執行後續動作
    }
    search();
}
function search()  //定義你查詢想做的動作
{
//查詢起來
}
function feedback()  //定義你問卷 想做的動作
{
//填問卷囉
}

看不懂可以私我
最近使用Line bot小有心得
希望可以藉由回答來驗收一下是否有哪裡不足XD

wadenba03 iT邦新手 5 級 ‧ 2019-03-15 10:21:41 檢舉

終於知道問題了,感謝!!

我要發表回答

立即登入回答