GASでGmailの自動削除をしよう(複数条件対応)
この記事で出来ること
AWS S3のライフサイクルポリシーのように、Gmailの自動削除をGASで実装します。
書きやすかったので、またGASネタを擦ることになりました...
実装に関するアドバイスをいただけると嬉しいです。
intro
エンジニアのみならず、お勤めの企業によっては
メールを飛ばしまくる運用をしている場合があると思います。
メールの増えすぎで何が起こるかというと
- 不要メールのフィルタリングが要る
- GoogleDriveがメールでパンクする
という2点が大きく問題になってくるでしょう。
G Suiteのプランによっては、GoogleDriveが30GBしかないので
ファイル+Gmailで30GBと考えると、割とシビアな状況に発展しかねません。
そこで今回は、GoogleAppsScriptを用いて
『◯日経過したGmailは自動でゴミ箱に移動する』というシステムを実現しましょう。
しかも、複数のフィルタ条件を1つの関数で処理出来ます。
コード
//条件を複数セット可
const configmaps = [
{'older_than':'365d','label':'mylabel'},
{'older_than':'90d','subject':'sub2'}
]
//実行間隔(分)
const interval = 15
//時間取得
const NowTime = new Date();
const NowHour = NowTime.getUTCHours() + 9 //UTC -> JST
const NowMinutes = NowTime.getUTCMinutes()
// const NowDayOfWeek = NowTime.getDay()
//実行するマップの決定
const rotation = NowHour*(60/interval) + Math.floor(NowMinutes/interval) +1
const elem = rotation%configmaps.length
//メイン
function main (){
execfilter = generateFilterFromMap(configmaps[elem])
deleteMail(execfilter)
}
//Mapを検索条件の形に整形
function generateFilterFromMap(map){
let filter = ''
for( key in map ) {
filter += key + ':' + map[key] + ' '
}
//スター付きを除外
filter += '-is:starred'
return filter
}
//メールを削除 (100件 x5)
function deleteMail(filter) {
console.log('filter -> ' + filter)
let count = 0
let targetThreads = GmailApp.search(filter,0,100)
while ( targetThreads.length != 0 && count < 5){
GmailApp.moveThreadsToTrash(targetThreads)
console.log('loop ' + (count + 1) + ' -> ' + targetThreads.length + 'threads were deleted')
targetThreads = GmailApp.search(filter,0,100)
count++
}
}
コードの説明
上記コードが何をしているのかと言うと
・gmailの検索条件を設定
・1日(24時間)を分割して番号振り→順番に実行
・検索して引っ掛かったものを100件ずつ削除(最大500件)
といった具合です。
configmap の書き方
上記のコードだと
・『365日経過した"mylabel"というラベルのメール』を削除
・『90日経過した"sub2"という件名のメール』を削除
といった意味合いになります。
//実行間隔(分)
const interval = 15
これはトリガーの実行間隔を指します(後ほど解説)
使い方
- GoogleAppsScript にアクセス
- 新しいプロジェクトを作成
新しいプロジェクト - ↑のコードを貼り付け
-
configmaps
・実行間隔
に適切な値を入れる - 実行トリガーを設定する。画像の場合は15分おきなので、コードの
実行間隔
も15にしておく
トリガーで定期実行だ
適切に設定しよう -
main
を実行して、動くか試してみる
実装に関して
・何故500件ずつなのか
GASの処理限界時間を超えないよう、余裕をもってこの件数になりました。
・わざわざMAPで条件を実装した理由
これに関していえば、より分かりやすいかなと思ったからです。
変数を使う場合でも+
で結合するよりいいかなと思ったので。
outro
1トリガーで複数条件をどう回すか頭を悩ませました
結果
(24時間
× 1時間あたりの実行回数
) % 条件の数
という数式を思いつき、一つのトリガーで複数条件の削除を回せるようになりました。
とはいえ、実行回数に余りが出てしまうため
一日のうちいくつかの条件は多めに実行されてしまいます。
そこを上手いことやりたいんですが、まだ考え中です。
Discussion