【GAS】1日のGoogleカレンダーの予定を毎朝LINEに通知させる方法

今回は毎日のGoogleカレンダーの予定をLINEに通知する方法を紹介したいと思います。IFTTTを使ってサクッとGoogleカレンダーとLINE連携してできるかと思ったけど、Googleカレンダーのトリガーに良い感じのがないんですよね。IFTTTについて知りたかったら以下の記事を参考にしてみるといいです。

IFTTTでは良い感じにできないので、GoogleAppsScriptを使ってGoogleカレンダーの予定をLINEに通知させたいと思います。

Googleカレンダーの予定をLINEに通知させる手順

GoogleAppsScriptを書いていくわけなんだけど、その際の手順としては以下の感じです。

  1. 今日のGoogleカレンダーの予定を取得する
  2. 取得した予定をLINEに通知

文字で書くとシンプルですね。これをGoogleAppsScriptで記述していきます。ちなみのGoogleAppsScriptは使い方によっては結構便利だから、気になったら参考にしてみてください。

GoogleAppsScriptでカレンダーの予定を取得する

GoogleAppsScriptにアクセスして、新しいプロジェクトを作成しましょう。

新しいプロジェクトを開いたら、myFunction()っていうのが最初は定義されているけど、シカトして自分で書いていきます。

Googleカレンダーの今日の予定を取得する

まずは、Googleカレンダーに入っている今日の予定を取得するコードを書きます。

const getCalendars = () => {
 return CalendarApp.getAllCalendars() 
}

const formatJST = (date) => {
  return Utilities.formatDate(date, 'JST', 'HH:mm');
}

const getSchedules = (calendars, date) => {
  schedules = [];
  
  calendars.forEach(cal => {
    const events = cal.getEventsForDay(date);
    if (events.length < 1) {return}
  
    events.forEach(event => {  
      schedules.push({
        title: event.getTitle(),
        startTime: formatJST(event.getStartTime()),
        endTime: formatJST(event.getEndTime())
      })
    })
  })

  return schedules;
}

const createMessage = (schedules) => {
  messages = "\n";
  
  if (schedules.length < 1) {
    messages += "今日の予定はありません。"
  } else {
    schedules.forEach(schedule => {
      messages += "●" + schedule.title + " " + schedule.startTime + "~" + schedule.endTime + "\n";
    })
  }

  return messages
}


function main() {
 const calendar = getCalendars();
 const todaysSchedules = getSchedules(calendar, new Date());
 const messages = createMessage(todaysSchedules);
 Logger.log(messages)
}

予定のタイトルと開始時間、終了時間を取得してテキストを作っています。ログで出してみるとこんな感じですね。LINEにはこんな感じで送るイメージ。ちなみにログは[表示]→[ログ]でみる事ができるよ。

何も予定を入れないとこんな感じですね。

LINEにGoogleカレンダーの予定を通知する

Googleカレンダーから今日の予定は取得する事ができたので、次はそれをLINEに通知するようにしたいですよね。LINEに通知するにはLINENotifyというアカウントが必要なので、それを使えるようにします。LINE Notifyにアクセスしてログインします。

右上からマイページに進んで[トークンを発行する]をクリック。

トークン名を記入してくださいってあるけど、名前はなんでもいいです。

[発行する]をクリックしてトークンを発行しましょう。

トークンはGoogleAppsScriptで使うので、コピーしておいてください。コピーしたらGoogleAppleScriptに戻ってLINEに通知するコードを書きましょう。

