slackをいつまでも見ないメンバーのためにLINEで通知するbotをお手軽に作る


# 重要
**この記事は古いです!**
LINE Notifyは2025年3月31日にサービス終了します。
この記事の内容は実装できなくなるので参考にしないでください


# 概要
Slackを使ったチームの制作をしていたのですが、メンバーの数名がいつまでたってもSlackを見ない~~残念な人たちだったため~~LINEにあるグループに通知をするbotを作る事にしました。(Slackは見なくてもLine見ない奴はいねーだろって考えです）
かといってそんな残念な人たちのために労力かけるのもアホらしいのでGASとLINE Notifyを使ってお手軽に実装しました。

#必要なもの
・Google Apps Script(GAS)が書ける環境
・LINE Notify(LINEのアカウントが必要) https://notify-bot.line.me/ja/
・Outgoing WebHooks

#作るもの
今回はslack上のすべてのチャンネルで`@line`というワードを検出した時にLINEグループに通知を送るというものを作ります。
仕組みとしては以下の通り

1  ユーザーが`@line`が含まれる投稿をSlackで行う
 ![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/73044871-d3b0-6841-f0e0-3c9c27e2d75e.png)

2 Slack側のOutgoing WebHooksがGASのアプリケーションのURLに対してPOSTする。

3 GAS側でLINENotifyのAPIをたたく

4 LINEに通知が来る
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/ff3e16aa-57c0-2134-6237-6a8f22c51e07.png)

5 世界が平和になる

サーバーとかよくわかんないけどサクッと実装できました。

#制作

#####LINE Notify
https://notify-bot.line.me/ja/ にアクセスしログインする

マイページからトークン発行をクリック
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/e9edcc2e-1fd9-2bdc-fe42-372ff4b599c2.png)

トークン名はbotがLINEで発言するときに表示されるのでわかりやすいものをつけましょう
通知を送信するトークルーム（今回は開発のLINEグループ）を指定
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/faafc022-2bbc-2480-9492-93ca6b0f13f0.png)


発行するをクリックするとトークンが発行されるのでメモなどに控えておきます。
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/10789d34-ac6a-53bc-b17e-ad65e31e0644.png)

これでLINE Notifyの設定は完了です。
正常に設定が終わっているとトークンが発行されたタイミングでLINE Notifyから通知が来ます
![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/878ae73a-efb2-db5b-5b67-b46e8eccd2e8.png)

#####GASでスクリプトを書く
続いてGoogle Apps Scriptでスクリプトを書いていきます。

```java:code.gs
function doPost(e) {

   //各種情報を取得
   var chName = e.parameter.channel_name;
   var userName = e.parameter.user_name;
   var text = e.parameter.text;
   //@lineの部分はいらないから削除しとく
   text =text.substring(5);
  var msg = "LINEにも通知したい投稿がSlackで行われました。\n各自確認してください。\n発言のあったチャンネル"+chName+
    "\n発言者 "+userName+ "\n内容 : "+text;
  //送信
  send(msg);
}

function send(message)
{
  //lineトークン
  var token = "ここにLINENotifyで発行したトークンを入れる";
  
  var op =
      {
        "method" : "post",
        "payload": "message=" + message,
        "headers":{"Authorization" : "Bearer " + token}
      };
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",op);
}
```
とりあえずこれでＯＫです。
doPostの引数のeにslackのOutgoing WebHooksから送られるPOSTの内容が入っています。
その情報を元にメッセージを作って自作のsend関数でLINEのAPIをたたいてます。

書き終わったらこのスクリプトを実行できるようにします。
GASのエディタのメニューにある公開からウェブアプリケーションとして導入をクリック。

プロジェクトバージョンは新規作成にして（スクリプトを更新する際も新規作成にする）、
アプリケーションにアクセスできるユーザーは全員（匿名ユーザーを含む）に設定
![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/f21274c3-d53d-d828-a018-42d9b23f17da.png)

作成するとURLが出てくるのでこれも控えます。
![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/a0b6d741-e547-8db7-43d0-6c3f11a11837.png)



#####Outgoing WebHooks
最後にSlack側と連携をしていきます。
https://チームURL/apps/manage
にアクセスし上のほうにあるSearch App DirectoryにOutgoing WebHooksと入力します
![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/bc5806bd-15d5-efa2-b055-e06dc4b13999.png)
Add Configurationをクリック

![キャプチャ8.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/fd2df108-b608-d755-4f75-fa500fb26cab.png)
Add Outgoning WebHooks integrationをクリック

![キャプチャ11.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/57b994ac-30d7-2096-8f36-e296b9ebcb35.png)
設定をしていきます
Channelには発言を監視するチャンネルを設定します。
今回は全てのチャンネルを監視したいのでAnyを選択
Trigger World(s)にはLineに通知する投稿だと識別するためのキーワードを設定します
今回は`@line`で設定
URL(s)には先ほど発行したGASのWebアプリケーションURLを入れます。
Tokenはこのあと使います。

設定が終わったら下のほうにあるSave Settingsをクリックして完了です。


#####コードを修正
このままだとGASのアプリケーションURLを知られてしまうと不正にアプリケーションが実行されてLINEに投稿される恐れがあるので
先ほどのOutgoing WebHooksの設定画面にあったトークンを使い、Slackチームからの実行以外は弾くようにスクリプトを修正していきます。

```java:fixcode.gs
 function doPost(e) {
//追記ここから//////////////////////////////////////////////// 
 //投稿のトークン取得
  var t = e.parameter.token;
   
  //トークンが一致しているか
  if( t != "Outgoing WebHooksの設定画面にあったトークン")
  {return;}
//追記ここまで////////////////////////////////////////////////   


   //各種情報
   var chName = e.parameter.channel_name;
   var userName = e.parameter.user_name;
   var text = e.parameter.text;
   //@lineの部分はいらないから削除しとく
   text =text.substring(5);
  var msg = "LINEにも通知したい投稿がSlackで行われました。\n各自確認してください。\n発言のあったチャンネル"+chName+
    "\n発言者 "+userName+ "\n内容 : "+text;
  send(msg);
}

function send(message)
{
  //lineのほうのトークン
  var token = "ここにLINENotifyで発行したトークンを入れる";
  
  var op =
      {
        "method" : "post",
        "payload": "message=" + message,
        "headers":{"Authorization" : "Bearer " + token}
      };
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",op);
}
```
修正したらまたGASのエディタのメニューにある公開からウェブアプリケーションとして導入をクリックし、アプリケーションを更新します
プロジェクトバージョンは新規作成にしないと反映されないので注意。

更新したら動作確認をしてみましょう。
LINEグループにLINE Notifyアカウントを追加すれば準備ＯＫ！

#完成
Slackで投稿すると
![キャプチャ12.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/f17a867d-b992-998b-19fb-6824090cc8fb.png)
通知が来る！
![キャプチャ13.PNG](https://qiita-image-store.s3.amazonaws.com/0/159111/a62d339e-d4a8-374b-4156-e43bb6b1c192.png)
### 楽しい！

とりあえず望んでいたことが簡単に実装できました（満足）
GAS便利。
果たしてこれでSlack見ない残念な人たちにも連絡が伝わるのか・・・