✉️

Gmailに未読メールがある場合、他デバイスにメールで通知するスクリプトを作ってみたでGAS

2022/08/10に公開

動機

Google Workspaceを導入している。のに、社内ルール等に縛られて利便性が悪い。

  • 社内PC以外でのログイン禁止
  • もちろん社用/私用に関係なくスマホでのログインも禁止
  • 社内PCは設置場所が決まっている(業務場所とは異なる場所に設置されている)

Gmail宛てにメールが届くことは少ない。
けど、社内外からたまーにメールが送られてくることもあり、メールのチェックは一応しておかないといけない。
届いてない可能性が高いメールをわざわざチェックするのも手間なのでなんとかしたい。
手っ取り早いのは、メールを社用スマホのキャリアメールとかに転送する方法だろうが、メール転送は規則的に駄目らしい。
それならばということで、メールが届いた場合、社用スマホのキャリアメールにメールが届いたことを通知するような仕組みなら規則に触れないはず!と思い立ちスクリプトを作ることにした。
同じような環境の人がいないことを願いつつも、念のため、記事として残しておきます。

動作内容

  • 定期的にGmailをチェックする
  • 新着メール(未読メール)がある場合、指定したメールアドレスにメールを送信し、通知する
    (今回は社用スマホのキャリアメールにメールを送信する)
  • 通知済みの新着メールは再通知しない(通知が来てもスグにメールを確認できない場合がある)

動作環境

  • Googleスプレッドシート
    • 設定値等を保存する
    • コンテナバインド型とし、スクリプト本体も含める

準備

Googleスプレッドシート(1/2)

  1. Googleドライブ内にGoogleスプレッドシートを新規作成(ファイル名は任意)
  2. 作成したスプレッドシートを開き、シート名を 設定 に変更
  3. とりあえず以下の構成でデータを入力(A1~B3に入力すること)
    Googleスプレッドシート
A列 B列
実行間隔(分): 5
通知先メルアド: ここにメールアドレスを入力する
最新未読メールid:

スクリプト本体

  1. スプレッドシートのツールバーから[拡張機能] > [Apps Script]の順に選択し、エディタを開く
  2. エディタの内容を削除する
  3. 以下のコードをコピーし、エディタに貼り付ける
  4. コードを保存し、一旦エディタを閉じる
const SETTING_SHEET_NAME ='設定';
const SETTING_TRIGGER_MINUTES ='B1';
const SETTING_MAIL_ADDRES ='B2';
const SETTING_LATEST_MAIL_ID ='B3';

function initialStart() {
  // 設定値取得
  const settingSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SETTING_SHEET_NAME);
  const settingTriggerMinutes = settingSheet.getRange(SETTING_TRIGGER_MINUTES).getValue();

  // 全てのトリガーを取得し削除
  const triggers = ScriptApp.getProjectTriggers();
  for (const trigger of triggers) {
    ScriptApp.deleteTrigger(trigger);
  }

  const functionName = 'checkMail';
  if (0 < settingTriggerMinutes) {
    // トリガー設定
   ScriptApp
      .newTrigger(functionName)
      .timeBased()
      .everyMinutes(settingTriggerMinutes)
      .create();

    // とりあえず初回分を実行
    eval(`${functionName}()`);

    Browser.msgBox('タイマーを設定');      
  } else {
    Browser.msgBox('タイマー設定を削除');
  }
}

function checkMail() {
  // 未読メールを1スレッド取得
  const threads = GmailApp.search('label:unread', 0, 1);
  if (0 < threads.length) {
    // スレッドのメッセージを降順で取得
    const messages = threads[0].getMessages().reverse();
    for (const message of messages) {
      // スレッド内の未読メッセージを検索
      if (!message.isUnread())
        continue;

      // 未読メール発見
      const settings = getSettings();
      const mailTo = settings[0][0];
      const latestMailId = settings[1][0];

      if (latestMailId != message.getId()) {
        const id = message.getId()
        const date = message.getDate();

        let body = 'メール情報';
        body += '\nid:' + id;
        body += '\ndate:' + Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd');
        body += '\ntime:' + Utilities.formatDate(date, 'Asia/Tokyo', 'HH:mm:ss');
        body += '\nfrom:' + '…';
        body += '\n件名:' + '…';
        body += '\n本文:' + '…';

        sendMail(mailTo, body);
        setLatestMailId(id);
      }
      break;
    }
  }
}

function getSettings() {
  const settingSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SETTING_SHEET_NAME);
  return settingSheet.getRange(SETTING_MAIL_ADDRES + ':' + SETTING_LATEST_MAIL_ID).getValues();
}

function setLatestMailId(setLatestMailId) {
  const settingSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SETTING_SHEET_NAME);
  return settingSheet.getRange(SETTING_LATEST_MAIL_ID).setValue(setLatestMailId);
}

function sendMail(to, body) {
  const subject = '未読メール有り'
  GmailApp.sendEmail(
    to,
    subject,
    body,
  );
}

function omit(string, omit = -1, harfMode = true) {
  return '…';
}

Googleスプレッドシート(2/2)

  1. スプレッドシートに戻り、B1セル を選択する

  2. ツールバーから[データ] > [データの入力規則]の順に選択し、設定画面を開く

  3. 以下の内容で設定する
    セル範囲: '設定'!B1
    条件: リストを直接指定 0,1,5,10,15,30
    セルにプルダウン リストを表示: 有効
    データの入力規則

  4. ツールバーから[挿入] > [図形描画]の順に選択し、図形描画画面を開く

  5. スクリプト実行用ボタン(っぽい図形)を作成し、保存して画面を終了する
    図形描画
    6.スプレッドシートに図形が挿入されるので、図形を[右クリック] > [スクリプトを割り当て]の順に選択し、スクリプトを割り当て画面を開く

  6. initialStart を入力し、保存する
    スクリプトを割り当て

実行

  1. Gmail宛にテストメールを送信するか、開封済みのメールを未読にしておく。
  2. スプレッドシートの実行間隔(分)通知先メルアドを設定し、最終確認
  3. スクリプト実行用ボタン(っぽい図形)をクリックする
  4. 初回実行時は承認を要求されるため、指示に従い承認する
    承認が必要
    アカウントを選択

アプリの確認1

アプリの確認2
Googleアカウントへのアクセスをリクエストしています
メッセージボックス

例外エラー

停止

  1. 実行間隔に 0 を入力し、スクリプト実行用ボタン(っぽい図形)をクリックする
  2. タイマー設定が削除され、スクリプトが停止する
    タイマー設定を削除

終わりに

実際には、今回記事にしたスクリプトを少し変更している

  • 通知メールをフィルタリングしやすいように、送信元(from)のアドレスと名前を変更
  • 本文、件名等は最初の数文字をマスクせずに元のメッセージを表示

作ってみて思ったけど、使い方によっては他にも応用できそうなスクリプトでは?
監視対象をメール以外にするとか、逆に新着メールをもとにGoogleスプレッドシートを作成するとか...
なにか面白い応用例があれば教えてください
あと、スクリプトに不備や不足等があればお気軽にコメントください!

Discussion