2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Slackで別ワークスペースの投稿を別のワークスペースへ転記するだけのGAS

Last updated at Posted at 2021-06-20

この投稿で実施していること

基本部分はこちらなどを参考させていただき、とにかく、ある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をユーザー一覧で紐づけないといけないらしく面倒だったため。。)
コード.gs
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);
}

:bulb: ここで必要なコード内の [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をコピーする。


・ (2) 専用コラボ用Slackワークスペース
  ・ 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 <ワークスペース名>]ボタン
に変わっていました。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?