こんにちは!
ラーメン大好きナカジマです。
麵かためで注文が鉄板です。
chatworkで複数ルームに同じ内容を一括で送信したいときありますよね?
1つ1つコピペして、送信するだけだから負担ではないけど、毎回ポチポチするのはめんどくさいな~、と思った人たちへ
スプレッドシートのマクロ的なGAS(Google Apps Script)を使って、簡単に送信できるシステムを、
非エンジニアの素人なわたしでも作成できたので、同じ想いの人の参考になればと思います!!
素人目線でわかりやすいように説明していきますので、最後までご覧ください!

■新規スプレッドシートを作成

スプレッドシート名は任意で問題ないですが、今回は「チャットワーク一括送信」にします。
■拡張機能

スプレッドシート上部のメニュー → 拡張機能 → Apps Script を選択
下記コードをコピペします。
■コード全文
// Chatworkトークンconst CHATWORK_TOKEN = "ここにチャットワークAPIを貼る";// メッセージ入力とルーム設定用シートのシート名const MAIN_SHEET = "シート1";// ルーム一覧の開始列(E列)const ROOM_LIST_START_COLUMN = 5;// 管理用メニューを追加する関数function onOpen() {SpreadsheetApp.getUi().createMenu('GAS').addItem('最新のルーム一覧を読込む', 'getRooms').addItem('メッセージを一斉送信', 'sendBulkMessage').addToUi();}// メッセージを一斉送信する関数function sendBulkMessage() {const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(MAIN_SHEET);const messageCell = sheet.getRange("B2");const message = messageCell.getValue();if (!message) {SpreadsheetApp.getUi().alert('メッセージが入力されていません。B2セルにメッセージを入力してください。');return;}const rooms = getTargetRooms(sheet);if (rooms.length === 0) {SpreadsheetApp.getUi().alert('送信対象のルームがありません。ルーム一覧で送信対象のルームを設定してください。');return;}const ui = SpreadsheetApp.getUi();const roomList = rooms.map(room => `- ${room.name} (ID: ${room.room_id})`).join('\n');const confirmMessage = `以下のメッセージを${rooms.length}個のルームに送信しますか?\n\nメッセージ:\n${message}\n\n送信先ルーム:\n${roomList}`;const response = ui.alert('送信の確認', confirmMessage, ui.ButtonSet.OK_CANCEL);if (response == ui.Button.OK) {sendMultipleMsg(message, rooms);messageCell.clearContent();ui.alert('送信完了', 'メッセージを送信しました。', ui.ButtonSet.OK);} else {ui.alert('キャンセル', '送信をキャンセルしました。', ui.ButtonSet.OK);}}// 送信対象のルームを取得する関数function getTargetRooms(sheet) {const lastRow = sheet.getLastRow();const lastColumn = sheet.getLastColumn();if (lastRow <= 1 || lastColumn < ROOM_LIST_START_COLUMN + 2) return []; // データが無い場合const range = sheet.getRange(2, ROOM_LIST_START_COLUMN, lastRow - 1, 3);const values = range.getValues();return values.filter(row => row[1] > 0 && row[0]) // ルームIDが存在し、投稿対象が1以上.map(row => ({room_id: row[0],name: row[2] || `不明 (ID: ${row[0]})`}));}// Chatworkにメッセージを送る関数function postChatwork(roomId, message) {const params = {"headers" : {"X-ChatWorkToken" : CHATWORK_TOKEN },"method" : "POST","payload" : {"body" : message,"self_unread" : "1"}};const url = `https://api.chatwork.com/v2/rooms/${roomId}/messages`;try {const response = UrlFetchApp.fetch(url, params);if (response.getResponseCode() !== 200) {console.error(`Failed to send message to room ${roomId}. Status code: ${response.getResponseCode()}`);}} catch (error) {console.error(`Error sending message to room ${roomId}: ${error}`);}}// チャットワークに一斉投稿する関数function sendMultipleMsg(message, rooms) {for (let room of rooms) {postChatwork(room.room_id, message);console.log(`Sent message to room ${room.room_id} (${room.name})`);}}// 最新のルーム一覧を読込む関数function getRooms() {const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(MAIN_SHEET);const params = {headers : {"X-ChatWorkToken" : CHATWORK_TOKEN},method : "get"};const url = "https://api.chatwork.com/v2/rooms";try {const response = UrlFetchApp.fetch(url, params);if (response.getResponseCode() !== 200) {throw new Error(`Failed to get rooms. Status code: ${response.getResponseCode()}`);}const rooms = JSON.parse(response.getContentText());const values = [['ルームID', '投稿対象:1', 'ルーム名']];for (let room of rooms) {values.push([room.room_id, "", room.name]);}sheet.getRange(1, ROOM_LIST_START_COLUMN, values.length, values[0].length).setValues(values);SpreadsheetApp.getUi().alert('ルーム一覧を更新しました。');} catch (error) {console.error(`Error getting rooms: ${error}`);SpreadsheetApp.getUi().alert('ルーム一覧の取得に失敗しました。');}}

