Help us understand the problem. What is going on with this article?

【GAS】大事なメールがきた時に人気声優がチャットワークで教えてくれるやつを作った

More than 1 year has passed since last update.

はじめに

みなさん!メールチェックしてますか!?
久しぶりにメールアプリを開いたら大量にメールがあって見る気も失せた!大事なメールもどっかに行った!
そんな経験、あると思います。
大事なメールに気づく方法は色々あると思いますが、大事だけど興味のないメールの通知をいちいち受け取ってたらストレスが溜まる一方。
そこで今回はストレスなく重要メールを見落とさないようにする方法を紹介します。

今回やること

Gmail内の特定のラベルがついたメールをGASで読み取り、更新があればchatworkに通知します。
流れ.png
それでは細かく解説して行きます

Gmailでラベルをつける

まずGmailから設定して行きます。
今回、重要なメールを識別するためにフィルタ機能を使いラベルを付与します。
スクリーンショット 2018-03-30 15.22.50.png
ただ、これだけでは一度通知したメールをなんども通知してしまうため、認識用に
'wuglove_isread'
というラベルも作成しました。
こちらはラベルだけ作成して、フィルタなどの条件は設定しなくて大丈夫です。

ChatworkAPIを使えるようにする

次にチャットワークにチャットを投稿できるようにAPI Tokenを取得します。
スクリーンショット 2018-03-30 15.32.39.png
右上のAPI設定から

スクリーンショット 2018-03-30 15.32.55.png
Tokenを発行します。

※ビジネスプラン・エンタープライズプラン・KDDI ChatWorkの場合はTokenの取得にシステム管理者の承認が必要になります。設定画面に行こうとするとメール送信するか聞かれるので、そちらから申請してください(ご所属の組織のルールにしたがって申請してください)

次にチャットを流すルームのIDを取得します。
ルームIDは、対象のルームを開いた時のURL
'https://www.chatwork.com/#!ridxxxxxxxx'
のxxxxxxxxの部分です。

To付きで通知をしたい場合はユーザIDも必要になります。
スクリーンショット 2018-03-30 15.42.19.png
この数字の部分です。

GASで検知、送信する

この記事のメイン、GASの設定について説明します。
今回スプレッドシートは使わないので空のシートを作って、スクリプトエディタを開いてください。
スクリーンショット 2018-03-30 15.46.12.png

まずチャットワークに送信する部分を作ります

notifyGmail.gs
/**
 * チャットワークにメッセージを送信する
 *
 * @param {string} message チャットワークに送信するメッセージ
 * @return {void}
 */
function send(message) {
  var params = {
        headers : {"X-ChatWorkToken" : '上で取得したトークン'},
        method : "post",
        payload : { body : message }
      }
    , url = "https://api.chatwork.com/v2/rooms/" + '上で取得したルームID' + "/messages"
    ;

  UrlFetchApp.fetch(url, params);
}

ここはただ仕様通りにAPIを叩いているだけなので、詳しくは割愛します。

次に実際に定期実行する部分を書いて行きます

notifyGmail.gs
var API_TOKEN = '上で取得したトークン'
  , ROOM_ID = '上で取得したルームID'
  , TARGET_ID = '上で取得したユーザID'
  , UNREAD_LABEL = GmailApp.getUserLabelByName('wuglove')
  , ISREAD_LABEL = GmailApp.getUserLabelByName('wuglove_isread')
  ;

/**
 * 新着メッセージがないか確認する
 *
 * @return {void}
 */
function checkNewMessage() {
  var query = '(label:wuglove)'
    , thread = GmailApp.search(query, 0, 3)
    , importantMessages = GmailApp.getMessagesForThreads(thread)
    ;

  for(var i in importantMessages) {
    var body = ''
      , message = ''
      ;

    body = importantMessages[i][0].getPlainBody() || null;
    message = "[To:" + TARGET_ID + "]ねぎくん\nわぐらぶからメールが届いたから読み上げるね\n\n" + body;

    send(message);
  }

  // 一度通知したものを再通知しないようにラベルを変更
  thread.forEach(function(t) {
    t.removeLabel(UNREAD_LABEL);
    t.addLabel(ISREAD_LABEL);
  });
}
query = '(label:wuglove)'

こちらはGmailの検索窓で検索を行う時のクエリを入れます。
今回は細かい設定はGmail側で行う想定なのでlabelの指定のみを行なっています。

body = importantMessages[i][0].getPlainBody() || null;

Gmailではメールがスレッドごとのまとまりで管理されています。
スクリーンショット 2018-03-30 16.01.47.png
(2)とかで表現されるやつです。
今回はスレッドを形成しないメールを前提に書いているので、i番目のスレッドの最初のメール内容だけを取得しています。

ソースコードは以上ですが、このままでは実行ボタンを押した時にしか更新確認を押してくれないので意味がありません。
そこでGASのトリガーを使って繰り返し実行してもらいます

スクリーンショット 2018-03-30 16.15.57.png
左上のタイマーみたいなマークです

スクリーンショット 2018-03-30 17.43.38.png

そこまでリアルタイムじゃなくてもいい内容なので1時間周期に設定しました。
こちらは分刻みで指定したり、毎朝7時台…などの設定もできるのでユースケースに合わせて設定してください。

これでメールを受信すると…
スクリーンショット 2018-03-29 17.52.21.png
無事届いた:tada:

おわりに

Crashlyticsのクラッシュ通知やAmazon CloudWatchのアラートなど、重要で見逃せないけどどんどん溜まっていってしまうメールはいっぱいあると思います。
今回はチャット送信のみの対応でしたが、これではまだストレスフリーとは言い難いので、将来的には実際に声優がメール内容を読み上げてくれるようにしたいと思っています。

青山吉能

人気声優ユニットWake Up, Girls!のリーダー。
愛称はよっぴー、吉能、よっぴーちーず。
代表主演は恋愛暴君のグリ。
かわいい。
aoyama_kanban.jpg
https://ddnavi.com/interview/292692/a/ より引用

shunXnegi
今日みんなを一番の笑顔にするエンジニアを目指して
https://twitter.com/shunXnegi
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away