chatterからSlackへ転送する(後編)

chatterで入力したメッセージをslackへ転送する処理を紹介します
この章ではSlackの転送時にメンションをつけたり複数のチャンネルへ転送する方法を紹介しています

前編ではchatterの投稿文をあらかじめ指定したSlackの宛先に転送する方法を紹介しています
https://qiita.com/SyogoSuganoya/items/4bf1b7991a7445aa351f

# イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/652264d0-dad6-839c-65be-af236df2fa10.png)



# 概要
前編では「＠」でメンションをつけてchatter投稿をしても、Slackではメンション通知がされず
プレーンテキストのまま出力されます

---
今回は「＠」でSlackでもメンション通知の転送がされる処理を追加します

送信先チャンネルについても前編ではプロセスビルダーで指定した宛先へ固定して転送されますが、
同様に「＠」で宛先チャンネルを指定できるようにします


# 実装方法
## スプレッドシート
「slackID」、「宛先チャンネル一覧」のシートを用意します

「slackID」では以下のような表を準備します

|氏名|ユーザID|
|:-----------------|:------------------|
|@山田太郎|???????|
|@田中次郎|???????|
|@佐藤ゆうこ|???????|

氏名をキーワードにしてメンバへの通知を行う管理テーブルです
SlackではユーザIDを基にメンション通知を行っています

ユーザIDの調べ方についてはこちら↓
Slackワークスペースに属するユーザIDを調べる方法・手順を解説
https://auto-worker.com/blog/?p=27


「宛先チャンネル一覧」では以下のような表を準備します

|キーワード|チャンネル名|
|:-----------------|:------------------|
|@general|#general|
|@raodom|#random|
|@営業部|#営業部|

キーワードに反応して該当のチャンネル先へメッセージを送信します

---
ちなみに以下のようにキーワードを複数指定しておいて可用性を高めることも可能です。

|氏名|ユーザID|
|:-----------------|:------------------|
|@山田太郎|001|
|@田中次郎|002|
|@佐藤ゆうこ|003|
|@山ちゃん|001|

「@山田太郎」でも「@山ちゃん」でも山田太郎さんへ通知が飛びます


|キーワード|チャンネル名|
|:-----------------|:------------------|
|@general|#general|
|@raodom|#random|
|@営業部|#営業部|
|@全体|#general|

「@general」でも「@全体」でも#generalへ通知が飛びます

## GAS
chatter投稿メッセージをメンション通知が飛ぶように整形します
GASにて以下のコードをコピペします

```js:chatter2slack.gs
/*
*　post送信された時の挙動
*/
function doPost(e) {
  
  // chatterからの投稿本文
  var text = e.parameter.text;
  var message = text.replace('chatterから送信されました','');
  
  message = changeName2SlackId(message);
  changeChannelName(message);
}

/*
*　含まれたメンションをslackIDへ置換する
*　
*　@param {string} msg - 送信メッセージ
*/
function changeName2SlackId(msg) {
  
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var idSheet = spreadsheet.getSheetByName('slackID');
  var idVal = idSheet.getDataRange().getValues();
  
  msg = msg.replace('＠','@');
  
  for(var i = 0; i < idVal.length; i ++) {
    
    if(msg.indexOf(idVal[i][0]) > -1) {
      
      msg = msg.replace(idVal[i][0], '<@' + idVal[i][1] + '>');
    }
  }
  return msg;
}

/*
*　指定したチャンネルへslack送信を行う
*　
*　@param {string} msg - 送信メッセージ
*/
function changeChannelName(msg) {
  
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var channelSheet = spreadsheet.getSheetByName('宛先チャンネル一覧');
  var channelVal = channelSheet.getDataRange().getValues();
  
  var isSend = false;
  
  for(var i = 0; i < channelVal.length; i ++) {
    
    if(msg.indexOf(channelVal[i][0]) > -1) {
      
      sendSlack('ボット名','female_fairy',msg,channelVal[i][1]);
      isSend = true;
    }
  }
  
  // 宛先チャンネルが見つからない場合は、「general」へ送信する

  if(!isSend) {
    sendSlack('ボット名','female_fairy',msg,'#general');
  }
  return msg;
}
```
「sendSlack」は別の記事にて記載があります

【Slack】SlackでBotを開発する【GAS】
https://qiita.com/SyogoSuganoya/items/bb6a4f5256c0e944a0f5

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/68f9a3ea-b63f-0bb1-7b54-e148c967900e.png)
「公開」タブから「ウェブアプリケーションとして導入」をクリックします

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/75907fb2-73c8-4dd1-cbba-e4dfb7fccd36.png)

Current web app URL:をコピーします
Who has access to the app:は「Anyone,even anonymous」を選択します

---
コードの修正を行った場合、適宜「更新」ボタンをクリックします

## プロセスビルダー
チャンネルを一時チャンネルへ変更します
Slack messageの文頭にキーワードを設定します
今回のキーワードは「chatterから送信されました」に設定します

## Slack
使用するワークスペースとチャンネルを用意します

転送メッセージを受信するため、「Outgoing Webhook」をインストールします
SlackのサイドバーのAppから「Outgoing Webhook」を検索、インストールを実行します

Outgoing Webhookの設定をします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/6000ef7f-b15d-0643-4607-736579231c59.png)
Slackに追加をクリックします

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/72b0dc27-8f34-685f-43fe-c560362ae70f.png)
Outgoing Webhookインテグレーションの追加をクリックします

---

チャンネルはプロセスビルダーで設定したチャンネル名を設定します
引き金となる言葉もプロセスビルダーで設定したキーワードを設定します
URLは「GAS」でコピーしたURLをペーストします

## 動作確認
chatterでスプレッドシートで設定したキーワードを含む文章を投稿します