
無料でチャットワークに一斉送信と予約投稿できるGAS
Google Apps Script(GAS)を利用してChatworkの複数のグループチャットにメッセージを一斉送信するスクリプトを作成しました。
あらかじめ投稿する時刻を指定しておき、GASのトリガー機能を利用して、ほぼ指定した時刻に予約投稿することが可能です。
なお、この記事のスクリプトは、Google Apps Scriptのツボとコツがゼッタイにわかる本に掲載したチャット予約投稿のスクリプトを参考にしてカスタマイズを行ったものです。
チャット予約投稿のスクリプトは書籍にてより詳しく解説しておりますのでよろしければご確認ください。
Google Apps Scriptのツボとコツがゼッタイにわかる本
https://www.amazon.co.jp/dp/4798062502/
■準備1. ChatworkのAPIトークンを取得する
Chatworkの右上にあるアイコンから「サービス連携」をクリック。
左側のメニューからAPI Tokenを開いて、パスワードを入力し、「表示」をクリック。
APIトークンが発行されますので、コピーしてどこかにメモしておいてください。
■準備2. Googleドライブでスプレッドシートを作成する
Googleドライブを開き、適当なフォルダで左上の「新規」ボタンからGoogleスプレッドシートを作成します。
■準備3. スクリプトエディタにスクリプトをコピペする
「ツール」メニューから「スクリプトエディタ」をクリックして開きます。
以下のスクリプトをコード入力欄にコピペしてください。
/*---- 初期設定ここから ----*/
// Chatworkトークン
const CHARWORK_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
// 投稿入力用シートのシート名
const MESSAGE_SHEET = "シート1";
// 投稿先ルーム設定用シートのシート名
const ROOM_SHEET = 'シート2';
/*---- 初期設定ここまで ----*/
// 管理用メニューを追加する関数
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('GAS')
.addItem('最新のルーム一覧を読込む', 'getRooms')
.addItem('いますぐ実行', 'myFunction')
.addToUi();
}
// 予約したメッセージを一斉送信する関数
function myFunction(){
// メッセージシートを取得
const book = SpreadsheetApp.getActiveSpreadsheet();
const sheet = book.getSheetByName(MESSAGE_SHEET);
const values = getSheetValues(sheet);
// シート更新用の配列を定義
const newValues = new Array();
// データの有無を判定
if( values.length > 1 ){
// 現在の日時を取得
const now = new Date();
// 昨日の0時0分を取得
const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
// 行の数だけ繰り返し
for( let record of values ) {
// 分割代入
let estimatedDate, message, sentDate;
[ estimatedDate, message, sentDate ] = record;
// 条件をチェック
if( message && !sentDate && estimatedDate > yesterday && estimatedDate < now ){
// メッセージを送信
sendMultipleMsg( message );
// 送信時刻に現在の時刻を格納する
sentDate = now;
}
// 配列を生成
const line = [ estimatedDate, message, sentDate ];
// 更新用の配列に追加
newValues.push( line );
}
}
// 更新用の配列の最初にフィールド名を挿入
newValues.unshift([ '投稿予定日時', 'メッセージ', '投稿完了日時' ]);
// シートをクリア
sheet.clearContents();
// シートにデータを貼付けて終了
sheet.getRange(1,1,newValues.length,newValues[0].length).setValues( newValues );
}
// Chatworkにメッセージを送る関数
function postChatwork( roomId, message ){
const params = {
"headers" : {"X-ChatWorkToken" : CHARWORK_TOKEN },
"method" : "POST",
"payload" : {
"body" : message,
"self_unread" : "1"
}
};
const url = `https://api.chatwork.com/v2/rooms/${roomId}/messages`;
UrlFetchApp.fetch(url, params);
}
// スプレッドシートのデータを取得して2次元配列を返す関数
function getSheetValues(sheet){
// データの最終行を取得
const lastRow = sheet.getLastRow();
// データの有無を判定
if( lastRow > 1 ){
// シートを読込む
const range = sheet.getRange( 2, 1, lastRow, sheet.getLastColumn() );
const values = range.getValues();
return values;
}
return false;
}
// チャットワークに一斉投稿する関数
function sendMultipleMsg( message ){
// スプレッドシートを取得
const book = SpreadsheetApp.getActiveSpreadsheet();
const sheet = book.getSheetByName (ROOM_SHEET);
const values = getSheetValues(sheet);
if( !values || values.length == 0 ) return false;
//
const rooms = [];
for(let record of values) {
const obj = new Object();
obj['room_id'] = record[0];
obj['target_flag'] = record[1];
rooms.push(obj);
}
// ルーム毎に投稿
for(let room of rooms) {
if( room.target_flag > 0 ){
postChatwork( room.room_id, message );
console.log(room.room_id, message)
}
}
}
// 最新のルーム一覧を読込む関数
function getRooms(){
// スプレッドシートを取得
const book = SpreadsheetApp.getActiveSpreadsheet();
const sheet = book.getSheetByName(ROOM_SHEET) || book.insertSheet(ROOM_SHEET);
// シートを読込み
const previousValues = getSheetValues(sheet);
// 既存の設定をルームIDをキーにした連想配列に残す
const array = [];
if( previousValues != false ){
for(let row of previousValues) array[row[0]] = row[1];
}
// ChatWork APIに投げるパラメータを設定
const params = {
headers : {"X-ChatWorkToken" : CHARWORK_TOKEN},
method : "get"
};
// ルーム一覧を取得するURL
const url = "https://api.chatwork.com/v2/rooms";
//チャットワークAPIエンドポイントからレスポンスを取得
const response = UrlFetchApp.fetch(url, params);
// 中身がなかったら終了
if( response.getContentText() == '' ){ return false; }
// レスポンスを配列に変換
const rooms = JSON.parse(response.getContentText());
// 配列を定義
const values = [];
// 1行目はフィールド名を挿入
values[0] = [ 'ルームID', '投稿対象:1', 'ルーム名' ];
// ルーム一覧の内容を2行目以降に追加
for(let obj of rooms){
const target_flag = array[obj.room_id] || "";
const line = [ obj.room_id, target_flag, obj.name ];
values.push( line );
}
// シートをクリア
sheet.clearContents();
// シートに貼付け
sheet.getRange(1,1,values.length,values[0].length).setValues( values );
}
■準備4. ChatworkのAPIトークンを貼り付ける
スクリプトの上部にあるChatworkトークンの値に準備1で取得したAPIトークンを貼り付けます。
貼り付けたら上部にあるフロッピーディスクの保存ボタンをクリックして保存します。
プロジェクト名を入力していない場合は、保存時にプロジェクト名を入力します。なんでもOKですのでわかりやすい名前にしておきましょう。
■使い方1. ルーム一覧を取得する
スプレッドシートに戻り、ブラウザの更新ボタンをクリックして1度ページを更新します。
メニューバーの一番右に「GAS」メニューが表示されますので、クリックして「最新のルーム一覧を取得する」をクリックします。
初回のみ、許可を要求する画面が表示されますので、許可していきます。
■使い方2. 投稿対象のルームに「1」を入力する
無事にスクリプトが実行されるとシート2にルームの一覧が入力されています。
一斉送信で投稿したいルームのルームIDの右のセル(B列)に「1」を入力します。
■使い方3. 投稿するメッセージを入力する
シート1に戻り、「GAS」メニューをクリックし、「いますぐ実行」をクリックします。
シート1の1行目にタイトルフィールドが自動で入力されますので、2行目以降に予約投稿するメッセージを入力します。
まずはテスト用に30分前の日時を指定してメッセージを入力してみましょう。
■使い方4. 実行してみる
「GAS」メニューから「いますぐ実行」をクリックします。
スクリプトが実行されます。
指定したグループチャットにメッセージが送信されていれば成功です。
■使い方5. トリガーを設定する
無事に投稿できることが確認できたら、トリガー機能を設定して予約投稿できるようにします。
再びスクリプトエディタを開き、左側の時計のマークをクリックするとトリガーの設定画面が開きます。
右下にある「トリガーを追加」をクリックします。
以下のとおり設定して「保存」します。
・実行する関数を選択: myFunction
・実行するデプロイを選択: Head
・イベントのリソースを選択: 時間主導型
・時間ベースのトリガーのタイプを選択: 時間ベースのタイマー
・時間の間隔を選択(時間): 1時間
1時間おきにスクリプトが実行されます。その時に指定した時刻を過ぎているメッセージが一斉送信されます。
なお、1時間のうち実行されるタイミングはGoogleさん次第なので、時刻ぴったりに送信することはできませんが、トリガーの実行間隔を短くすることで精度を上げることは可能です。
ただし、GASの実行にはいくつか制限がありますので、ひっかからないようにご注意ください。
仕事を自動化できるGASの本を発売中
最後にもう一度宣伝です^^
Google Apps Scriptを使って初心者でも無料で仕事を自動化できる本を出版しました。
Google Apps Scriptのツボとコツがゼッタイにわかる本
https://www.amazon.co.jp/dp/4798062502/
前半はGASやプログラミングが初めての方でもわかるように最低限必要な知識を解説し、後半では、この記事のような仕事で使えるスクリプトを9つ収録しています。
つまり初心者でもいきなりGASを使いこなせる一冊となっています。
収録されたスクリプトはChatworkとSlackに両対応していますので、仕事でどちらかのチャットを使っている方は特におすすめです。
ぜひご購入ください^^