GASでGmailの振り分け・通知サポート
初めて投稿します
Qiitaのアカウントを開設してみました。
正直、人様の役に立つようなナレッジは持ち合わせてないのだけど、どっかにアウトプットしないときっとすぐに忘れるので、恥を忍んで書いてみることにしました。
初回は前から運用しているGAS(Google Apps Script)について公開してみようと思います。
GASって略すの未だに慣れないんですよね。
GASはGoogle Apps版のVBAみたいなものと最初は理解していたのですが、簡易的なウェブサービスというかAPIなんかも作れそうだと思い、興味が湧きました。最初はTwitter APIを使って、ツイートとメンションを記録するボット(これはIFTTTでできるね)とか、対話ボット(docomoの対話APIを使用)や訂正ボットなんかを実験的に動かしてました。今は専ら、Gmailや連絡先やGoogleカレンダーの痒いところに手を届かすスクリプトを運用しています。
迷惑メールフォルダーに移動する
本当はGmailのフィルターで実現したいところなのですが、何故か迷惑メールフォルダーに移動ができないんですよね…
たぶん、迷惑メールフォルダーに入れることで迷惑メールと学習してるんでしょうから、機械的にごみ箱代わりに流し込まないで!という意図なんでしょうけど。
ただ、迷惑だと感じてるメールはごみ箱ではなくて、迷惑メールフォルダーに流し込みたい。機械的に。なので、今回は
- Gmailのフィルターで[スパム]というタグを付けておき、
- GASで[スパム]タグの付いたメールを刈り取って、迷惑メールフォルダーに流し込む
の2段階で処理することにしました。もちろん「フィルターでタグ付け」という一手間を踏まず、フィルターの条件をクエリに書けば1発でも行けますが、フィルタはメール受信時に動きますから、いらん通知を受けたり、タイミングによっては受信トレイで迷惑メールが目に入るといったことを避けることができるんですよね。
コードはこれだけ。実行頻度は困り具合に応じてお好みで。
function moveToSpam() {
GmailApp.search("label:スパム").forEach(function (thread) {
thread.moveToSpam();
});
}
自動アーカイブする
受信トレイはキレイに保ちたいし概ね保てていると思っているのですが、ちょっとでも自動化できたらいいなと思って作りました。
ロジックは見ての通りで、下記の条件に合うメールを検索(Gmailの検索式)して、それをアーカイブしてるだけです。
- 受信トレイにあって
- 受信して30日を超過
- 既読
- ラベルが付いてる
- ☆がついてない
- 重要でない
受信トレイに置いておきたいメールはいつも☆を付けとくので、これくらいの条件がぴったりでした。
function moveToArchive() {
GmailApp.search("in:inbox is:read has:userlabels -is:starred -is:important older_than:30d").forEach(function (thread) {
thread.moveToArchive();
});
}
余談ですが、以前はfunction(thread)
とスペースを入れずに書いていたのですが、最近はfunction (thread)
とスペースを入れて書くようにしています。function
という関数ではなくて、無名関数なんですね。js-beautifyを使ってて、恥ずかしながら最近気づきました。
既読後、放置しているメールを再プッシュ
相変わらず、○○の一つ覚えみたいなロジックで恐縮なのですが。もしかしたら、アイディアというか皆様の使い所のヒントになるかもしれませんから、一応公開してみます。
メールを着信したときにメールは開くのですが、中身をろくに読まずに放置することが多いので、
- 受信トレイにあって
- 受信して3~4日
- 既読
のメールを再プッシュしています。
メーラーをSparkにしてからは放置が減ったので、最近は発動してないです。
function notifyUnreadMail() {
GmailApp.search("in:inbox is:unread newer_than:4d older_than:3d").forEach(function (thread) {
thread.getMessages().forEach(function (message) {
notifySlack(…);
});
});
}
中身を読まないメールはプッシュだけして削除する
ログインアラートとかの通知は受けたいけど、中身は読まないメールは自分宛にSlackして、メールは削除してます。
条件はお好みで。通知は自前の関数を呼んでいますが、LINEでもTwitterでもIFTTTでもお好みでどうぞ。
function notifyMail() {
GmailApp.search("is:unread subject:(ログインのお知らせ|…)").forEach(function (thread) {
const subject = thread.getFirstMessageSubject();
thread.getMessages().forEach(function (message) {
notifySlack(…);
});
thread.moveToTrash();
});
}
最後に
今回はGmail周りの簡単なスクリプトを載せて見ましたが、実は他にもカレンダー登録のサポートとか、連絡先のメンテナンスとかのスクリプトがあって、こちらのほうが重宝しているかも。こちらはまた改めて。
(Qiita始めたばかりなので、次があるかわかりませんが)