実現したいこと
表題の件ですが、Gooleカレンダーのイベントで変更、追加、削除が行われた場合、特定のアカウントSlackに通知するという仕組みです。
発生している問題・分からないこと
https://www.yukibnb.com/entry/slack_incoming_webhook_url
現在、上記のサイトを参考に「Incoming Webhook URL」を取得して特定のアカウントに紐づけて、
例えばSlackのPCやスマホアプリが入っていたら通知がくる仕組みのはずですが、
グーグルカレンダーで何か変更等があれば、通知できるのですが1点問題があります。
・1回の変更だけで2件通知が着てしまう
通知はできていますが、挙動や表示のされ方がおかしいという事です。
こちらのご教示のほど宜しくお願い致します。
エラーメッセージ
error
1エラーメッセージはありません。
該当のソースコード
1function monitorAllCalendars(e) { 2 console.log(e.triggerUid); 3 4 try { 5 var calendarIds = getAllCalendarIds(); 6 var lastUpdated = PropertiesService.getScriptProperties().getProperty('lastUpdated'); 7 var currentTime = new Date(); 8 var notifiedEvents = getNotifiedEvents() || []; 9 10 var today = new Date(); 11 today.setHours(0, 0, 0, 0); 12 13 var twoDateLater = new Date(today); 14 twoDateLater.setDate(today.getDate() + 7); // 1週間後の日付を取得 15 twoDateLater.setHours(0, 0, 0, 0); // 時刻をリセットして日付のみにする 16 17 for (var i = 0; i < calendarIds.length; i++) { 18 var calendarId = calendarIds[i]; 19 var startDateTime = today; 20 var endDateTime = twoDateLater; 21 22 var events = CalendarApp.getCalendarById(calendarId).getEvents(startDateTime, endDateTime); 23 24 if (events && events.length > 0) { 25 for (var j = 0; j < events.length; j++) { 26 var event = events[j]; 27 var eventId = event.getId(); 28 var lastUpdatedTime = event.getLastUpdated(); 29 30 // イベントのリンクを生成 31 var calendarLink = 'https://calendar.google.com/calendar/render?action=VIEW&eid=' + eventId; 32 33 // すでに通知されたイベントでないか、最後の通知時間以降のイベントかを確認 34 if (lastUpdatedTime > new Date(lastUpdated)) { 35 var title = event.getTitle(); 36 if (!title) { 37 title = 'タイトルが設定されていません'; 38 Logger.log('イベントのタイトルがありませんでした。'); 39 } 40 41 var startTime = event.getStartTime() ? formatDate(event.getStartTime()) : '開始日時が設定されていません'; 42 var endTime = event.getEndTime() ? formatDate(event.getEndTime()) : '終了日時が設定されていません'; 43 var description = event.getDescription() || '詳細が設定されていません'; 44 var location = event.getLocation() || '場所が設定されていません'; 45 46 // イベントのIDが通知済みリストに含まれているかを確認 47 //if (!notifiedEvents.includes(eventId)) { 48 // 通知されていない場合のみ通知を送信 49 var eventDetails = { 50 title: title, 51 startTime: startTime, 52 endTime: endTime, 53 description: description, 54 location: location, 55 url: calendarLink, 56 triggerUid: "your_trigger_uid_here", 57 authMode: "your_auth_mode_here", 58 calendarId: calendarId 59 }; 60 61 sendSlackNotification(eventDetails); 62 63 // 通知されたイベントを記録 64 notifiedEvents.push(eventId); 65 //} 66 } 67 } 68 } 69 } 70 71 // 通知されたイベントと最後の通知時間を保存 72 PropertiesService.getScriptProperties().setProperty('notifiedEvents', notifiedEvents.join(',')); 73 PropertiesService.getScriptProperties().setProperty('lastUpdated', currentTime.toISOString()); 74 } catch (error) { 75 Logger.log('エラーが発生しました: ' + error); 76 } 77} 78 79// 日付を指定された形式に整形する関数 80function formatDate(date) { 81 var year = date.getFullYear(); 82 var month = ('0' + (date.getMonth() + 1)).slice(-2); 83 var day = ('0' + date.getDate()).slice(-2); 84 var hours = ('0' + date.getHours()).slice(-2); 85 var minutes = ('0' + date.getMinutes()).slice(-2); 86 return year + '/' + month + '/' + day + ' ' + hours + ':' + minutes; 87} 88 89 90function getNotifiedEvents() { 91 var notifiedEvents = PropertiesService.getScriptProperties().getProperty('notifiedEvents'); 92 return notifiedEvents ? notifiedEvents.split(',') : []; 93} 94 95function getAllCalendarIds() { 96 var calendars = CalendarApp.getAllCalendars(); 97 var calendarIds = []; 98 for (var i = 0; i < calendars.length; i++) { 99 var calendar = calendars[i]; 100 calendarIds.push(calendar.getId()); 101 } 102 return calendarIds; 103} 104 105function sendSlackNotification(eventDetails) { 106var webhookUrl = 'SlackのIncoming WebhookのWebhook URLを入力'; 107 var message = { 108 text: 'Googleカレンダーのイベントが更新されました。\n' + 109 'タイトル: ' + eventDetails.title + '\n' + 110 '開始日時: ' + eventDetails.startTime + '\n' + 111 '終了日時: ' + eventDetails.endTime + '\n' + 112 '詳細: ' + eventDetails.description + '\n' + 113 '場所: ' + eventDetails.location + '\n' + 114 'URL: ' + eventDetails.url, 115 }; 116 117 var options = { 118 method: 'post', 119 contentType: 'application/json', 120 payload: JSON.stringify(message) 121 }; 122 123 UrlFetchApp.fetch(webhookUrl, options); 124} 125 126 127
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
コンソールデバックで調べても特にエラーなことはありませんでした。
またGoogle App Scriptを利用することでトリガーというものも設定しています。
そちらは今回3つの関数で制御していましたが、1つトリガーに登録しています。
この状態でイベント更新があると複数の通知が着てしまいます。
この複数通知とは2通ずつ遅れながら3回ずつ送られます、その合計が6通の通知となります。
ゴールは1通だけでよいです。
補足
今回はAGSでコードを集約して書いています。
その中で以下の記述はWebhookのWebhook URLが入ります。
今回は伏せて置いています。
var webhookUrl = 'SlackのIncoming WebhookのWebhook URLを入力';
急ぎの案件ではありますので
どなたかご教示いただけたらと思います。
回答1件
あなたの回答
tips
プレビュー