この投稿で実施していること
基本部分はこちらなどを参考させていただき、とにかく、あるSlackワークスペースに投稿があったら、普段使っているSlackワークスペースへ転記する部分のGASをまとめました。
(参考にさせていただいたサイト)
[GAS][Slack App]Outgoing Webhook の代わりとして Slack App の Event Subscriptions を使う
-
それまで「Zapier」で実施していたことの代替です。(ちなみにIFTTTにはSlackをトリガーとするレシピが無いんですね。。)
-
「OutgoingWebHook」(相当の機能)と「Incomming WebHook」はSlackAPIをそのまま使っています。
1. AppsScript ( Google Apps Script )の作成
- 投稿した「Slaskのユーザー名」通知には対応できていません。(Slackのユーザー名を表示するためにはユーザーIDをユーザー一覧で紐づけないといけないらしく面倒だったため。。)
function doPost(e) {
var json = JSON.parse(e.postData.getDataAsString());
// slackappのchallenge応答認証対応
if (json.type === 'url_verification') {
return ContentService.createTextOutput(json.challenge);
}
var text = json.event.text;
var channel = json.event.channel;
var thread_ts = json.event.thread_ts;
// subtypeの取得 2022.4.25
var subtype = "none";
if("subtype" in json.event){
subtype = json.event.subtype;
}
// 転送通知するチャンネル(incommingWebHook)
var postUrl = '[incommingWebHookのURL]';
// 通知ループを防ぐため、通知先のチャンネルIDを指定 2022.4.25
var postChannelId = "[通知先のチャンネルID]";
if(postChannelId === channel) return;
// exclusion_subtype(除外するサブタイプ)関数 呼び出し 2023.7.26
if (exclusion_subtype(subtype)) {
// 通知を行わない場合はここで処理終了
return;
}
// 通知元ワークスペース
var infoUrl = 'https://app.slack.com/client/[ワークスペースのID]/';
if (thread_ts === undefined){
var message = "<!channel> プロジェクトWSに投稿がありました。\n" + "投稿のあったチャンネルはこちら: " + infoUrl + channel + "\n" + ">" + text;
}else{
var message = "<!channel> プロジェクトWSに投稿がありました。\n" + "投稿のあったチャンネルはこちら: " + infoUrl + channel + "/thread/" + channel + "-" + thread_ts + "\n" + ">" + text;
}
var jsonData =
{
"text" : message
};
var payload = JSON.stringify(jsonData);
var options =
{
"method" : "post",
"contentType" : "application/json",
"payload" : payload
};
if (text !== undefined){
UrlFetchApp.fetch(postUrl, options);
}
}
// exclusion_subtype(除外するサブタイプ)関数 2023.7.26
function exclusion_subtype(subtype) {
// subtypeのブラックリスト 2022.4.25, 関数化 2023.7.26
// subtype一覧:https://api.slack.com/events/message
var blacklist_subtype = new Array();
// ブラックリストにする値を定義
blacklist_subtype[0] = "channel_join"; //「メンバーがチャンネルに参加しました」
blacklist_subtype[1] = "channel_archive"; //「チャンネルがアーカイブされました」
blacklist_subtype[2] = "channel_name"; //「チャンネル名が変更されました」
// 配列変数「blacklist_subtype」にsubtypeが含まれているかを確認
return (blacklist_subtype.indexOf(subtype) >= 0);
}
ここで必要なコード内の [incommingWebHookのURL] は、次の工程で Slack API から取得します。
[更新履歴]
・2022.4.25
「メンバーがチャンネルに参加しました」の転送を除外できるようにしました。
※修正ご協力:ランサーズにて(ペンネーム)岩本耕太様、ありがとうございました。
・2023.7.26
exclusion_subtype(除外するサブタイプ)関数化しました。
2. Slack API の設定
2.1. 常時利用ワークスペースの「Incoming Webhooks」で受信させるチャンネルを設定する
・ 常時利用中のSlackワークスペース ・ Slack API:[Incoming Webhooks] ・ そのワークスペースに受信させるチャンネルを作成しておく。 ※GASのコードで使う[incommingWebHookのURL]はここからコピー。 |
---|
![]() |
2.2. 「Create New App」で「Outgoing Webhook」(相当の機能)を新規に命名し専用コラボワークスペースに割り当てる
・ 専用コラボ用Slackワークスペース ・ Slack API:[Create New App] ・ 「Outgoing Webhook」機能として命名 (例: message_OUT_[ワークスペース名] ) と割り当てをする。 |
---|
![]() |
2.3. 「Event Subscriptions」に移動し「Enable Events」をONにしGASのWebアプリをVerifyする
・ (1) Google AppsScript ・ デプロイを管理 ・ WebアプリのURLをコピーする。 ・ Slack API:[Event Subscriptions] ・ [Request URL]にGASからコピーしたWebアプリのURLを貼り付けて エンターを押下し結果が「Verified」になったことを確認する。 |
---|
![]() |
2.4. 「Event Subscriptions」の「users」に「message.channels」と「message.groups」を設定する
・ 専用コラボ用Slackワークスペース ・ Slack API:[Event Subscriptions] ・ 「Subscribe to events on behalf of users」に 「message.channels」と 「message.groups」の2つを設定する。 ※「bot」など他の項目は不要。 |
---|
![]() |
2.5. 「Outgoing Webhook」を専用コラボ用ワークスペースへインストールする
・ 専用コラボ用Slackワークスペース ・ Slack API:[Basic Information] - [Install your app] ・ [Install to Workspace]を押下する。 |
---|
![]() |
(2024.10.10追記)只今私も久しぶりにやってみましたら、最後のインストールの工程が、
[Install App] - [Install to <ワークスペース名>]ボタン
に変わっていました。