これまでの経緯
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の説明にはその辺のことあまり詳しく書かれていない。(ように見えた)