LoginSignup
1
3

More than 3 years have passed since last update.

サクッとGAS(google app script)で指定ラベルのGmailをslackに通知

Last updated at Posted at 2019-06-24

だいぶ昔に書いた、GASで指定ラベルのメールをslackに通知するスクリプトを久々使う事になったので、
更新しました。

サクッと簡易的にできますが、このGASの設定で自動で既読になったりするのでご注意を。


用意するもの

  • gmailのラベル設定

こういうの
image.png

  • slackの通知先の部屋

こういうの
image.png

  • slackのwebhookURL slackのwebhook URLはこちらから発行可能 → https://api.slack.com/apps/{あなたの Slack App ID}/incoming-webhooks

で、

gmail2slack.gs
// slackのwebhook URLはこちらから発行可能 → https://api.slack.com/apps/{あなたの Slack App ID}/incoming-webhooks
var postUrl = "https://hooks.slack.com/services/xxxxxxxxxxx";

// 通知したいslackのチャネル(部屋)
var postChannel = "#n_app_review";

// 抽出元のGmailのラベル
var checkLabel = "TO_ME";

function myFunction() {

  // 未読の指定ラベル を検索
  var threads = GmailApp.search('is:unread label:' + checkLabel);  

  var count = threads.length;
  Logger.log("対象件数:" + threads.length); 

  for(var i = 0; i < count; i++) {

    var lastDate = threads[i].getLastMessageDate();
    var datetime = lastDate.getFullYear() + "/" + (lastDate.getMonth() + 1) + "/" + lastDate.getDate()
    + " " + lastDate.getHours() + ":" + lastDate.getMinutes() + ":" + lastDate.getSeconds();

    var messages = threads[i].getMessages();

    //同じ件名で、ネストされたメッセージを個別に
    if(messages.length > 0){
      for(var j = 0; j < messages.length ; j++){

        // 簡易的に、brタグを改行に
        var brTagStripped = messages[j].getBody().replace(/(<br>|<br \/>)/gi, '\n');

        // 簡易的に、HTMLメールのタグを解除
        var stripped = brTagStripped.replace(/(<([^>]+)>)/ig,"");

        var postMessage = " 件名:[" + threads[i].getFirstMessageSubject() + "]" + "本文```" +  stripped + "```";
        Logger.log(datetime + postMessage);

        // 対象のメールを1通を既読に。
        messages[j].markRead();

        //slackに通知
        sendHttpPost(postMessage);

      }
    }

    // 対象のメールを既読にする
    // NOTE: 同じ件名でネストされているものはすべて既読になります。
    // threads[i].markRead();

  }
}

function sendHttpPost(message, username)
{
  var jsonData =
      {
        "channel" : postChannel,
        "username" : username,
        "text" : message
      };
  var payload = JSON.stringify(jsonData);
  var options =
      {
        "method" : "post",
        "contentType" : "application/json",
        "payload" : payload
      };

  UrlFetchApp.fetch(postUrl, options);
}

その後、
このスクリプトをGASのタイマー設定で5分毎等に設定し、メールを拾って対象ラベルのものがあればSlackの指定の部屋に通知します。

image.png

ポイント&課題

  • ポイントは、同じ件名でやり取りしているメールなどは、1つにまとまって扱われるので、 threads[i].markRead(); ではなく、 messages[j].markRead();で1通ずつ既読にするようにしています。

image.png

  • 改善点:HTMLメールのタグ解除が簡易的な正規表現なので、ものによって崩れます。あとhtmlタグを解除する前に、改行コードも変換しておき、改行だけ残るようにしています。

僕は、Androidアプリの新規レビュー通知をslackに流すため、
利用しています。
slackにレビュー通知する連携アプリは結構ありますが、
無料でアカウントに紐づく全アプリのレビュー通知するのは見つからず。
メールから拾う方法で対応してみました。

アプリ数が多いと、アプリIDを一個一個取得して設定するのも大変なので、
何気に便利です。

iOSは、新規レビューの通知設定(レビューの編集は通知できる)がAppStoreConnect上で見つからなかったので、
AppStoreConnectAPIで、頑張ってアプリID取得してやる方法と取ろうと思います。
(まだやっていない。。汗)

1
3
1

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