GAS에서 Google 캘린더 삭제 이벤트를 감지하고 LINE 그룹에 알리는 bot를 만들었습니다.
만든 이유
저는 대학원에서 실험계의 연구실에 소속하고 있습니다.
대학내 여러 연구실에서 공동으로 이용하고 있는 실험장치가 있어 반년 전까지는 심야에서도 사용할 수 있었지만 안전관리가 엄격해져 8:00~20:00까지만 사용할 수 있다. 사라졌습니다.
따라서 Google 캘린더에서 관리하는 기기의 예약이 언제나 묻혀있어 일주일에 두 번 정도 밖에 사용할 수 없기 때문에 모두의 실험이 전혀 진행되지 않는 상태였습니다.
이런 식으로 1주일 대부분의 시간이 묻혀 있기 때문에 전혀 실험이 진행되지 않는다. . .
이것을 조금이라도 해결하기 위해 "Google Calendar에서 기기 예약이 삭제되면 실험실 그룹 LINE에 알리는 LINE Bot"을 GAS와 LINE Bot에서 만들었습니다.
요구사항
완성 코드
var scriptProperties = PropertiesService.getScriptProperties();
var nextSyncTokenKey = 'NEXT_SYNC_TOKEN';
function calendarUpdatedSample(e) {
var calendarId = e.calendarId;
// 予定取得時にsyncTokenを指定して差分イベントを取得
var optionalArgs = {
'syncToken': getNextSyncToken(calendarId),
'showDeleted': true
};
var events = Calendar.Events.list(calendarId, optionalArgs);
// 差分イベントを処理
for (var i = 0; i < events.items.length; i++) {
var event = events.items[i];
if (event.status === 'cancelled') {
title = event.summary
start = new Date(event.start.dateTime)
start = start.toLocaleDateString() + ' ' + start.toLocaleTimeString();
end = new Date(event.end.dateTime)
end = end.toLocaleDateString() + ' ' + end.toLocaleTimeString();
time = start.replace('JST', '') + '\n~\n' + end.replace('JST', '')
message = '削除報告\n\n【タイトル】\n' + title + '\n\n【日時】\n' + time
sendLineNotification(message, scriptProperties.getProperty('LINE_GROUP_ID'));
}
}
// 今回処理したイベントを対象外とするためsyncTokenを更新
saveNextSyncToken(events.nextSyncToken);
}
function getNextSyncToken(calendarId) {
// ScriptPropetiesから取得
var nextSyncToken = scriptProperties.getProperty(nextSyncTokenKey);
if (nextSyncToken) {
return nextSyncToken
}
// ScriptPropetiesにない場合は、カレンダーから取得
// 最後の予定を取らないといけないみたいなのでtimeMinを指定
var events = Calendar.Events.list(calendarId, {'timeMin': (new Date()).toISOString()});
nextSyncToken = events.nextSyncToken;
return nextSyncToken;
}
function saveNextSyncToken(nextSyncToken) {
scriptProperties.setProperty(nextSyncTokenKey, nextSyncToken);
}
function sendLineNotification(message, toId) {
var url = 'https://api.line.me/v2/bot/message/push';
var LINE_ACCESS_TOKEN = ScriptProperties.getProperty('LINE_ACCESS_TOKEN');
UrlFetchApp.fetch(url, {
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'to': toId,
'messages': [{
'type': 'text',
'text': message,
'notificationDisabled': false
}],
}),
}
);
}
GAS 사용법
GAS의 기본적인 사용법은 여러가지 기사가 구그면 나오므로 그쪽을 참고로 해 주시는 것으로.
이번에 만든 bot에서 중요한 것은 Google Calendar 삭제 이벤트를 감지하는 기능입니다.
GAS에 Google 캘린더의 이벤트 변경 감지 기능이 구현되었으므로 시도했습니다.
이쪽의 기사에 상세하게 묶여 있었으므로 참고로 했습니다.
이번에는 변경 이벤트는 데리지 않고 삭제 이벤트만 탐지하고 싶었으므로 그 부분만 다시 작성했습니다.
해당 코드는 여기입니다.
if (event.status === 'cancelled') {
var optionalArgs = {
'syncToken': getNextSyncToken(calendarId),
'showDeleted': true
};
이렇게 하면 삭제 이벤트만을 감지하여 대량의 통지가 그룹 라인에 투하되지 않도록 했습니다.
또한 option에
showDeleted: true
를 넣지 않으면 삭제 된 이벤트가 응답에 포함되지 않습니다.LINEbot과의 제휴
LINE bot과의 연계에 관해서도 꽤 기사가 있습니다.
그룹에 메시지를 게시하려면 그룹 ID를 가져와야 하지만 이는 개인 계정에 메시지를 게시하는 것과 거의 다르지 않습니다.
LINE Messaging API에서 groupId를 가져와 Push API로 그룹에 메시지 보내기
실제로 사용해도 어땠습니까?
개인 개발로 사람에게 사용할 수 있는 레벨의 앱을 만들려고 하면, 프런트, 서버 등 여러가지 준비할 필요가 나와 힘듭니다.
GAS와 LINE bot나 slack등을 조합하면, 간편하게 도움이 되는 어플리를 만들 수 있으므로, 숨막히게 실장해 보세요.
Slack에 번역bot 추가
키 관리 시스템을 만들면 칭찬받은 이야기
Hangout Chat에서 에어컨 앙케이트 집계 Bot을 만들면 여러가지 배운 이야기
Reference
이 문제에 관하여(GAS에서 Google 캘린더 삭제 이벤트를 감지하고 LINE 그룹에 알리는 bot를 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hogehoge1234/items/a4ff7a5bb28ed140a90a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)