const sendToLine = (messages) =>{
  const token = "取得したトークン";
  const options =
   {
     "method"  : "post",
     "headers" : {"Authorization" : "Bearer "+ token},
     "payload" : "message=" + messages

   };
 
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

function main() {
 const calendar = getCalendars();
 const todaysSchedules = getSchedules(calendar);
 const messages = createMessage(todaysSchedules);
 sendToLine(messages);
}

"取得したトークン"の部分にLINENotifyから取得したトークンを貼り付けます。プログラムを実行するとこんな感じです。

予定がある場合は予定を、予定がない場合は「予定がありません。」と送られてきます。

毎朝予定が通知されるようにする

コードは書いたけど、このままでは毎朝その日の予定を通知させるようにはなっていません。GoogleAppsScriptにはトリガーという定期的に実行してくれる機能があるのでそれを使いましょう。[編集]から[現在のプロジェクトのトリガー]と進んで、トリガーを設定します。

[トリガーを追加]をクリックして作成しましょう。実行する関数はmain、日付ベースのタイマーで通知してほしい時刻を選択します。

保存したら画面に保存した内容が表示されます。

1つ難点なのが、ぴったりこの時刻に実行するっていうのができないところなんですよね。ボタンぽちぽちするだけで環境構築もデプロイも面倒なことはないからかなり便利なんだけど、そこデフォルトでどうにかして欲しかった・・・

時間ぴったりに通知を送る

いや、それでも時間ぴったりに関数を実行して通知してほしいと思うじゃないですか。何やらコードでいじることもできなくはなさそうなので、やってみます。使うのはGoogleAppsScriptのnewTriggerという関数。実行したら新しいトリガーを作ってくれるみたいですね。新しくnewTriggerを使った関数を作ります。

const setTrigger = () => {
  const date = new Date()
  date.setDate(date.getDate() + 1)
  date.setHours(09);
  date.setMinutes(00); 
  ScriptApp.newTrigger('main').timeBased().at(date).create();  
}

・・・

function main() {
 setTrigger();
 const calendar = getCalendars();
 const todaysSchedules = getSchedules(calendar, new Date());
 const messages = createMessage(todaysSchedules);
 sendToLine(messages);
}

setHoursとsetMinutesでトリガーの時間を設定しているので、何時に通知させたいかによっていじると良さそうです。関数が実行されることによってトリガーがセットされるみたいなので、実行ボタンを押します。

トップページに戻るとトリガーが追加されていますね。中身を見てみると、コードで指定した時間になっています。

ちょっと面倒だけど、これ便利ですね。コードで日付や時間を変更するだけでトリガーの時間をかなり自由に設定する事ができる。明確にこの時間が良い!っていう場合には使ってみるといいですね。ただ、日付が異なる1回だけのトリガーになって画面に無効の文字だらけになる。。まあしょうがないか。

まとめ

GoogleAppsScriptを使ってLINEにGoogleカレンダーの通知をする事ができるようになりました。Googleカレンダーで全ての予定を管理している人はLINEにその日の予定を通知してくれると結構楽かもしれないですね。よかったら試してみるといいかもしれません。今回書いたコードの全文は載せておきますね。

const setTrigger = () => {
  const date = new Date()
  date.setDate(date.getDate() + 1)
  date.setHours(09);
  date.setMinutes(00); 
  ScriptApp.newTrigger('main').timeBased().at(date).create();  
}

const getCalendars = () => {
 return CalendarApp.getAllCalendars() 
}

const formatJST = (date) => {
  return Utilities.formatDate(date, 'JST', 'HH:mm');
}

const getSchedules = (calendars, date) => {
  schedules = [];

  calendars.forEach(cal => {
    const events = cal.getEventsForDay(date);
    if (events.length < 1) {return}
  
    events.forEach(event => {  
      schedules.push({
        title: event.getTitle(),
        startTime: formatJST(event.getStartTime()),
        endTime: formatJST(event.getEndTime())
      })
    })
  })

  return schedules;
}

const createMessage = (schedules) => {
  messages = "\n";
  
  if (schedules.length < 1) {
    messages += "今日の予定はありません。"
  } else {
    schedules.forEach(schedule => {
      messages += "●" + schedule.title + " " + schedule.startTime + "~" + schedule.endTime + "\n";
    })
  }

  return messages
}

const sendToLine = (messages) =>{
  const token = "取得したトークン";
  const options =
   {
     "method"  : "post",
     "headers" : {"Authorization" : "Bearer "+ token},
     "payload" : "message=" + messages

   };
 
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

function main() {
 setTrigger();
 const calendar = getCalendars();
 const todaysSchedules = getSchedules(calendar, new Date());
 const messages = createMessage(todaysSchedules);
 sendToLine(messages);
}

 

Twitterでフォローしよう

おすすめの記事