メールでしか来ない子供の連絡をLINEに通知する

インシデント発生

子供がアフタースクール(学童)から勝手に帰ってしまい、一人で自宅に入れない状態となった。
2時間程度家の前で待ちぼうけていた。親の帰宅がいつもより早かったことと、近所の方が気にかけて声をかけてくれていて大事にはならなかったが、再発防止策を検討。
アフタースクール側の言い分では本人が行かないと発言したことを真に受けたとのこと。利用申請をしているのに、当日小学一年生が言ったことをそのまま信用して一人で帰すのは信じられないが、期待するだけ無駄なので事実の確認のみ。
本人は利用証を忘れてしまったため、入れないと思ってしまったとのこと。忘れたことを話せばいいし、父母に連絡を取ってもらえるから大人に頼るよう伝える。頼りにならない大人に囲まれて育った親のせいで、大人を信用しないことが自然に伝わっていて申し訳ない。

再発防止策

自分の子供を信用するとはいえ、仕組みで再発防止策を講じるにあたり現状整理。
入室にはカードキー的なものがあり、入所・退所時は親が指定したメールアドレスに通知が送られる。
利用日と利用時間はWEBで予約し、別途本人が予約内容を転記した紙を利用時に毎度提出する。
メール通知が来るものの、普段使いしているメールなのでプッシュ通知はしていないことから気づくことが遅れてしまった。

特定のメールだけをプッシュ通知したい

メーラーでの設定もできるが、今回は夫婦のグループLINEに入室メッセージを通知させる方法を採用した。
また、おまけとして入室通知を確認したかどうかのリマインドもする。早期発見でインシデントが起きても早くカバーができるようにする。

手法

利用するツールについて、LineNotify、IFTTTもしくはZapierを使えば実現できそうだとアタリをつけて調査。
LineNotifyは問題なし。
しかしZapierはWebhookでLineNotifyへの送信が必要になり、有料プラン契約が必要で今回の対象からは除外。これ以外に今のところ使い道ないので。
IFTTTは使えるっぽい、メールへのアクセス権限が少し気になるけど。
Gmailへのアクセスが簡単で定期実行もできるGASを採用する。

まずはGoogleドライブにGASプロジェクトを作成。

左上の「新規」から「Google Apps Script」を選択

エディタが表示される。

GASのエディタ

入力済みの内容をすべて消して、以下のコードをコピペする。

const subject = 'subject:(ここに検索したい文字列を入力)'
 
function getMail() {
  // 指定した件名のスレッドを検索して取得
  const threads = GmailApp.search(subject, 0, 10);

  for (const thread of threads) {
    const messages = thread.getMessages();
    for (const message of messages) {
      if (!message.isUnread()) {
        continue;
      }
      const date = message.getDate();
      // LINEにメッセージを送信
      sendLine(date);
      // 既読にする
      message.markRead();
    }
  }
}

const sendLine = (date) => {
  // Lineに送信するためのトークン
  const token = "ここにトークンを入力";
  const options = {
    "method"  : "POST",
    "payload" : `message=入室時間通知 ${date}`,
    "headers" : {
      "Authorization" : `Bearer ${token}`
    }
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}

貼り付けた状態は画像の状態になる

コピペ後のエディタ

1行目の subject 部分、「ここに検索したい文字列を入力」を、通知したいメール件名の変更がない部分に置き換える。
今回は「入室時間のお知らせ」とした。

メールの例

次にLineNotifyを設定する。

アカウントを持っていない人は作成してログイン後、マイページから新規のAPIキーを発行する。

マイページのトークン発行ボタン

トークンの名前(利用用途)と、通知したいトークルームを設定する。
作成するとAPIトークンが表示される。コピーしてGASの「ここにトークンを入力」部分に貼り付ける。再作成しないと確認できないので注意。

コピーしたらすぐGASに貼り付ける

これでコードは完成。

定期実行のトリガーを設定する

GASの左メニューから「トリガー」を選択して、移動したページで「トリガーを追加」を選択する。

トリガーを追加

トリガーの設定は関数が「getMail」になっていることを確認。
イベントのソースを「時間手動型」にする。
時間ベースのトリガータイプを「分ベースのタイマー」にする。
時間の感覚を「1分」にする。
保存する。

トリガー設定

うまくいっているとこんな感じで通知が来る。

LINE通知サンプル

注意点

GASが分かる人は見ればわかるが、GmailApp.search を利用している。
検索するスレッド件数が10件なので、一度に10件までしか取得できない。
検索に該当するメールが大量に来る人は検索件数を多くしたらいい。
また、トリガー感覚の短さと検索に引っかかる件数の問題も注意しておくべき。
GmailApp.search で取得できる件数は一般ユーザーだと、1日20000件まで。
これを超えないように工夫する。トリガー感覚を長くするとか、検索クエリを工夫するなど。
どちらもちゃんと設定しており、一般的な人なら問題ないはず。

おまけ: リマンド

方法はいくつか考えられる。
別途LINE通知専用の関数を追加して、日付ベースのトリガーで起動する方法。

日付ベースのトリガー

ただ、この方法は見てわかる通り1時間のうち、どこかで起動する設定になってしまう。
メリットとしては共通で見られること。
時間をある程度正確に通知してほしい、曜日ごとに変えたい、平日だけにしたいといったカスタマイズを考えると他の方法を使ったほうがいい。
iPhoneユーザーならデフォルトで入っている「リマインダー」で出来る。
Androidでもリマインダー系のアプリを使えば代替できるだろう。

リマインダーの設定


この記事が気に入ったらサポートをしてみませんか?