何度も通知するコードについて

実現したいこと

手動・自動で動かした際に、変更した内容のみの通知がGoogleチャットの指定したスペースにいくようにしたい

発生している問題・分からないこと

GASでChatGPTを元にコードを組んでいる。本来であれば送信スクリプト内のトリガで行うのを手動で行うよう変更したが、変えてない箇所まで通知が行ってしまう

該当のソースコード

var previousData = []; var changes = []; // 初期化関数 function initialize() { var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d'); var sheet = spreadsheet.getSheetByName('出欠席'); previousData = sheet.getRange('A2:D100').getValues(); } // 変更の検出関数 function detectChanges() { var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/'); var sheet = spreadsheet.getSheetByName('出欠席'); var data = sheet.getRange('A2:D100').getValues(); data.forEach(function(row, index) { var name = row[0]; var status = row[1]; var remarks = row[2]; var room = row[3]; var lastUpdate = new Date(); var previousRow = previousData[index] || []; var previousName = previousRow[0] || ''; var previousStatus = previousRow[1] || ''; var previousRemarks = previousRow[2] || ''; var previousRoom = previousRow[3] || ''; if (name !== previousName || status !== previousStatus || remarks !== previousRemarks || room !== previousRoom) { var changeMessage = name + " さんが「" + room + "」で変更を行いました。\n"; if (status !== previousStatus) { changeMessage += "変更前の状況: " + (previousStatus || "空欄") + " ➔ 変更後の状況: " + status + "\n"; } if (remarks !== previousRemarks) { changeMessage += "変更前の備考: " + (previousRemarks || "空欄") + " ➔ 変更後の備考: " + remarks + "\n"; } changeMessage += "変更日時: " + Utilities.formatDate(lastUpdate, Session.getScriptTimeZone(), 'MM-dd HH:mm'); changes.push({ room: room, message: changeMessage }); } }); previousData = data; } // 送信ボタンから手動で通知を行うための関数 function sendNotificationFromButton() { detectChanges(); if (changes.length > 0) { var response = Browser.msgBox('変更内容を通知しますか?', Browser.Buttons.YES_NO); if (response == 'yes') { changes.forEach(function(change) { sendChangeNotification(change.room, change.message); }); Browser.msgBox('変更内容を通知しました'); changes = []; } else { Browser.msgBox('通知をキャンセルしました'); } } else { Browser.msgBox('変更がありません'); } } // 変更通知の送信 function sendChangeNotification(room, changeMessage) { var webhookUrls = { 'ルームA': 'https://chat.googleapis.com/v1/spaces', 'ルームB': 'https://chat.googleapis.com/v1/spaces/AAAArUzE9Y0', }; var webhookUrl = webhookUrls[room]; if (!webhookUrl) { Logger.log('Invalid room: ' + room); return; } var payload = { 'text': changeMessage }; var options = { 'method': 'post', 'contentType': 'application/json', 'payload': JSON.stringify(payload) }; try { var response = UrlFetchApp.fetch(webhookUrl, options); Logger.log('Response from ' + room + ': ' + response.getContentText()); } catch (error) { Logger.log('Error sending message to ' + room + ': ' + error.message); } } function clearAttendanceSheet() { var response = Browser.msgBox('記載内容を消去します。よろしいですか。', Browser.Buttons.YES_NO); if (response == 'yes') { try { var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/'); var sheet = spreadsheet.getSheetByName('出欠席'); var backupSheet = spreadsheet.getSheetByName('バックアップ') || spreadsheet.insertSheet('バックアップ'); var lastRow = sheet.getLastRow(); var range = sheet.getRange('A2:E' + lastRow); var data = range.getValues(); var backupLastRow = backupSheet.getLastRow(); backupSheet.getRange(backupLastRow + 1, 1, data.length, data[0].length).setValues(data); range.clearContent(); Browser.msgBox('シート名「バックアップ」にてバックアップを取り、消去しました'); } catch (error) { Logger.log('Error clearing sheet: ' + error.message); Browser.msgBox('エラーが発生しました: ' + error.message); } } else { Browser.msgBox('操作を中止しました'); } } function setupTriggers() { ScriptApp.newTrigger('sendNotificationFromButton') .timeBased() .atHour(9) .everyDays(1) .create(); ScriptApp.newTrigger('clearAttendanceSheet') .timeBased() .atHour(16) .nearMinute(0) .everyDays(1) .create(); } // 初期化関数を呼び出す function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('カスタムメニュー') .addItem('初期化', 'initialize') .addItem('変更内容を通知', 'sendNotificationFromButton') .addToUi(); }

試したこと・調べたこと

上記の詳細・結果

シート「出欠席」で1~2名記載内容を変更して手動で起動したら
山田大輔 さんが「ルームA」で変更を行いました。
変更前の状況: 空欄 ➔ 変更後の状況: 出席
変更前の送信先: 空欄 ➔ 変更後の送信先: ルームA
変更日時: 05-30 12:08
青空美穂 さんが「ルームA」で変更を行いました。
変更前の状況: 空欄 ➔ 変更後の状況: 出席
変更前の送信先: 空欄 ➔ 変更後の送信先: ルームA
変更日時: 05-30 12:08
上記のように変えたメンバー、変えた箇所だけで良いのに

スプレッドシート出欠席に書いたメンバーが8人いたとしたら.
残りの6人分も何もしていないのに、変更したことになって通知が行くようになっている。

補足

特になし

コメントを投稿

0 コメント