実現したいこと
各スペースに本日の出欠席者をスプレッドシートに記入してGASを使い、Googleチャットのスペースに表示させたい。
発生している問題・分からないこと
コード実行すると、URLが見当たらないとエラーが発生し先に進めない。
エラーメッセージ
error
1Exception: Attribute provided with no value: url 2(匿名) @ スクリプト.gs:103 3sendAttendanceNotification @ スクリプト.gs:67 4 5Exception: Attribute provided with no value: url 6 at [unknown function](スクリプト:103:34) 7 at sendAttendanceNotification(スクリプト:67:11)
該当のソースコード
var notificationSent = false; // 通知が送信されたかどうかを追跡する変数 function sendNotificationPrompt() { if (notificationSent) { Browser.msgBox('既に通知が送信されました'); return; // 通知が既に送信されている場合は何もしない } var response = Browser.msgBox('通知しますか?', Browser.Buttons.YES_NO); if (response == 'yes') { sendAttendanceNotification(); notificationSent = true; // 通知が送信されたことを記録 Browser.msgBox('通知しました'); } else { Browser.msgBox('通知しませんでした'); } } function sendAttendanceNotification() { try { // スプレッドシートを開く var spreadsheet = SpreadsheetApp.openByUrl('URL'); var sheet = spreadsheet.getSheets()[0]; // 最初のシートを取得 var sheetName = sheet.getName(); // シート名を取得 var data = sheet.getRange("A2:E100").getValues(); // E2からE100の範囲を取得 var today = new Date(); var dateString = Utilities.formatDate(today, Session.getScriptTimeZone(), 'yyyy/MM/dd'); // 日付をフォーマット // 出席者と欠席者を格納するためのオブジェクトを作成 var attendees = {}; var absentees = {}; data.forEach(function(row) { var name = row[0]; // A列の名前 var status = row[1]; // B列の出席ステータス var remarks = row[2]; // C列の備考 var destination = row[3]; // D列の通知先スペース名 if (!destination) { return; // 行が空の場合はスキップ } var message = name; if (remarks !== "") { message += "(" + remarks + ")"; } if (status === "出席") { if (!attendees[destination]) { attendees[destination] = []; } attendees[destination].push(message); } else { if (!absentees[destination]) { absentees[destination] = []; } absentees[destination].push(message); } }); // 通知を送信 var rooms = Object.keys(attendees).concat(Object.keys(absentees)).filter(function(value, index, self) { return self.indexOf(value) === index; }); rooms.forEach(function(room) { var message = "今日(" + dateString + ")の【" + sheetName + "】出欠者\n"; // 出席者のリストを作成 message += '\n<出席>\n'; if (attendees[room] && attendees[room].length > 0) { message += attendees[room].join('\n') + '\n\n'; } else { message += 'なし\n\n'; } // 欠席者のリストを作成 message += '\n<欠席>\n'; if (absentees[room] && absentees[room].length > 0) { message += absentees[room].join('\n') + '\n\n'; } else { message += 'なし\n\n'; } var payload = { 'text': message + '\nスプレッドシート:' + spreadsheet.getUrl() }; var webhookUrl = getWebhookUrl(room); // 適切なWebhook URLを取得 // ログに出力してデバッグ情報を確認 Logger.log('Sending to room: ' + room); Logger.log('Message: ' + payload.text); Logger.log('Webhook URL: ' + webhookUrl); var options = { 'method': 'post', 'contentType': 'application/json', 'payload': JSON.stringify(payload) }; var response = UrlFetchApp.fetch(webhookUrl, options); Logger.log('Response: ' + response.getContentText()); }); } catch (e) { Logger.log('Error: ' + e.toString()); throw e; } } // チャットルームごとのWebhook URLを取得する関数 function getWebhookUrl(room) { var webhookUrls = { '朝チーム': 'https:Hs', '夜チーム': 'https://chat.' }; var webhookUrl = webhookUrls[room]; Logger.log('Webhook URL for room ' + room + ': ' + webhookUrl); return webhookUrl; }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
主に上記コードはchatGPTに実現したい内容を伝え、コードを組んでもらっているため詳しくは調べないとわからない。再度新規でコードを組んでもらい何度か試しているがうまくいかず。
補足
特になし
JavaとJavaScriptは全く別の言語です。
「Java」タグは外してください。
「Google Apps Script」・「Google スプレッドシート」タグを付けてください。
[タグ一覧|Google Apps Script](https://teratail.com/tags/Google%20Apps%20Script)
[タグ一覧|Google スプレッドシート](https://teratail.com/tags/Google%20%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88)
コメントありがとうございます。大変失礼いたしました、タグを修正します。
対応ありがとうございます^^
UrlFetchApp.fetchを実行するタイミングでwebhookUrlは正しいURLが入っているのですか?
はい。載せているURLはダミーです。
UrlFetchApp.fetchの直前で確認しましたか?
var testurl = '';
UrlFetchApp.fetch(testurl);
と実行すると同じエラーが発生します。
// ログに出力してデバッグ情報を確認
Logger.log('Sending to room: ' + room);
Logger.log('Message: ' + payload.text);
Logger.log('Webhook URL: ' + webhookUrl);
のログの値は、どのようになっていますか?
Webhook URL: http://xxxxxxxxxxxxxxxxxxx
の値が
// チャットルームごとのWebhook URLを取得する関数
function getWebhookUrl(room) {
var webhookUrls = {
'朝チーム': 'https:Hs',
'夜チーム': 'https://chat.'
};
で設定したURLのどちらかのチームのURLと一致しているのであれば、
その設定したURLに何らかのエラーの原因が含まれている可能性が高いのですが、
不要な空白、全角文字、ドットとカンマ、コロンとセミコロンなど
コピペ以外で設定していませんか。
Logger.log('Webhook URL: ' + webhookUrl);
上記についてchatGPTに意味を聞いたところ、新たにコードが出来て無事にコードが起動できました。
この質問が無ければ一向に改善しなかったと思います。
助かりました。ありがとうございます。
YellowGreenさまからの質問がなかったらずっと悩んでて一向に解決できませんでした。感謝です。

回答1件
あなたの回答
tips
プレビュー