見出し画像

GoogleカレンダーとSlackを連携させて自動的にステータスを更新する

こんにちは AIサークル若宮です。最近はGPT-4をコーディングに活用し出してから能率が100倍に上がっています。NOTEもAIツールが導入されてAIサークルももっと頑張らないとなと思った次第です。

最近一つ悩みがありまして、ズバリ「AIサークルの活動場所が分からない」という質問が多くくる事。そんな問題も解決したく、自分のSlackのステータスに活動場所を書けばいいじゃ無いかと考えました。

ただ書くだけででも面白くありませんので、今回はGoogleカレンダーの予定から、その時の居場所を確認して、Slackのステータス画面に表示するための機能を作成しました。

AIに関する記事じゃなくてごめんなさい

実装内容

今回実装していく内容のフローとしては

  1. SlackBotを作成(今回は割愛)

  2. GASで処理

    1. Googleカレンダーの、event内のLocationを収集

    2. 講義のある日は、予定がはいていなくても学内にいる事にする

    3. Location内の文字列から、ステータスのスタンプを決定

    4. Slackのステータス投稿

ソースコード

function main() {
	const calendarID = "Google CalendarのcalendarID";
	var dateTime = new Date();
	var status;

	var events = CalendarApp.getCalendarById(calendarID).getEventsForDay(dateTime);
	var lectureExists = doesLectureExist(events);

	if (events.length == 0) {
		status = JSON.stringify({
			"profile": {
				"status_text": "",
				"status_emoji": ""
			}
		});
	} else {
		for (var i in events) {
			if (events[i].getStartTime() <= dateTime && events[i].getEndTime() >= dateTime) {
				status = identifyStatus(events[i]);
				break;
			} else {
				if (lectureExists && isWithinTimeFrame(dateTime)) {
					status = JSON.stringify({
						"profile": {
							"status_text": "学内で暇してる",
							"status_emoji": ":office:"
						}
					});
				} else {
					status = JSON.stringify({
						"profile": {
							"status_text": "",
							"status_emoji": ""
						}
					});
				}
			}
		}
	}

	postStatus(status);
}

function doesLectureExist(events) {
	for (var i in events) {
		if (events[i].getLocation().includes("講義")) {
			return true;
		}
	}
	return false;
}

function isWithinTimeFrame(dateTime) {
	var startHour = 9;
	var endHour = 21;
	var currentHour = dateTime.getHours();
	return currentHour >= startHour && currentHour <= endHour;
}

function identifyStatus(event) {
	var event_location = event.getLocation();
	var status = JSON.stringify({
		"profile": {
			"status_text": event_location,
			"status_emoji": determineEmoji(event_location)
		}
	});

	return status;
}
function identifyStatus(event) {
	var event_location = event.getLocation();

	var status = JSON.stringify({
		"profile": {
			"status_text": event_location,
			"status_emoji": determineEmoji(event_location)
		}
	});

	return status;
}

function determineEmoji(event_location) {
	// 予定の場所に応じて絵文字を決定
	if (event_location.includes("講義")) {
		return ":講義中:";
	} else if (event_location.includes("会議")) {
		return ":会議中:";
  } else if (event_location.includes("HUB")) {
		return ":hubなう:";
  } else if (event_location.includes("落合ラボ")) {
		return ":lab2:";
	} else {
		return ":どうして夜中に顔:";
	}
}

function postStatus(status) {
	const URL = "https://slack.com/api/users.profile.set";
	const TOKEN = "OAuthトークン";

	const headers = {
		"Authorization" : "Bearer " + TOKEN,
		"Content-Type": "application/json; charset=utf-8"
	};

	var post_data = {
		"headers": headers,
		"method": "POST",
		"payload": status
	};

	return UrlFetchApp.fetch(URL, post_data);
}

コードについて

その日に講義があるかチェック

doesLectureExist関数では、取得したイベントの中に"講義"が含まれているかどうかをチェックします。他に応用すれば、”会議室”が含まれている日は、”オフィス”をステータスに表示して、無い日は”リモート”にしたりなど活用できそうですね。

その下のisWithinTimeFrame関数では、現在の時間が特定の時間枠内(この場合は9時から21時)にあるかどうかを確認します。

ステータスの特定

identifyStatus関数では、予定の場所にに基づいてステータスを特定します。ここで収集した場所をそのままSlackのステータス画面に表示します。

絵文字の決定

determineEmoji関数では、イベントの場所に基づいて絵文字を決定します。一番下にある「落合ラボ」というのがAIサークルの活動場所です。この辺も色々いじってみても楽しいかもしれません。

コードの運用

上記のJavaScriptコードをGoogle Apps Scriptで運用しています。トリガーは私は5分に一度で設定しますがもう少しスパンは短くていいかもしれません。

参考文献

今回の記事作成にあたっては、以下の記事を参考にしました。

GASを使ってGoogleカレンダーの内容をSlackステータスに反映する


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?