はじめに
アドベントカレンダー5日目、担当は、桃山です。
昨日は、岡田さんのpaiza就活についての記事でした!私はpaiza就活はやっていなかったのですが、paizaやLeetCodeをテスト対策で解いていたのを思い出しました。就活頑張ってください📣!
アドベントカレンダーは2年目!あっという間の1年でした。
残る12月と、春休み、学生生活を謳歌しようと思います!
作るもの
今日のアドベントカレンダーでは、私の使っている便利な機能を紹介したいと思います。
カレンダーに入っている共有したい予定を、GASとLINE notifyを用いて、グループLINEに毎日通知するものです!
コードもシステムの機能も簡単ではあるので、宮治研究室の人には物足りない可能性はありますが、だからこそ便利なのでぜひやってほしい!と思い記事にさせていだきます。
※ちなみに、共有カレンダーにTimeTreeを使っていたのですが、APIが2023年12月22日(金)でサービス終了になってしまうみたいです( ; ; )
今回は急遽Googleカレンダーから取ってくることにしました。便利な共有カレンダーアプリがあれば教えてください。
システム構成
システム構成はこのようになっています
- Google App Scriptが毎日決まった時間に作動する
- カレンダーから当日の予定を取得する
- 予定をLINE Notifyに送信
- LINEグループで予定が見れる
実装
カレンダーの設定
今回は、急遽Googleカレンダーに変更したため、私1人の予定をラインに転送する実装になっています。
実際に家族・友達で使う場合はファミリーカレンダーを使ったり、カレンダーを共有してもらう作業が必要になります!
LINE notifyの設定
-
上記のページから、LINEアプリで登録しているメールアドレスとパスワードでログインする
ログインが完了し、LINE Notifyから通知が来ていればLINE Notifyとの連携は完了 -
マイページからアクセストークンの発行(開発者向け)のトークンを発行するをクリックし、連携したいグループを選択する
(今回は家族のラインに共有という想定ですが、個人のチャットに転送してリマインダーとしても活用可能です) -
トークンがコピーできる画面が表示されるので、トークンをコピーして保持しておく
-
LINE上でLINE Notifyの公式アカウントを友達追加し、送りたいトークルーム・グループなどに招待しておく
GAS
コード
// 1.メインの処理(ここで他の関数を呼び出し)
function notifyTodayEvents() {
const events = getCalendar()
console.log(events)
var message = "今日のはなこの予定\n\n" + createMessage(events);//はなこにしていますが、自由にタイトルを変えてください
console.log(message)
sendMessageToLine(message);
}
// 日付の表示形式を変える関数(2のカレンダーで使用)
function formatDate(inputDate) {
const options = {
month: '2-digit',
day: '2-digit',
weekday: 'short',
hour: '2-digit',
minute: '2-digit',
hour12: false,
timeZone: 'Asia/Tokyo',
};
const formattedDate = new Date(inputDate).toLocaleString('ja-JP', options);
return formattedDate.replace(/,/g, '');
}
// 2.カレンダーの情報取得
function getCalendar() {
var myCalendar = CalendarApp.getCalendarById("**************");//カレンダーidはGoogleのマイカレンダーの設定から確認可能
// var motherCalender = CalendarApp.getCalendarById("");// 他の人のカレンダーを追加すれば、その予定も送信可能
// 今日の日付
var today = new Date();
today.setHours(0, 0, 0, 0);
// 明日の日付
var tomorrow = new Date(today);
tomorrow.setDate(today.getDate() + 1);
//今日のイベントを取得
var myEvents = myCalendar.getEvents(today, tomorrow);
var Events = [];
for (var i = 0; i < myEvents.length; i++) {
var event = myEvents[i];
//今回はイベントタイトル、時間を取得(他の情報も追加すれば取得することができます)
var eventData = {
title: event.getTitle(),
startTime: event.getStartTime(),
endTime: event.getEndTime(),
name: "はなこ",//複数のカレンダーを追加する場合、名前を入れるとわかりやすいです
};
console.log(eventData)
Events.push(eventData);
}
return Events;
}
//3.メッセージの作成
function createMessage(events) {
var message = '';
var eventsSize = events.length;
//予定がない場合のメッセージ
if (eventsSize === 0) {
return message += "今日は予定がないよ";
}
events.forEach(function(event, index) {
console.log("event",event)
let title = event.title;
let startDate = formatDate(event.startTime);
let endDate = formatDate(event.endTime);
let name = event.name;
message +="名前:" + name +"\n予定:"+ title+"\n" + startDate + ' - ' + endDate ;
if (index < eventsSize - 1) message += "\n\n";
});
return message;
}
// 4.LINE Notifyにメッセージを送信
function sendMessageToLine(message) {
var url = 'https://notify-api.line.me/api/notify';
var payload = "message=" + message;
lineNotifyAPI(url, 'post', payload);
}
function lineNotifyAPI(url, method, payload){
var accessToken = "*******************";//ここにLineで発行したトークンを入れる
var headers = {
'Authorization': 'Bearer '+ accessToken
};
var options = {
"method": method,
"headers": headers,
"payload": payload
};
return UrlFetchApp.fetch(url, options);
}
トリガーの設定
- Gasのメニューからトリガーページに移動
- トリガーを通知してほしい時間に設定する
1日1回6時から7時の間に通知するように設定しました
実際のLINE
このように通知が来ます!
まとめ
このシステムのおかげで予定の共有が便利になりました。
私はLINE Notifyを用いて、大事なメールもLINEに転送しています。
自分が困っていることなどに合わせてぜひ実装してみてください!(ChatGPTを使えばある程度の変更は対応してくれるはずです)
今年ももう少しですが、よろしくお願いします!みんなで忘年会したいですね