6
3

CoDMONの登園降園通知をLINEグループに転送する

Last updated at Posted at 2024-05-30

この記事の対象者

  • 保育園・幼稚園に通園している未就学児がいる
  • 在籍園がCoDMONを導入し、登降園をアプリ管理している
  • 登降園通知メールをLINEに転送したい

はじめに

子供の在籍園がCoDMONを導入したのですが、子供の祖父母がスマホを使いこなせないため、
祖父母による送迎時の登降園手続きは物理カードで代用しています。
祖父母はLINEなら使えるので、登園降園通知をLINEのpush通知で配信したい!と思い作成しました。
GmailとLINEのアカウント、PCがあれば無料で実装できます。

準備するもの

  • Gmailのアカウント
  • LINEのアカウント

手順(あとでスクショ足します)

gmailでCodMONから来るメールにラベルが来るように設定する

  1. gmailのメールアドレスでCodMONに登録し、登園降園のお知らせがメールで来るように設定する
  2. gmailでCoDMONから送られてくるメールに「コドモン通知」タグがつくように設定する 参考手順 

LINE Notifyでアクセストークンを発行する

  1. LINE Notifyにログイン
  2. 通知したい相手もしくはグループを選択し、アクセストークンを発行する
         ※一度発行したトークンは再確認できないので注意
         ※LINE Notifyを祖父母も入ったLINEグループに招待するのがおすすめ

GASでトリガーを設定する

  1. GASにアクセスし、「新しいプロジェクトを作成する」をクリックする
  2. 下のコードをコピペして、1行目の「AAAAAA」部分を取得したトークンに差し変え、「保存する」をクリック
  3. 「トリガー」→「トリガーを追加」をクリックし、
    実行する関数を「main」
    実行するデプロイを「Head」
    イベントのソースを「時間主導型」
         時間ベースのトリガーのタイプを「分ベースのタイマー」
         時間の間隔を「5分おき」に設定し、「保存」をクリック

LINE Notifyをグループに招待する

対象のLINEグループに「LINE Notify」を招待する。

コード

codmon_gmail_to_line.js
var lineToken = "AAAAAAAAAA";  // LINE Notifyのトークン。ここを書き換えてください
var intervalMinute = 5; //5分前~現在の新着メールを取得 #--トリガーの時間間隔をこれに合わせる

/**
 * 取得したメッセージをLINEに転送する
 */
function main() {

  // 転送するメッセージを取得
  var newMessages = fetchMail();
    //console.log("メールを取得しました");

  // 取得したメッセージをLINEに転送
  newMessages.forEach( msg => {
    //console.log("msg: " + msg);
    forwardLine(msg);
  })

}

/**
 * 転送するメッセージを取得する
 */
function fetchMail() {

  // 取得の基準時刻をセット
  var nowTime       = Math.floor( new Date().getTime() / 1000 );  // 現在時刻  // getTime()はミリ秒を返すので、検索のために秒に変換(÷1000)する
  var referenceTime = nowTime - ( ( intervalMinute * 60 ) + 3 );  // intervalMinuteは分で設定しているので、秒に変換(÷60)し、さらに3秒前に

  // 検索条件を指定
  // NOTE: 「コドモン通知」ラベルをGmailで指定しておくこと
  var strSearch = '(label:コドモン通知 after:' + referenceTime + ')';

  // スレッドを検索して取得
  // NOTE: 複数回登降園タッチする可能性もあるため、念の為4スレッドに制限
  var arrThreads = GmailApp.search(strSearch, 0, 4);

  // スレッドからメッセージを取得
  // NOTE: 二次元配列で、[[スレッドのインデックス][メッセージのインデックス]]で参照できる
  var arrMsgs = GmailApp.getMessagesForThreads(arrThreads);


  // ①基準時刻より後で、②エラーメッセージではないもの(正常メール)を抽出し配列に格納
  var newMsgs = [];

  arrMsgs.forEach( thread => {
    thread.forEach( msg => {

      // ①秒換算し、基準時刻より後かを判定(boolean)
      // getTime()はミリ秒を返すので、検索のために秒に変換(÷1000)する
      var isAfter = ( (msg.getDate() / 1000 - referenceTime ) > 0 );

      // ②正常かを判定(boolean)。コドモンからのメールは【保育所名】で始まるので、「【」から始まるメールを正常メールとして扱う
      var isFine  = msg.getSubject().startsWith('');

      // メール本文のデバッグ用 //
      //console.log('isAfter: ' + isAfter);
      //console.log('isFine:  ' + isFine);
      //console.log('msg.getDate(): ' + msg.getDate());
      //console.log('msg.getSubject(): ' + msg.getSubject());
      //console.log('msg.getPlainBody(): ' + msg.getPlainBody());


      if (isAfter && isFine) {
        // メッセージ文字列を生成。本文のみでよい。時間や送信者、件名も必要な場合はコメントアウトを消してください
        var strMsg = " "
          //  時間。Utilities.formatDate(date, timeZone, format)で日付フォーマットを指定する。 //
        //デフォルトではEastern Standard Timeが指定されているため、'Asia/Tokyo'で日本時間への変更が必要。
          //+ Utilities.formatDate(msg.getDate() , 'Asia/Tokyo', 'MM/dd HH:mm')
          //+ "\n\n[送信者]" + msg.getFrom()
          //+ "\n\n[件名]"   + msg.getSubject()
          // 本文のみ転送 
          +  msg.getPlainBody();
        // 配列に追加
        //console.log(strMsg)
        newMsgs.push(strMsg);
      }

    })
  })

 return newMsgs;
}


/**
 * LINEにメッセージを転送する
 * @param {String} Me メッセージの内容
 */
function forwardLine(Me) {

  var payload = {'message' : Me};
  var options = {
    "method"  : "post",
    "payload" : payload,
    "headers" : {"Authorization" : "Bearer "+ lineToken}  
  };

  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);

}

感想

  • 昔はIFTTT使ってたのですが、無料プラン縮小したのとgmailとの連携廃止したのでGASに乗り換えました。
  • 無料でできるの、よい
  • 9時になってもタッチがない場合はアラート出す(送り忘れ防止)とかもそのうち実装したいなぁ

参考にした記事

https://qiita.com/hann-solo/items/83208cd686d401bdf800
https://qiita.com/hann-solo/items/5aae93dd9352c21e5a3f

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3