Google Apps Scriptで特定のGmail新着メールをLineに通知

  • URLをコピーしました!

こんにちは。保育園からくるメールに気付かない事が多く、朝保育園に行ったらお休みという事がたまにあるので、LINE通知をして気付きやすくするのと家族で共有するようにしました。

「LineNotify」と「Google Apps Script」を使って簡単に実現出来ます。

目次

LineNotifyでアクセストークンの取得

LineNotify(https://notify-bot.line.me/ja/)よりマイページを選択して、「トークンを発行する」からアクセストークンを取得します。

トークンは一度しか表示されないので忘れないようにメモします。

Google Apps Scriptにてソース作成

Google Apps Script(https://script.google.com/home)より新しいプロジェクトを作成します。

以下ソースをコピーします。

最初の3行を書き換えて下さい。

Google Apps Scriptにてトリガー作成

[表示]-[現在のプロジェクトのトリガー]を選択します。

トリガーの作成を選択し、以下設定を行います。
ソースの「var get_interval = 30;」部分と赤枠部分を合わせておきます。

ちなみに、トリガーを登録しようとすると、「このアプリは確認されていません」と出ました。対処方法を詳細に記載されているサイトをご紹介させて頂きます。
https://tonari-it.com/gas-script-approval/

これで終わりです。とても簡単!!

2020/07/21追記 エラー:その操作を実行するには承認が必要です。

数日前から「その操作を実行するには承認が必要です。」のエラーメールが届くようになりました。

特にパスワードも権限系の設定も変えた覚えもないんだけど、、と思い調べたところ最近同様のケースが発生しているようです。
https://teratail.com/questions/278164

以下設定画面で「Google Apps Script API」がオフになっていたので、オンにしました。こんなのあったかなー。仕様追加されたんですかね。
https://script.google.com/home/usersettings

これだけだとエラーが解消されないので、次に関数を実行します。

すると以下メッセージが出てくるので、「許可を確認」を選択するとアカウント選択画面が表示されるので、アカウントを選択します。

次に「このアプリは確認されていません」が表示されるので、小さい文字の「詳細」をクリックします。

「安全ではないページに移動」を選択すると

リクエストを許可して完了です。

  • URLをコピーしました!

コメント

コメント一覧 (13件)

  • 現在、地元の消防団の出動命令で使わせていただいております。
    今までメールでのみ、通知が来ていたので、気が付くのに時間がかかっておりました。
    大変、感謝しております。

    ところで、場所の通知が「&」のところで切れてしまいます。

    (メール)
    下記をクリックすると地図を表示します。
    http://map.navitime.jp/?datum=1&lon=142.21.42.16&lat=43.45.44.83&nam=&cp=fgss

    (LINE通知)
    http://map.navitime.jp/?datum=1&

    原因を特定できますでしょうか

    • カズヒロさま
      コメントありがとうございます。
      素晴らしい用途ですね!!

      URLが&で切れるという事ですが、私の環境でも同じ現象が発生しました。URLをencodeURIComponentでエンコードしたら解決すると思います。URLだけ切り出すのが面倒だったので、メッセージ全体をエンコードしたんですけど、私の環境では問題なく通知出来ました。

      具体的には22行目の下に以下を追加します。
      var strMessage = encodeURIComponent(strMessage);

      上手くいくといいですね!

      • 動作確認できました!!!
        &でメッセージが切れてしまうって、不思議な現象でしたが、無事解決しました。
        これで場所が簡単に確認できるようになりました。
        ありがとうございます!

        • 何度もすみません。
          以前ご指定いただいたように、22行目の下(23行目)にエンコード用の一文を追加していると思うのですが、「&」以降が切れてしまっています。
          大変申し訳ありませんが、もう一度教えていただけないでしょうか。

          for(var i in myMessages){
          var lastNo =myMessages[i].length-1;
          var strDate = Utilities.formatDate( myMessages[i][lastNo].getDate(), ‘Asia/Tokyo’, ‘M/d HH:mm’);
          var strSubject = myMessages[i][lastNo].getSubject();
          var strMessage = encodeURIComponent(strMessage);
          var strMessage = myMessages[i][lastNo].getPlainBody().slice(0,500);

          //LINEにメッセージを送信
          sendLine(strDate,strSubject,strMessage);

          //メッセージを既読にする
          myMessages[i][lastNo].markRead();
          }

          • カズヒロさま
            コメントありがとうございます。お返事が遅くなってすみません。
            ソースを変えてないのに、突然そうなったのか、ちょっと状況がよくわかりませんが、貼り付けてもらったソースを見る限り、encodeURIComponentをする位置が違うように思います。

          • ご返信ありがとうございます。

            具体的には

            22行目を
            var strSubject = myMessages[i][lastNo].getSubject();var strMessage = encodeURIComponent(strMessage);

            または、

            23行目を
            var strMessage = encodeURIComponent(strMessage);myMessages[i][lastNo].getPlainBody().slice(0,500);

            または、

            22行目 var strSubject = myMessages[i][lastNo].getSubject();
            23行目 var strMessage = encodeURIComponent(strMessage);
            24行目 var strMessage = myMessages[i][lastNo].getPlainBody().slice(0,500);

            のいずれなのでしょうか。

          • カズヒロさま
            コメントありがとうございます。
            ソースは他にコメント頂いた方から指摘があり変更しているので、行数が変わっていると思います。
            「sendLine(strDate,strSubject,strMessage);」の直前でエンコードします。
            もしくは以下のようにsendLine内でエンコードしてもいいと思いますが、試してないです。
            「sendLine(strDate,strSubject,encodeURIComponent(strMessage));」

          • いつもありがとうございます。
            早速、Archivesなどを見返しながら修正させていただきます。
            以前のgoogleのシステム変更のときにスクリプトをいじくってしまったときに、おかしくなったのかもしれません。
            また、ご報告させていただきます

  • スクリプトをありがたく使わせてもらっています。全件のメールを取得するようにしているのですが、返信や転送で来たメールは最新のものではなく、一番元のメールがLINEには届きます。回避する方法をご教授いただけると幸いです。

    • きよさま
      コメントありがとうございます。
      なるほど~。取得しているのがスレッドなので、
      今のままだと確かに最初のメッセージが表示されてしまいますね。
      過去のやり取りを全部表示しても良ければforループの中を以下に変更します。

      var lastNo =myMessages[i].length-1;
      var strDate = Utilities.formatDate( myMessages[i][lastNo].getDate(), ‘Asia/Tokyo’, ‘M/d HH:mm’);
      var strSubject = myMessages[i][lastNo].getSubject();
      var strMessage = myMessages[i][lastNo].getPlainBody().slice(0,500);
      //LINEにメッセージを送信
      sendLine(strDate,strSubject,strMessage);
      //メッセージを既読にする
      myMessages[i][lastNo].markRead();

      なんですけど、全部表示されるのはちょっと鬱陶しいかもですねー。
      lastNoのもう一つ前のメッセージの最初の1行目を検索して、
      その文を見つけたら、その行以降カットする、
      とか入れたら実現出来そうですが、ごめんなさい、そちらは試してないです。

      参考になれば幸いです。自分のもlastNoに直しておきます☆

      • わざわざありがとうございます。細かいことをやりだすと複雑ですね(;’∀’) 仕組みがよくわからないのでfor ループのところをコピーさせていただいたんですが,なぜかエラーに??少し勉強してみます。
        また良い方法がありましたら教えてください。

        • きよさま
          エラー。。どうしてだろう。。お役に立てなくてごめんなさい。
          配列の[0]→[lastNo]への変更なのですがエラーが解決出来ないようでしたら、またエラー内容を教えてくださいね。上手く行きますように。

          • 数日経ってから実行したらいけました!ありがとうございます。

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次