昨天我們使用了 Quick Reply 讓使用者可直接跟我們回應的訊息互動,今天要使用 Template Message 做一個在互動上也蠻常見的功能 - 同意服務條款。
現在的驗證碼小幫手需要紀錄使用者是否 1. 已認證 2. 已同意條款,而且之後也需要取得 User Profile 等資訊,勢必要新增一張資料表紀錄 User 資訊方便更新及檢閱。
users在原本的 auto-get-verification-code 試算表新增一張工作表 users,並加入標題列如下:
目的是在原先的流程上加入同意條款的功能,時間點可以視情況選擇在身份認證之前或之後,這次先選擇在身份認證之後。所以流程大致如下:
users sheet 寫入 user_id 跟 is_verified 欄位handleMessageEvent
agree_terms 寫入 1首先我們要新增對 users sheet 執行 query & upsert 的功能
加入 upsertUserInfo & getUserRowIndex
getUserRowIndex 尋找 users sheet 裡面是否已經有這個 userId,有的話回傳列號,沒有的話就在最後新增一列這個 userId 的資料並回傳列號upsertUserInfo 則是根據輸入的 userData object 執行對應 columnname 的資料更新function upsertUserInfo(userId, userData) {
  Logger.log('start upsertUserInfo');
  var fillableKeys = {
    'name':1,	
    'email':2,
    'is_verifed':3,
    'agree_terms':4,
    'updated_at':6
  }
  
  var sheet = ReadMailAndInsertToGoogleSheet.connectToSheet('users');
  var userRowIndex = getUserRowIndex(sheet, userId);
  var userRowRange = sheet.getRange(userRowIndex, 1, 1, 7);
  var userRowData = userRowRange.getValues()[0];
  Object.entries(userData).forEach(([key, value]) => {
    if (fillableKeys[key] !== undefined) {
      userRowData[fillableKeys[key]] = value;
    }
  });
  userRowData[6] = new Date();
  userRowRange.setValues([userRowData]);
}
function getUserRowIndex(userSheet, userId) {
  var searchResult = ReadMailAndInsertToGoogleSheet.searchColumnValue(userSheet, 'user_id', userId);
  if (searchResult !== -1) {
    return searchResult+2;
  } 
  // create new user row  
  var lastRow = userSheet.getLastRow();
  var range = userSheet.getRange(++lastRow, 1, 1, 6);
  range.setValues([[userId,,,,, new Date()]]);
  return lastRow;
}
接著在 tagVerificationCode 裡新增紀錄 user 已經認證的功能
function tagVerificationCode(target, userId) {
  var sheet = ReadMailAndInsertToGoogleSheet.connectToSheet('verification_code');
  var searchResult = ReadMailAndInsertToGoogleSheet.searchColumnValue(sheet, 'code', target);
  if (searchResult !== -1) {
    var targetRowIndex = searchResult+2;
    var userIdValue = sheet.getRange(targetRowIndex, 2, 1, 1).getValue();
    if (userIdValue.length === 0) {
      var targetRange =  sheet.getRange((searchResult+2), 2, 1, 2);
      targetRange.setValues([[userId, new Date()]]);
      // 加入下面這行
      upsertUserInfo(userId, {'is_verifed': true});
      return true;
    }
  }
  return false;
}
這樣一來我們就可以在使用者認證時紀錄資訊在 users sheet,並且可以用同樣的方式紀錄接下來的同意條款結果,明天繼續完成用 Template Message 發送同意條款資訊,以及寫入 users sheet!