Google Apps ScriptでGmailの特定のメールを受信したらLINEと連携して通知する

こんにちは~。「デザインもできるシステムエンジニア」のあつもり(@atumori17)です。
今日も「時間クリエーター」としてバシバシ時短に取り組んでます!

今回はGoogle Apps Scriptを使い、Gmailで特定の件名のメールを受信したらLINEに通知するプログラムの紹介です。

私はチャットワークを使用しているのですが、スマホにアプリをインストールしておらず、グループチャットでの発言の通知を全てGmailで受け取っていました

でもGmailだと通知が届いたのに気づかないことがけっこうあったんですね。そこでGmailで受け取った通知メールをLINEに転送できないかな~って思っていたところ、LINEのWeb APIが使える!ということを知り、やってみようとなったわけですっ。

まあでもスマホにチャットワークアプリを入れればこんなことしなくていいんですけどね・・・他の用途にも使えるし、何事もチャレンジということで。

LINEのWeb APIサービスを使えるように設定する

LINE Notifyの設定する

下記URLにアクセスします。

https://notify-bot.line.me/ja/

LINEをインストールしたときに登録したメールアドレスと、パスワードを入力します。

登録したメールアドレスの調べ方ですが、スマホからLINEを開き、その他、設定、アカウント、メールアドレスの順にタップすることで確認できます。

画面右上のマイページをクリックします。

トークンを発行するをクリックします

トークン名に適当な名前を入れ、1:1でLINE Notifyから通知を受け取るをクリックします。画面下にある「発行する」ボタンをクリックします。

コピーボタンを押して発行されたトークンをテキストエディタなどに保存しておきます。

これで準備OKです。次にGoogle Apps Scriptでスクリプトを書いていきます。

Gmailでメールを受信したらLINEに通知メッセージを送るスクリプト

ではGoogle Apps ScriptでGmailメールを操作していきます。特定の文字が件名に入っていたらLINEと連携して通知メッセージを送るようにします。

Googleドライブ、マイドライブ、その他、Google Apps Scriptの順でクリックし、スクリプエディタを開きます。下記のコードを入力します。プロジェクト名は「特定のメールをLine転送」などとし保存します。

プログラムコードの解説

searchメソッドで指定した件名のメールを取得する

GmailApp.search(検索条件, スレッドの読み込み開始位置, スレッドの最大取得数)

検索条件はスクリプトの1行目で指定している、subject:(チャットワーク)です。件名にチャットワークという文言が入ったメールだけを抽出します。

スレッドの読み込み開始位置は0を指定すると、検索条件にヒットした中で最新の日付のスレッドから取得します。スレッドの最大数はこの開始位置からいくつ日付を遡って、スレッドを取得するかを指定します。仕様では500が最大になっています。

getMessagesForThreadsメソッドでスレッドからメールを取得する

GmailApp.getMessagesForThreads(スレッド)

searchメソッドで取得した全てのスレッドに入っているメールを取得して二次元配列に格納します。

For文でメールの数だけ処理を繰り返す

for(var i in myMessages)

最初のfor文はスレッドの数だけ繰り返します。

for(var j in myMessages[i])

次のfor文はスレッド内のメールの数だけ繰り返します。

ちょっとわかりにくいと思いますので、下記の図のようなメールを受信した場合を例にしてみます。スレッド数は全部で3つ。一番上のスレッドのみメールが5通入っています。

「受信したメールを返信」というようなことを繰り返すと、このように一つのスレッドにメールがまとめられます

残り2つのスレッドは数字が表示されていませんね。その場合は返信などのやりとりをしておらずスレッドに紐づくメールは1通だけです。

このメールを2次元配列であるmyMessagesで表すと以下のようになります。

YOUYUBEからのメール
1スレッド目の1番目のメールはmyMessages(0,0)
1スレッド目の2番目のメールはmyMessages(0,1)
1スレッド目の3番目のメールはmyMessages(0,2)
1スレッド目の4番目のメールはmyMessages(0,3)
1スレッド目の5番目のメールはmyMessages(0,4)

Lookout Mobile Securityからのメール
2スレッド目の1番目のメールはmyMessages(1,0)

Google+からのメール
3スレッド目の1番目のメールはmyMessages(2,0)

スターがついていないメールだけを取得する

Messageオブジェクト.isStarred()

isStarredメソッドを使うとスターがついているかを調べることができます。ついている場合はture、ついていない場合はFalseを返します。

メールから日時、件名、本文を取得する

Messageオブジェクト.getDate()

Messageオブジェクト.getSubject()

Messageオブジェクト.getPlainBody().slice(開始位置,文字数)

日時はgetDate()、件名はgetSubject()、本文はgetPlainBody()を使用します。

getPlainBody()の開始位置は取り出す本文の開始位置、文字数は開始位置から何文字抜き出すかを指定します。

関数sendLineに引数を渡してLINEに通知を送信する

sendLine(日時,件名,本文)

関数sendLineに引数である、日時、件名、本文を渡します。

var token = “LINEトークン”

さきほど発行したトークンをダブルクォーションの中に貼り付けます。

LINEに通知済みのメールにスターをつける

Messagesオブジェクト.star()

starメソッドでメールにスターをつけることができます。ここでスターをつけておかないと、後でこのスクリプトを実行したときに、LINEに送った通知を再び送ってしまうことになります。
下記のようにスターがついてないメールのみ、関数sendLineをコールするような処理にしてるためです。

トリガーの設定をする

編集、現在のプロジェクトのトリガーをクリックします

タイマーを5分ごとに設定します。

プログラムの動作確認

Gmailの受信トレイにチャットワークから通知メールが届きました。

LINEにも通知が届きました。

まとめ

いかがでしたか?Gmailに届くメールで重要なメールだけLINEで通知したり、アイデア次第で便利に使えそうです。

今回の内容をまとめます。

  • LINEのWeb APIサービスを使うためのトークンを発行する
  • 特定のメールを受信したらLINEに通知するスクリプトを作成する
  • トリガーの設定をする

以上おつかれさまでした~。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする