読者です 読者をやめる 読者になる 読者になる

Level1エンジニア 麻呂の徒然草

平安貴族でもわかる技術のお話

【5分でできる】GoogleAppScript + LINE Notifyで簡易LINE botを作ってみた

最近LINEのデータが吹っ飛んだ、まろです。

LINEって使ってる人が多いので取り敢えず自分も使ってますけど、社内でSlack使うことが多いからか、不便だなぁって思うことが結構あったりします。

そこでLINEで使えるbotを作りました。

こちらの記事 を参考にさせていただきました。

自分もこの記事とよく似た状況で、飲み会の出欠をお願いしても返信がない人がいて、その度に手動でリマインドしてました。
今回はそこを自動でできるようにします。

LINE Notifyのトークン取得

LINE Notify にアクセス

f:id:genbassnohito-maroro0208:20170512221819p:plain 自分のLINEのアカウントでログイン

f:id:genbassnohito-maroro0208:20170512222417p:plain
マイページでトークンを発行します。
トークン名を入力し、グループを選びます。
するとトークンが表示されるので控えておきましょう。
グループにLINE Notifyのアカウントを招待するのも忘れないように

GASで実装

Googleスプレッドシートを開いて、
ツール→スクリプトエディタをクリック。
するとこんな画面が出てきます。ここにコードを書きます。 f:id:genbassnohito-maroro0208:20170512223344p:plain

今回は、Googleカレンダーを参照して、次の日の予定のタイトルと時刻をリマインドするという仕様で進めます。
また、カレンダーには通知するグループに関係のないプライベートな予定もあるので、特定の文字列で始まるイベントのみ通知し、それらのイベントは日を跨ぐことはないものとします。

ざっと実装すると以下のような感じ。

var AuthorizationCode ='Bearer 取得したトークン';
var strBody = '明日の予定をお知らせします。';

// こいつを実行します
function main() {
  var msg = getCalendarEvent();
  Logger.log(msg);
  if(msg !== null) {
    sendHttpPost(msg);
  }
}

// 翌日の日付をYYYY/MM/ddの形式で返す
function nextDate() {
  var MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
  var now = new Date();
  // 今日の日付に24時間足す
  var tomorrow = new Date(now.getTime() + MILLIS_PER_DAY);
  
  return Utilities.formatDate(tomorrow, 'JST', 'YYYY/MM/dd');
}

// Calendarから予定翌日の予定のTitleと時間を取得し、メッセージとして返却する
function getCalendarEvent() {
  var message;
  var targetDate = nextDate();

  // googleCalendarからeventを取得
  var myCals = CalendarApp.getCalendarById('XXXXXXXXXX@gmail.com');
  var myEvents = myCals.getEventsForDay(new Date(targetDate));
  
  // 特定の文字列で始まるeventのみに絞り込む
  var groupEvents = myEvents.filter(function(e) {
    return e.getTitle().indexOf('[グループA]') == 0;
  } );

  // eventがあればメッセージに格納
  if(groupEvents.length > 0) {
      for(var i = 0; i < groupEvents.length; i++) {
        var strTitle = groupEvents[i].getTitle();
        var dispTime = getDispTime(groupEvents[i]);
        
        strBody = strBody + '\n' + strTitle + '\n' + dispTime + '\n'; 
      }
    message = '\n' + strBody;
  } else {
    message = null;
  }
  return message;
}

// 表示時間取得
function getDispTime(event) {
  var start = Utilities.formatDate(event.getStartTime(), 'JST', 'HH:mm');
  var end = Utilities.formatDate(event.getEndTime(), 'JST', 'HH:mm');
  if(start == end) {
    return '終日';
  }
  return start + '-' + end;
}

// LINE NotifyにHTTP POSTでメッセージを送信する
function sendHttpPost(postMassage) {
   var payload = {
     "message": postMassage
   };

   var options = {
     "method" : "post",
     "headers": {
       Authorization: AuthorizationCode,
     },
     "payload" : payload
   };
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
 }

Demo

カレンダーにこんな感じで予定を入れておきます。 f:id:genbassnohito-maroro0208:20170513002903p:plain

スクリプトエディタの方でf:id:genbassnohito-maroro0208:20170516234620p:plainのアイコンを押すとトリガーが設定できます。
今回は時間主導型で午前8~9時にmain関数を実行するように設定。

f:id:genbassnohito-maroro0208:20170516233433j:plain:w300
こんな感じで通知が来ました。

これからの展望

今までは

  1. LINEスケジュールで日程調整&出欠確認
  2. 〆切直前に通知
  3. 調整した日程で店予約
  4. 詳細通知
  5. 直前での変更対応 (全て手動)

としていたのですが、
LINEスケジュールとやりとりするAPI的なものが無さそうなので、

  1. Googleフォームなどで日程調整&出欠確認
  2. 〆切直前に通知(ここまで自動)
  3. 調整した日程で店予約
  4. 詳細通知(ここまで手動)
  5. 未回答、未定の人に再通知(自動)
  6. 直前での変更対応(手動)

みたいな感じにしたい。
GAS使うとGoogleのサービスと簡単にやりとりできて楽ちんですね。