LoginSignup
0
1

More than 5 years have passed since last update.

RedmineとSlackの連携(三度目の正直)

Posted at

これまでの経緯

https://qiita.com/asuzuki2008/items/1a310d66959e06376911
https://qiita.com/asuzuki2008/items/71a800e0a356ce59b914

上記の投稿でRedmineとSlackの連携を図ってきた。
ところがついこの間、Slackに連絡がこないことに気づく。

デバッグすると送られる。
しかし、トリガー(GASを1分毎に実行するように設定したもの)から実行されるときには、メールだけ届かない。

............Σ( ̄ロ ̄lll)ガーン
?・・・そもそもGASで色々書けるんだから、直接Slackに投げれんじゃね?

ということで今回は、GASから直接Slackに投げる方法でスクリプトをつくりなおした。
なんかあほらしいな。。。

事前準備

Slack側

Incoming Webhookをインストール

インストールした後、どのチャンネルに受信するかみたいな設定をすると、Webhook URLが与えられる。

Gmail側

RedmineにGmailユーザに入れて、プロジェクトで必ずメール受け取る設定にしておく。

GAS作成

var FindSubject = 'subject:(件名で引っ掛けたい文言) label:inbox -in:starred';

function getMail(){

  //指定した件名のスレッドを検索して取得 
  var myThreads = GmailApp.search(FindSubject, 0, 10); 
  //スレッドからメールを取得し二次元配列に格納
  var myMessages = GmailApp.getMessagesForThreads(myThreads);

  for(var i in myMessages){
    var count = 0;
    for(var j in myMessages[i]){
      count++;
      var strSubject = myMessages[i][j].getSubject();
      var strMessage = '';
      strMessage += AutoLink(myMessages[i][j].getBody());
      strMessage += myMessages[i][j].getPlainBody().slice(0, 200);
      // メッセージのスレッドは、過去の返信履歴なども持っているため、最後のメールにだけ反応させる
      if(count == myMessages[i].length){
        sendSlack(strSubject, strMessage);
      }

      //処理済みのメッセージをスターをつける
      myMessages[i][j].star(); 
    }
  }
}
function AutoLink(str) {
  var regexp_url = /((h?)(ttps?:\/\/[a-zA-Z0-9.\-_@:/~?%&;=+#',()*!]+))/g; // ']))/;
    var regexp_makeLink = function(all, url, h, href) {
        return '<a href="h' + href + '">' + url + '</a>';
    }
    link = '\n\n' + str.match(regexp_url)[0]
    return link;
}

function sendSlack(strSubject, strMessage){
  // Make a POST request with a JSON payload.
  var data = {
    'text': strMessage,
    'pretext': strSubject,
  };
  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    // Convert the JavaScript object to a JSON string.
    'payload' : JSON.stringify(data)
  };
  UrlFetchApp.fetch("Webhook URLを記述", options);
}

あとはGASのトリガーを設定。以下と同じ。
https://qiita.com/asuzuki2008/items/1a310d66959e06376911

最後に

三回も作り直すのは想定外だったな。。
ほんとにこれを最後にしたい。

因みに、textの中にメンション書いてみたりしたけど有効にならない。
多分この辺は色々テクニックあるのだろうな。
だけど、Webhookの説明にはその辺のことあまり詳しく書かれていない。(ように見えた)

0
1
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
0
1