この投稿で実施していること
基本部分はこちらなどを参考させていただき、とにかく、ある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);
}
// CacheServiceを使って重複実行を防止する 2025.8.13
var event_ts = json.event.ts;
if (event_ts) {
var cache = CacheService.getScriptCache();
if (cache.get(event_ts)) {
return; // 既に処理済みのイベントのため終了
}
cache.put(event_ts, 'processed', 300); // 5分間、このイベントIDをキャッシュ
}
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;
}
// 自身が投稿したメッセージ(に含まれる識別子)を検知してループを防ぐ 2025.8.13
var unique_identifier = "(forwarded_by_gas_script)";
if (text && text.indexOf(unique_identifier) > -1) {
return;
}
// 転送通知するチャンネル(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 = "<!here> プロジェクトWSに投稿がありました。\n" + "投稿のあったチャンネルはこちら: " + infoUrl + channel + "\n" + ">" + text + "\n\n" + unique_identifier;
}else{
var message = "<!here> プロジェクトWSに投稿がありました。\n" + "投稿のあったチャンネルはこちら: " + infoUrl + channel + "/thread/" + channel + "-" + thread_ts + "\n" + ">" + text + "\n\n" + unique_identifier;
}
var jsonData =
{
"text" : message,
"unfurl_links": false
};
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(除外するサブタイプ)関数化しました。
・2025.8.13
重複投稿が発生したためいくつかの施策で対処。
2. Slack API の設定(1)(普段使いのワークスペース側)
2.1. 常時利用ワークスペースの「Incoming Webhooks」で受信させるチャンネルを設定する
| ・ 常時利用中のSlackワークスペース ・ Slack API:[Incoming Webhooks] ・ そのワークスペースに受信させるチャンネルを作成しておく。 ※GASのコードで使う[incommingWebHookのURL]はここからコピー。 |
|---|
![]() |
⇒ここでGASスクリプトをWebアプリとしてデプロイ
(※後ほど章分けします。)
3. Slack API の設定(2)(転送するワークスペース側)
3.1. 「Create New App」で「Outgoing Webhook」(相当の機能)を新規に命名し専用コラボワークスペースに割り当てる
| ・ 専用コラボ用Slackワークスペース ・ Slack API:[Create New App] ・ 「Outgoing Webhook」機能として命名 (例: message_OUT_[ワークスペース名] ) と割り当てをする。 |
|---|
![]() |
3.2. 「Event Subscriptions」に移動し「Enable Events」をONにしGASのWebアプリをVerifyする
| ・ (1) Google AppsScript ・ デプロイを管理 ・ WebアプリのURLをコピーする。 ・ Slack API:[Event Subscriptions] ・ [Request URL]にGASからコピーしたWebアプリのURLを貼り付けて エンターを押下し結果が「Verified」になったことを確認する。 |
|---|
![]() |
3.3. 「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」など他の項目は不要。 |
|---|
![]() |
3.4. 「Outgoing Webhook」を専用コラボ用ワークスペースへインストールする
| ・ 専用コラボ用Slackワークスペース ・ Slack API:[Install App] ・ [Install to <ワークスペース名>]を押下する。 |
|---|
![]() |




![[Install App] - [Install to ワークスペース名].gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1667967%2Fb9f1e54b-92a9-4ac9-90ce-a0348318cf8a.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ef9e37cf88289dbcad689ba18fb18b78)