teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1498閲覧

GASのエラーについて

enjinia_shoshin

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

1グッド

2クリップ

投稿2024/05/15 08:05

編集2024/05/15 08:45

1

2

実現したいこと

各スペースに本日の出欠席者をスプレッドシートに記入して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に実現したい内容を伝え、コードを組んでもらっているため詳しくは調べないとわからない。再度新規でコードを組んでもらい何度か試しているがうまくいかず。

補足

特になし

TN8001😄を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2024/05/15 08:17 編集

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)
enjinia_shoshin

2024/05/15 08:23

コメントありがとうございます。大変失礼いたしました、タグを修正します。
TN8001

2024/05/15 08:24

対応ありがとうございます^^
YAmaGNZ

2024/05/15 09:47

UrlFetchApp.fetchを実行するタイミングでwebhookUrlは正しいURLが入っているのですか?
enjinia_shoshin

2024/05/15 10:48

はい。載せているURLはダミーです。
YAmaGNZ

2024/05/15 11:54

UrlFetchApp.fetchの直前で確認しましたか? var testurl = ''; UrlFetchApp.fetch(testurl); と実行すると同じエラーが発生します。
YellowGreen

2024/05/15 23:30

// ログに出力してデバッグ情報を確認 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に何らかのエラーの原因が含まれている可能性が高いのですが、 不要な空白、全角文字、ドットとカンマ、コロンとセミコロンなど コピペ以外で設定していませんか。
enjinia_shoshin

2024/05/16 04:30

Logger.log('Webhook URL: ' + webhookUrl); 上記についてchatGPTに意味を聞いたところ、新たにコードが出来て無事にコードが起動できました。 この質問が無ければ一向に改善しなかったと思います。 助かりました。ありがとうございます。
enjinia_shoshin

2024/05/16 04:38

YellowGreenさまからの質問がなかったらずっと悩んでて一向に解決できませんでした。感謝です。
guest

回答1

0

自己解決

Logger.log('Webhook URL: ' + webhookUrl)
Webhook URLには、こちらでURLを入力する必要があるのかとchatGPTに質問し、
いろいろ投げかけた結果、以下のコードで解決。

// Webhook URLを保持するオブジェクト
var webhookUrls = {
'ROOM1': 'https://chat.googleapis.com/v1/spaces/AAAA',
'ROOM2': 'https://chat.googleapis.com/v1/spaces/',
// 他の部屋と対応するWebhook URLをここに追加
};

// 部屋に対応するWebhook URLを取得する関数
function getWebhookUrl(room) {
return webhookUrls[room];
}

// 通知送信を促す関数
function sendNotificationPrompt() {
var response = Browser.msgBox('通知しますか?', Browser.Buttons.YES_NO);

if (response == 'yes') {
sendAttendanceNotification();
Browser.msgBox('通知しました');
} else {
Browser.msgBox('通知しませんでした');
}
}

// 出席通知を送信する関数
function sendAttendanceNotification() {
try {
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/sharing');
var sheet = spreadsheet.getActiveSheet(); // シート名を取得
var data = sheet.getRange("A2:E100").getValues(); // A2からE100の範囲を取得

var attendees = {}; var absentees = {}; data.forEach(function(row) { var name = row[0]; var status = row[1]; var remarks = row[2]; var room = row[3]; if (status === "出席") { if (!attendees[room]) { attendees[room] = []; } attendees[room].push(name + (remarks ? " (" + remarks + ")" : "")); } else if (status === "欠席") { if (!absentees[room]) { absentees[room] = []; } absentees[room].push(name + (remarks ? " (" + remarks + ")" : "")); } }); var today = new Date(); var dateString = Utilities.formatDate(today, Session.getScriptTimeZone(), 'yyyy/MM/dd'); Object.keys(webhookUrls).forEach(function(room) { var webhookUrl = getWebhookUrl(room); // 適切なWebhook URLを取得 var message = "今日(" + dateString + ")の【" + room + "】出欠席者\n\n"; message += "<出席>\n"; message += attendees[room] ? attendees[room].join('\n') : 'なし'; message += "\n\n"; message += "<欠席>\n"; message += absentees[room] ? absentees[room].join('\n') : 'なし'; message += "\n\n"; message += "スプレッドシート:" + spreadsheet.getUrl(); if (!webhookUrl) { Logger.log('Invalid room: ' + room); return; } var payload = { 'text': message }; var options = { 'method': 'post', 'contentType': 'application/json', 'payload': JSON.stringify(payload) }; // Webhookにデータを送信 var response = UrlFetchApp.fetch(webhookUrl, options); // レスポンスをログに出力 Logger.log(response.getContentText()); });

} catch (error) {
Logger.log('Error sending message: ' + error.message);
}
}

投稿2024/05/16 04:38

enjinia_shoshin

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問