こんにちは~。「デザインもできるシステムエンジニア」のあつもり(@atumori17)です。
今日も「時間クリエーター」としてバシバシ時短に取り組んでます!
今回はGoogle Apps Scriptを使い、Gmailで特定の件名のメールを受信したらLINEに通知するプログラムの紹介です。
私はチャットワークを使用しているのですが、スマホにアプリをインストールしておらず、グループチャットでの発言の通知を全てGmailで受け取っていました。
でもGmailだと通知が届いたのに気づかないことがけっこうあったんですね。そこでGmailで受け取った通知メールをLINEに転送できないかな~って思っていたところ、LINEのWeb APIが使える!ということを知り、やってみようとなったわけですっ。
まあでもスマホにチャットワークアプリを入れればこんなことしなくていいんですけどね・・・他の用途にも使えるし、勉強にもなるし何事もチャレンジということで。興味のある人は見ていってくださいね~。
目次
LINEのWeb APIサービスを使えるように設定する
まずはLINEのWeb APIを使えるようにする必要があります。それでは順を追って説明していきますね。
LINE Notifyの設定する
まずは下記URLにアクセスします。
LINEをインストールしたときに登録した「メールアドレス」「パスワード」を入力します。
「登録したメールアドレスと、パスワードなんて忘れちゃったよ」という人。心配しないでください。調べ方がありますからっ。
まずはスマホからLINEを開きます。
「その他」→「設定」→「アカウント」→「メールアドレス」の順にタップすることで確認できます。
それではWeb APIの設定の説明にもどります。
画面右上の「マイページ」をクリックします。
トークンを発行するをクリックします
トークン名に適当な名前を入れ、1:1でLINE Notifyから通知を受け取るをクリックします。そして画面下にある「発行する」ボタンをクリックします。
するとトークンが発行されるので、コピーボタンを押してコピーし、テキストエディタなどに保存しておきます。このトークンはWeb APIを使うためのパスワードのようなものだと思っておいてください。
これで準備OKです。次にGoogle Apps Scriptでスクリプトを書いていきます。
Gmailでメールを受信したらLINEに通知メッセージを送るスクリプト
Web APIの設定が終わったところで、今度はGoogle Apps ScriptでGmailメールを操作するスクリプトを書いていきます。
今回のスクリプトは「特定の文字が件名に入っていたらLINEと連携して通知メッセージを送る」ようにします。
Goooleのサイトを開き、「Googleドライブ」→「マイドライブ」→「その他」→「Google Apps Script」の順でクリックし、スクリプエディタを開きます。
続いて下記のコードを入力します。プロジェクト名は「特定のメールをLine転送」などとし保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
var FindSubject = 'subject:(チャットワーク) '; function getMail(){ //指定した件名のスレッドを検索して取得 var myThreads = GmailApp.search(FindSubject, 0, 10); //スレッドからメールを取得し二次元配列に格納 var myMessages = GmailApp.getMessagesForThreads(myThreads); for(var i in myMessages){ for(var j in myMessages[i]){ //スターがないメッセージのみ処理 if(!myMessages[i][j].isStarred()){ var strDate = myMessages[i][j].getDate(); var strSubject = myMessages[i][j].getSubject(); var strMessage = myMessages[i][j].getPlainBody().slice(0,200); //LINEにメッセージを送信 sendLine(strDate,strSubject,strMessage); //処理済みのメッセージをスターをつける myMessages[i][j].star(); } } } } function sendLine(strDate,strSubject,strMessage){ //Lineに送信するためのトークン var strToken = "FGHHHHH11111111111111111111111111"; var options = { "method" : "post", "payload" : "message=" + strDate + strSubject + strMessage, "headers" : {"Authorization" : "Bearer "+ strToken} }; UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options); } |
プログラムコードの解説
それではプログラムコードの解説をしていきます。「とりあえず動けばいい」という人は読み飛ばしてください。
searchメソッドで指定した件名のメールを取得する
1 2 3 4 |
//指定した件名のスレッドを検索して取得 var myThreads = GmailApp.search(FindSubject, 0, 10); //スレッドからメールを取得し二次元配列に格納 var myMessages = GmailApp.getMessagesForThreads(myThreads); |
検索条件はスクリプトの1行目で指定している、subject:(チャットワーク)です。件名にチャットワークという文言が入ったメールだけを抽出します。
スレッドの読み込み開始位置は0を指定すると、検索条件にヒットした中で最新の日付のスレッドから取得します。スレッドの最大数はこの開始位置からいくつ日付を遡って、スレッドを取得するかを指定します。仕様では500が最大になっています。
getMessagesForThreadsメソッドでスレッドからメールを取得する
searchメソッドで取得した全てのスレッドに入っているメールを取得して二次元配列に格納します。
For文でメールの数だけ処理を繰り返す
1 2 |
for(var i in myMessages){ for(var j in myMessages[i]){ |
最初のfor文はスレッドの数だけ繰り返します。
次の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)
スターがついていないメールだけを取得する
isStarredメソッドを使うとスターがついているかを調べることができます。ついている場合はture、ついていない場合はFalseを返します。
メールから日時、件名、本文を取得する
Messageオブジェクト.getDate()
Messageオブジェクト.getSubject()
Messageオブジェクト.getPlainBody().slice(開始位置,文字数)
日時はgetDate()、件名はgetSubject()、本文はgetPlainBody()を使用します。
getPlainBody()の開始位置は取り出す本文の開始位置、文字数は開始位置から何文字抜き出すかを指定します。
関数sendLineに引数を渡してLINEに通知を送信する
関数sendLineに引数である、日時、件名、本文を渡します。
さきほど発行したトークンをダブルクォーションの中に貼り付けます。
LINEに通知済みのメールにスターをつける
starメソッドでメールにスターをつけることができます。ここでスターをつけておかないと、後でこのスクリプトを実行したときに、LINEに送った通知を再び送ってしまうことになります。
下記のようにスターがついてないメールのみ、関数sendLineをコールするような処理にしてるためです。
1 2 3 4 5 6 7 8 |
if(!myMessages[i][j].isStarred()){ var strDate = myMessages[i][j].getDate(); var strSubject = myMessages[i][j].getSubject(); var strMessage = myMessages[i][j].getPlainBody().slice(0,200); //LINEにメッセージを送信 sendLine(strDate,strSubject,strMessage); |
プログラムコードの説明は以上です。
トリガーの設定をする
最後にトリガーを設定します。トリガーとはどのようなタイミングでプログラムを動かすかを指定する設定です。
メニューから「編集」「現在のプロジェクトのトリガー」をクリックします
タイマーを5分ごとに設定します。
これで5分ごとにメールをチェックしてLINEに送るという設定ができました。
プログラムの動作確認
それでは実際にプログラムが動くか試してみましょう。ドキドキしますね~。
Gmailの受信トレイにチャットワークから通知メールが届きました。
おお~!LINEにも通知が届きました。ちょっと感動!
以上で説明を終わります。
まとめ
いかがでしたか?今回はGoogle Apps ScriptでGmailの特定のメールを受信したらLINEと連携して通知する方法を紹介しました。
Gmailに届くメールで重要なメールだけLINEで通知したり、アイデア次第で便利に使えそうです。
今回の内容をまとめます。
- LINEのWeb APIサービスを使うためのトークンを発行する
- 特定のメールを受信したらLINEに通知するスクリプトを作成する
- トリガーの設定をする
以上おつかれさまでした~。
その使い方だと損してます!
会社員、個人事業主のかたへ。
無料で登録できるAmazonビジネスアカウントを知ってますか?
何と言っても便利なのが請求書払いによる後払いができるということ。
また、承認ルールを作成すれば、業務上必要な物だけに購入を制限することができます。
さらに多くの商品にビジネスアカウント価格が設定されており、個人アカウントより安く購入できます。
このように個人アカウントと比べてビジネスアカウントはお得な機能や特典がついています。
無料で登録できるので、会社員、個人事業主なら使ったほうが得なのは言うまでもありません。
コメント
[…] こちらを参考にしました。 […]