赤丸箇所に各自のチャットワークAPIを貼り付けます。
■チャットワークAPI

チャットワーク上部メニューのアカウントから、サービス連携 → APIトークンまで進みます。
※APIトークンは第三者に開示しないよう、取り扱いにご注意ください。
トークンが表示されていない場合は、管理者への承認が必要と思われますので、各自で確認してください。
APIトークンをコピーして、スプレッドシートのコードが表示されているApps Scriptに戻ります。

画像の箇所にコピーしたAPIトークンを上書きします。
ctrl+sを押して、GASを保存します。
■ルーム一覧を読み込み

スプレッドシート上部のメニュー → GAS → 最新のルームを読み込み を選択

初回実行時のみ、権限を求められるので、許可やOKを選んで進んでください。

該当アカウントの所持しているルーム一覧がスプレッドシートに記載されます。
F列の「投稿対象」に「1」を入れると、「1」が入っているルーム宛に投稿出来ます。
画像で言えば、「マイチャット」と「テスト1」に一括送信予定です。
次に送りたいメッセージを準備します。
「B1セル」に任意でよいですが、今回は「メッセージ」と入力します。
そして、送信したいメッセージを「B2セル」に入力します。
今回は「てすと送信」とします。
①「送信したいルーム」と②「送りたいメッセージ」の準備が出来たら、スプレッドシート上部のメニュー → GAS → メッセージを一斉送信 を選択

誤送信防ぐために、①「送信したいルーム」と②「送りたいメッセージ」の確認ウィンドウが表示されます。

チャットワークを確認すると同時刻に同内容が対象のルームに送信されていることを確認できました。
これで完了です。おつかれさまでした。
送信完了後はスプレッドシート上のB2セルメッセージは削除されます。

また、B2セルが空白時はエラーがでるようにしています。
https://note.com/nagatsuma/n/n75d7744ca19b
今回のコードは上記記事を参考にさせて頂きました。
記事通りに進めてもうまく実行できずに、Perplexityさん(AI)に相談しながら調整をしていきました。

具体的には、実行不可な原因調査、予約投稿や完了日時の記載は不要なので即時送信するように調整。
あとは、シート1、シート2で分かれていたのをシート1にまとめたり、送信前の確認ウィンドウなど、
Perplexityが一晩でやってくれました(これにはジェバンニもニッコリ)
もし、この記事通りに進めてもうまくいかない場合はお使いのAIに相談してみてください。
適当な回答されるかな~と偏見を持っていましたが、意外に短時間で作成できたのはAIのおかげでした。
また、素人が作成したコードです。
使用に当たって損害等が発生しても責任は負えませんので、自己責任でご使用ください。
質問や相談等も受けられないです。悪しからず。
おわり。

