見出し画像

[GAS]Chatwork特定のルームでメッセージを受信したら、別のルームに内容を転送する

はじめに

Chatworkで、あるルームで取得したメッセージを、別のルームに通知する処理を、GASで実装します。

下記の図のようなイメージです。

プレゼンテーション1

ルームAにはAさんのみ招待されているが、ルームAでAさんに来たメッセージを、ルームBのメンバー全員で共有したい、みたいな時に使用することを想定しています。

手順

1.GAS実装

ChatworkからのHTTPリクエスト(POSTリクエスト)を受け取り、Chatworkライブラリ「ChatWorkClient for Google Apps Script」を使用してメッセージを送信する処理を実装します。

const ROOM_ID_A = XXXXXXXXX;
const ROOM_ID_B = YYYYYYYYY;

function doPost(e){
 const json   = JSON.parse(e.postData.contents);
 const from   = json.webhook_event.from_account_id;
 const body   = json.webhook_event.body;
 const time   = transTime_(json.webhook_event.send_time);
 const roomid = json.webhook_event.room_id;
 
 let send_room_id = 0;
 let recipient = '[toall]';
 
 if ( roomid === ROOM_ID_A ){
   send_room_id = ROOM_ID_B;
 }

 if ( send_room_id ){
    const msg = recipient +
	   "[qt][qtmeta aid=" + from + " time=" + time + "]" + body + "[/qt]";
	      
	const properties = PropertiesService.getScriptProperties();
	const token = PropertiesService.getScriptProperties().getProperty('CW_TOKEN');
	  
	sendCWMessage_(token,send_room_id,msg);
  }
}

/**
* Chatworkにメッセージ送信
*
* @param {string} Chatwork APIトークン
* @param {string} Room ID
* @param {string} 送信するメッセージ本文
*
* 〈ライブラリ〉
* Chatwork Client for Google Apps Script : M6TcEyniCs1xb3sdXFF_FhI-MNonZQ_sT
* https://github.com/cw-shibuya/chatwork-client-gas
*/
function sendCWMessage_(token, roomId,msgbody){
 const cw = ChatWorkClient.factory({token: token});
 cw.sendMessage({
   room_id: roomId,
   body: msgbody
 });
}

/**
* UnixTimeを日付の整形に変換
*
* @param {string} UnixTime
* @return {string} 日付の整形(yyyy/MM/dd HH:mm:ss)
*/
function transTime_(intTime){
 const d = new Date( intTime * 1000 );
 return Utilities.formatDate(d, 'JST', 'yyyy/MM/dd HH:mm:ss');
}

アカウントに対して通知されるメッセージのWebhookイベントで処理を行うようにしているため、通知元となっているルームIDを参照するコードとなっています。

(修正・追記)Chatwork Webhookで、フィールド名:room_idは、タイプが数値です。

そのため、コードの1,2行目

const ROOM_ID_A = XXXXXXXXX;
const ROOM_ID_B = YYYYYYYYY;

で通知元、通知先のルームIDを定義する定数は、数値で指定するようにしました。

なお、ChatworkのAPIトークンの取得方法は、下記を参考にしました。

今回使用しているライブラリ「ChatWorkClient for Google Apps Script」については、下記を参考にしました。


2. 1.を、ウェブアプリケーションとして導入

スクリプトエディタのメニューから、「公開」→「ウェブアプリケーションの導入」を選択します。

画像2

「ウェブアプリケーションの導入」ダイアログから、
①「新規作成」を選択
②次のユーザとして「自分」を選択
③「全員(匿名ユーザを含む)」を選択
し、「導入」を選択します。(2回め以降は、「更新」になります)

画像3

URLが取得できますので、コピっておきます。

画像4

3. Chatwork の設定

アカウントのアイコンの右にある▼を選択し、「サービス連携」を選択します。

Chatworkサービス連携

左のメニューから、「Webhook」を選択し、「Webhook」画面にて、「新規作成」を選択します。

Chatworkサービス連携2

Chatworkサービス連携3

Webhook名は、わかりやすい「Webhookの新規作成」画面で、
・Webhook名:わかりやすい命名
・Webhook URL:2. でコピったURLを設定
・イベント:今回は、指定アカウントに来たメッセージで判定するので、「アカウントイベント」
を選択して、「作成」を選択します。

スクリーンショット 2020-12-05 011517

これで設定完了。

ルームAで、送信されたメッセージが、

画像9

ルームBへメッセージ送信されます。

画像10

まとめ

Chatworkのメッセージ転送をしたいとき、GASで簡単に対応できます。
また、GASをGoogleスプレッドシートにコンテナバインドで実装しておくと、転送したメッセージをシートに出力しておくと、そのメッセージを処理したかどうか?なんかも、管理することができそうです。

この記事が気に入ったらサポートをしてみませんか?