chevron_left

Googleスプレッドシート -Google Apps Scriptでの自動化TIPS-

PREMIUM

授業の概要

前回学んだGoogle Apps Scriptと、LINEのMessaging APIを組み合わせて、LINEのチャットボットを作成します。自動返信用の辞書や、定期的実行など、Googleスプレッドシートならではの機能も活用していきます。

それほど多くないコードで作成できるので、まずはやり方を見て一緒に流れをつかみましょう。(授業後にソースコードを共有します)

<内容>

・LINE チャットボットを作成する

・自動返信機能を追加する

・一斉送信機能を追加する

 

▼ LINE Messaging API

https://developers.line.biz/ja/services/messaging-api/

▼ LINEボットの画面イメージ

LINEボットの画面イメージ

 

■授業中に書かれたソースコード

// LINE developers のTOKEN
// https://developers.line.biz/
var ACCESS_TOKEN = '*********'; // ここにACCESS_TOKENを入れる
var sheet = SpreadsheetApp.getActive().getSheetByName('Line')

/* *************** 
00: 基本
*************** */

// POSTアクセスが来た場合の処理 (今回はBOTに何かしらのアクションをされた場合が該当)
function doPost(e) {
  // イベント(ユーザーからの何かしらのアクション)
  var event = JSON.parse(e.postData.contents).events[0]

  // イベントから主要な要素を抽出
  var eventType = event.type
  var userId = event.source.userId
  
  /* 1. 友達登録の場合 → ユーザーデータを保存 */
  if (eventType == 'follow'){ 
    stockUserData(userId)
  }
  /* 2. メッセージ受信の場合 → 応答メッセージを返す */
  else {
    var replyToken = event.replyToken; 
    var userMessage = event.message.text;
    replyLine(replyToken, userMessage)
  }
}

/* *************** 
10: 返信系(Reply)
*************** */

// Lineに「返信」する
function replyLine(replyToken, userMessage){
  /* 返答メッセージを生成する */
  var dictionary = sheet.getRange("A6:B100").getValues();
  var message = ""
// userMessage = スクーのミッションは?
// dictionary[i][0] = "ミッション"
  // 辞書から「キーワード」を検索
  for(var i=0; i < dictionary.length; i++){
    if(userMessage.match(dictionary[i][0])) message = dictionary[i][1]
    if(message != "") break
  }

  // 辞書にあてはまるものがなければ、相槌を打つ
  if (message == ""){
    message = userMessage + "だってにゃ? それはいいにゃ〜!" 
  }  
  
  // 「応答」メッセージ用のAPI URL
  var url = 'https://api.line.me/v2/bot/message/reply';
  UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': [{
        'type': 'text',
        'text': message,
      }],
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
/* *************** 
20: 送信系(Push) 
*************** */

// 「Line」シートの「A2」のテキストを、全員に送信する
function sendStaticMessageToAll(){
  var message = sheet.getRange("A2").getValue();  
  sendMessageToAll(message)
}

// 登録されている人全員に送信する
function sendMessageToAll(message) {

  // userIdをすべて取得する
  var sheet = SpreadsheetApp.getActive().getSheetByName('LineUsers')
  var userIdsArray = sheet.getRange(2, 4, sheet.getLastRow() - 1, 1) // D2:Dx
  var userIds = userIdsArray.getValues() // [['aaaaa'],['bbbbb'],['ccccc']]

  // 各userIdに対してメッセージを送信していく
  for(var i = 0; i < userIds.length; i++) {
    userId = userIds[i][0]
    pushLine(message, userId)
  }
}

// Lineに「投稿」する
function pushLine(message, user_id){
  // メッセージ「送信」用のAPI URL
  var url = 'https://api.line.me/v2/bot/message/push';
  UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'to': user_id,
      'messages': [{
        'type': 'text',
        'text': message,
      }],
    }),
  });
}

/* *************** 
30: その他の関数
*************** */

/* Line系 */
// ユーザーの情報をLineAPIで取得し、SpreadSheetに保存する
function stockUserData(userId){

  var url = 'https://api.line.me/v2/bot/profile/' + userId;
  var response = UrlFetchApp.fetch(url,{
    'headers': {
      'Authorization' :  'Bearer ' + ACCESS_TOKEN,
    }
  })
  var userData = JSON.parse(response)
  
  // APIから得られた情報から、要素を抽出
  var name          = userData.displayName
  var pictureUrl    = userData.pictureUrl
  var statusMessage = userData.statusMessage

  // シートに出力する  
  var sheet = SpreadsheetApp.getActive().getSheetByName('LineUsers')
  var range = sheet.getRange(sheet.getLastRow() + 1, 2, 1, 3) // Bx:Dx
  range.setValues([[name, pictureUrl, userId]])
}