Gmailに未読メールがある場合、他デバイスにメールで通知するスクリプトを作ってみたでGAS
動機
Google Workspaceを導入している。のに、社内ルール等に縛られて利便性が悪い。
- 社内PC以外でのログイン禁止
- もちろん社用/私用に関係なくスマホでのログインも禁止
- 社内PCは設置場所が決まっている(業務場所とは異なる場所に設置されている)
Gmail宛てにメールが届くことは少ない。
けど、社内外からたまーにメールが送られてくることもあり、メールのチェックは一応しておかないといけない。
届いてない可能性が高いメールをわざわざチェックするのも手間なのでなんとかしたい。
手っ取り早いのは、メールを社用スマホのキャリアメールとかに転送する方法だろうが、メール転送は規則的に駄目らしい。
それならばということで、メールが届いた場合、社用スマホのキャリアメールにメールが届いたことを通知するような仕組みなら規則に触れないはず!と思い立ちスクリプトを作ることにした。
同じような環境の人がいないことを願いつつも、念のため、記事として残しておきます。
動作内容
- 定期的にGmailをチェックする
- 新着メール(未読メール)がある場合、指定したメールアドレスにメールを送信し、通知する
(今回は社用スマホのキャリアメールにメールを送信する) - 通知済みの新着メールは再通知しない(通知が来てもスグにメールを確認できない場合がある)
動作環境
- Googleスプレッドシート
- 設定値等を保存する
- コンテナバインド型とし、スクリプト本体も含める
準備
Googleスプレッドシート(1/2)
- Googleドライブ内にGoogleスプレッドシートを新規作成(ファイル名は任意)
- 作成したスプレッドシートを開き、シート名を
設定
に変更 - とりあえず以下の構成でデータを入力(A1~B3に入力すること)
A列 | B列 |
---|---|
実行間隔(分): | 5 |
通知先メルアド: | ここにメールアドレスを入力する |
最新未読メールid: |
スクリプト本体
- スプレッドシートのツールバーから[拡張機能] > [Apps Script]の順に選択し、エディタを開く
- エディタの内容を削除する
- 以下のコードをコピーし、エディタに貼り付ける
- コードを保存し、一旦エディタを閉じる
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)
-
スプレッドシートに戻り、
B1セル
を選択する -
ツールバーから[データ] > [データの入力規則]の順に選択し、設定画面を開く
-
以下の内容で設定する
セル範囲:'設定'!B1
条件:リストを直接指定
0,1,5,10,15,30
セルにプルダウン リストを表示:有効
-
ツールバーから[挿入] > [図形描画]の順に選択し、図形描画画面を開く
-
スクリプト実行用ボタン(っぽい図形)を作成し、保存して画面を終了する
6.スプレッドシートに図形が挿入されるので、図形を[右クリック] > [スクリプトを割り当て]の順に選択し、スクリプトを割り当て画面を開く -
initialStart
を入力し、保存する
実行
- Gmail宛にテストメールを送信するか、開封済みのメールを未読にしておく。
- スプレッドシートの
実行間隔(分)
と通知先メルアド
を設定し、最終確認 - スクリプト実行用ボタン(っぽい図形)をクリックする
- 初回実行時は承認を要求されるため、指示に従い承認する
停止
- 実行間隔に
0
を入力し、スクリプト実行用ボタン(っぽい図形)をクリックする - タイマー設定が削除され、スクリプトが停止する
終わりに
実際には、今回記事にしたスクリプトを少し変更している
- 通知メールをフィルタリングしやすいように、送信元(from)のアドレスと名前を変更
本文、件名等は最初の数文字をマスクせずに元のメッセージを表示
作ってみて思ったけど、使い方によっては他にも応用できそうなスクリプトでは?
監視対象をメール以外にするとか、逆に新着メールをもとにGoogleスプレッドシートを作成するとか...
なにか面白い応用例があれば教えてください
あと、スクリプトに不備や不足等があればお気軽にコメントください!
Discussion