21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GASでGmailをDiscordに転送できるようにした

Posted at

はじめに

皆さん、Gmail、使ってますか?
結構な方が使ってると思うのですが、中にはメールチェックをさぼりがちで、ついつい重要な連絡を見過ごしてしまう、という人もいると思います。僕もその一人です。
と、言うわけでそれを解決するソリューション(言ってみたかった)として、Gmailの内容を普段使っているチャットツールに転送出来たらチェック漏れが減るのではないか、と思いGASを使って実際にやってみました。
今回は、その知見をまとめていきたいと思います。

DiscordのWebhookを取得する

まず、今回はDiscordを使用したいので、メールを転送するためのDiscordサーバーをさくっと作ります。
そうしたら次に、メールを受け取るためのチャンネルを用意して、下の設定マークのボタンから設定画面に入ります。

Webhooksという項目があるのでそこをクリックして

Webhookを作成をクリックします。
僕は既にGmailという名前で作っているので一個表示されていますね。

出てくる画面で任意の名前を付けると、WebhookのURLが発行されるので保管しておきます。後で使います。

また、このURLにアクセスするとTokenが手に入るのでブラウザでアクセスして取得しておきます。

GASを書く

念のために説明をしておきますと、GASとは Google Apps Script の略で、JavaScriptと似たような言語を使ってGoogleのサービスと連携したりしたツールを作れます。
Googleのサービスと連携するので、当然Gmailも呼び出すことができるわけです。
これはスプレッドシートから編集することができます。
ここのツールというボタンを押して、スクリプトエディタを選択すればスクリプトの編集画面に行きます。

基本は任意の関数を置いて、指定のトリガーでその関数を起動させるという感じです。
では実際にコードを書いていきます。

まずDiscordのWebhookにメッセージをPOSTする関数を作ります。


function discord(postMsg){
  const webhooks = '取得したURL'
  const token = '取得したToken';
  const channel = 'Discordで投稿するチャンネル名';
  const userName = 'Discordで表示する名前';
  const parse = 'full';
  const methods = 'post';
  
  const payload = {
    'token': token,
    'channel': '#mails',
    'content' : postMsg,
    'parse': parse,
  };
  
  const params = {
    'method': methods,
    'payload' : payload,
    'muteHttpExceptions': true,
  };
  response = UrlFetchApp.fetch(webhooks, params);
}

次に、Gmailの情報を一定間隔で取得してその内容をDiscord関数に渡して実行する関数を作ります。


function mails(){
  var searchQuery = "Gmailで取得したい検索クエリ(例:to(me@gmail.com))";
  var dt = new Date();
  
  //メールをチェックする頻度を指定します。短すぎるとGmailの制限に引っかかります。
  const checkSpanMinute = 30;
  dt.setMinutes(dt.getMinutes() - checkSpanMinute);

  var threads = GmailApp.search(searchQuery);

  var msgs = GmailApp.getMessagesForThreads(threads);
  for(var i = 0; i < msgs.length; i++) {
    var lastMsgDt = threads[i].getLastMessageDate();

    if(lastMsgDt.getTime() < dt.getTime()) {
      break;
    }

    for(var j = 0; j < msgs[i].length; j++) {
      var msgDate = msgs[i][j].getDate();
      var msgBody = msgs[i][j].getPlainBody();
      var msgFrom = msgs[i][j].getFrom();
      var matches = msgFrom.match(/"(.+)".*<(.+)>/)
      {
        var subject = msgs[i][j].getSubject();
       //取得したデータを最終的に受け取りたいフォーマットに整えます。Discordでは[```]を引用符として使えるので前後に着けています。
        var postMsg = "```" + "\n" +
          Utilities.formatDate(msgDate, 'Asia/Tokyo', 'yyyy/MM/dd hh:mm:ss') + "\n" +
              "件名:" + subject + "\n" +
              "[hr]" +
               msgBody + 
            "```";
 
        discord(postMsg);

      }
    }
  }
}

こんな感じのスクリプトを書いてあげます。

完成したら一度実行->関数を指定して実行、でmails関数を実行して問題ないか確かめましょう。

トリガーを設定する

編集->現在のプロジェクトのトリガーからトリガーの設定画面に入れます。
トリガーを追加から時間主導型で checkSpanMinute で設定したスパンでmails関数を実行するように設定します。

これであとはGoogleのサーバーでスクリプトを自動的に実行してくれるようになります。

まとめ

これで、よく使うツールでGmailを取得できるようになりました。
実際に運用してからかなりメールの確認漏れが減りました。
何より、メールの連絡と普段の連絡を同じツールで管理できるというのがQOL高くていい感じです。
皆さんもGASを使って身の回りを少し便利にしてみてはいかがでしょうか?

21
16
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
21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?