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

## この投稿で実施していること
基本部分はこちらなどを参考させていただき、とにかく、あるSlackワークスペースに投稿があったら、普段使っているSlackワークスペースへ転記する部分のGASをまとめました。
>（参考にさせていただいたサイト）
>[[GAS][Slack App]Outgoing Webhook の代わりとして Slack App の Event Subscriptions を使う](https://etauthenonprogrammercoder.tumblr.com/post/185572851353/gasslack-appoutgoing-webhook-%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%A8%E3%81%97%E3%81%A6-event)

- それまで「Zapier」で実施していたことの代替です。（ちなみにIFTTTにはSlackをトリガーとするレシピが無いんですね。。）

- 「OutgoingWebHook」（相当の機能）と「Incomming WebHook」はSlackAPIをそのまま使っています。

## 1. AppsScript ( Google Apps Script )の作成
- 投稿した「Slaskのユーザー名」通知には対応できていません。（Slackのユーザー名を表示するためにはユーザーIDをユーザー一覧で紐づけないといけないらしく面倒だったため。。）

```javascript:コード.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
　「メンバーがチャンネルに参加しました」の転送を除外できるようにしました。
　　※修正ご協力：ランサーズにて[(ペンネーム)岩本耕太様](https://www.lancers.jp/profile/kotahiramoto)、ありがとうございました。
・2023.7.26
　exclusion_subtype（除外するサブタイプ）関数化しました。

## 2. Slack API の設定（１）（普段使いのワークスペース側）
### 2.1. 常時利用ワークスペースの「Incoming Webhooks」で受信させるチャンネルを設定する

| ・ 常時利用中のSlackワークスペース<br> &emsp; ・ Slack API：[Incoming Webhooks]<br> &emsp; &emsp;・ そのワークスペースに受信させるチャンネルを作成しておく。<br> &emsp; &emsp; ※GASのコードで使う[incommingWebHookのURL]はここからコピー。|
| --- |
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/164ac4bf-4174-c9cc-45eb-b57e2d9b4b1c.gif">|

### ⇒ここでGASスクリプトをWebアプリとしてデプロイ
（※後ほど章分けします。）

## 3. Slack API の設定（２）（転送するワークスペース側）
### 3.1. 「Create New App」で「Outgoing Webhook」（相当の機能）を新規に命名し専用コラボワークスペースに割り当てる

| ・ 専用コラボ用Slackワークスペース<br>  &emsp;・ Slack API：[Create New App]<br>  &emsp; &emsp;・ 「Outgoing Webhook」機能として命名<br> &emsp; &emsp;&emsp;（例: message_OUT_[ワークスペース名] ）<br> &emsp; &emsp;&emsp;と割り当てをする。|
| --- |
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/95a2029f-b3cb-dcbb-1f72-91922fa64454.gif">|

### 3.2. 「Event Subscriptions」に移動し「Enable Events」をONにしGASのWebアプリをVerifyする

|・ (1) Google AppsScript<br> &emsp; ・ デプロイを管理<br> &emsp; &emsp;・ WebアプリのURLをコピーする。<p><br></p>・ (2) 専用コラボ用Slackワークスペース<br> &emsp; ・ Slack API：[Event Subscriptions]<br> &emsp; &emsp;・ [Request URL]にGASからコピーしたWebアプリのURLを貼り付けて<br>&emsp; &emsp; &emsp;エンターを押下し結果が「Verified」になったことを確認する。|
| --- |
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/a19c5888-153f-ea70-b170-2532cf45431a.gif">|

### 3.3. 「Event Subscriptions」の「users」に「message.channels」と「message.groups」を設定する

| ・ 専用コラボ用Slackワークスペース<br> &emsp; ・ Slack API：[Event Subscriptions]<br> &emsp; &emsp;・ 「Subscribe to events on behalf of users」に<br>&emsp; &emsp; &emsp;「message.channels」と<br> &emsp; &emsp; &emsp;「message.groups」の２つを設定する。<br> &emsp; &emsp; &emsp;※「bot」など他の項目は不要。|
| --- |
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/ace4f716-81c3-4280-9514-9b7433deb0e4.gif">|

### 3.4. 「Outgoing Webhook」を専用コラボ用ワークスペースへインストールする

| ・ 専用コラボ用Slackワークスペース<br> &emsp; ・ Slack API：[Install App]<br> &emsp; &emsp;・ [Install to <ワークスペース名>]を押下する。|
| --- |
|![[Install App] - [Install to ワークスペース名].gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/b9f1e54b-92a9-4ac9-90ce-a0348318cf8a.gif)|