🤖

Gmailを定期的に削除するGASを作ってみた

2023/11/16に公開

Gmailを定期的に削除するGASを作ってみた

Gmailは容量が15GBまで無料で利用できますが、それを超えると有料プランに切り替える必要があります。
この容量はGmailの他に、Googleドライブ、Googleフォトと共用の容量となっています。
不要なメールでこれらの容量を圧迫するのを防ぐために、定期的にメールを削除する必要に迫られましたが、
Gmailのフィルターを利用してメールを削除する場合は、受信時に削除されるため、メールを確認する前に削除されてしまう可能性があります。

そこで、メールを削除するまでの日数を指定することで、一定期間経過後にメールを削除する処理をGASを利用して作成しました。

本記事では、前半にユーザーとして使うための方法を記載し、後半にGASの説明をします。
ソースコード及びGAS含むスプレッドシートは下記で公開しています。
https://github.com/KzclassLLC/GmailDeletionTool

https://docs.google.com/spreadsheets/d/1dRjMZD7eZHcL8aIzlyBBVpI5HbYYpPOXdKDiRb62OPI/edit

ツールの概要

特徴

  • ユーザー定義のラベルに基づいてメールを削除します。
  • ネストされたラベルをサポートします。
  • スター付きのメールは削除されません。
  • 自動削除を設定した後、1 時間につき 100 件の対象メールが削除されます。
  • スプレッドシートの言語設定に基づき、日本語と英語で動作します。サポート外の言語の場合は英語で動作します。

使い方

  1. Gmailでラベルを定義します。ラベル名の後には '@' と、メールを削除するまでの日数を指定します。
    例えば、'general@365'のラベルがつけられたメールは、受信後 365 日以上経過した場合に削除されます。
    image

    カテゴリに分類されているメールについては、下記のように、カテゴリというラベルにネストしたラベルを用意します。
    カテゴリ/プロモーション@30
    image

  2. 下記のスプレッドシートを開き、自分のGoogleドライブへコピーをします。
    https://docs.google.com/spreadsheets/d/1dRjMZD7eZHcL8aIzlyBBVpI5HbYYpPOXdKDiRb62OPI/edit
    スプレッドシートをコピー後は、スプレッドシートのメニュー>設定を開き、言語と地域が日本以外の場合は日本に設定してください。

    または、スプレッドシートを開いた後、本スクリプトをGoogleスプレッドシートのスクリプトエディタにコピーします。
    対象は下記の 3 つのファイルです。

    • src/client.js
    • src/main.js
    • src/const.js
  3. スプレッドシートを開き、メニューバーの一番右にある 'Gmail削除ツール' をクリックします。
    image

    下記のメニューが表示されます。

    • 自動削除をセットする
    • 自動削除をストップする
    • 一回だけ削除する

    最初に「一回だけ削除する」を実行し、動作を確認してください。
    なお、初めて実行する際は、アクセス許可を求められますので、下記ページを参考に、許可をしてください。
    https://zenn.dev/kzautomation/articles/9e1595f65420be
    認証を行った後、再度「一回だけ削除する」を実行してください。終了のダイアログが表示されれば、正常に動 作しています。
    その後に「自動削除をセットする」を実行すると、自動削除が開始されます。

制限事項

  • タイムアウトを防ぐため、1 回の実行で最大 100 通削除します。
  • ラベルがネストされている場合、スクリプトは子ラベルのみを対象とします。
  • '@' がないラベルや '@' の後に正の整数以外があるラベルは処理されません。

GASの概要

ソースコードは下記の GitHub にあります。
https://github.com/KzclassLLC/GmailDeletionTool

どのメールを削除するか?

メールを自動で削除するという性質上、ユーザーが意図していないメールを削除するおそれがあります。
そのため、ラベルがついているメールのみを削除するようにしました。
また、削除対象のラベルと、どの程度の期間経過したメールを削除するかについて、ユーザーが定義できるようにしたいと考えていました。

当初、スプレッドシートでリストを定義することを考えましたが、Gmailとスプレッドシートを行ったり来たりしながら設定するのは面倒くさいと考え、Gmailのラベル名自体に日数を入れ込んでおくという仕様にしました。
general@365 というように、ラベル名の後ろに@と削除するまでの日数を指定します。

関数の説明

下記の関数で実現しています。
これ以外に、スプレッドシートのメニューを表示する関数もありますが、本筋ではないため省略します。

ラベルのを取得し、削除するメインの関数

https://github.com/KzclassLLC/GmailDeletionTool/blob/main/src/main.js#L9-L31

Gmailで使用しているラベルは、GmailApp.getLabels()で取得できます。すごく簡単です。
後は各ラベルで、削除対象のメールがあるかを判定していきます。

ラベルがついたメールを取得し、削除する関数

https://github.com/KzclassLLC/GmailDeletionTool/blob/main/src/main.js#L33-L67

後述する、検索条件を作成する関数を使って、ラベルがついたメールを取得します。
GASの制限時間に引っかからないように、1 回の実行で削除する件数をカウントするために、削除するメールの件数をカウントしています。
threads として取得したメールを一括で削除する moveThreadsToTrash 関数があるので、まとめて削除しています。

ラベルがついたメールを取得するための検索条件を作成する関数

https://github.com/KzclassLLC/GmailDeletionTool/blob/main/src/main.js#L69-L99

ラベルが条件を満たしいてるかの判定と、カテゴリを指定されているかの判定をした後に、検索条件を作成します。
デフォルトで用意されているカテゴリと、ユーザーが作るラベルではGmailの検索演算子が異なるため、下記のようなカテゴリと検索演算子の対応表を作成し、不一致ならユーザーラベルと判断、テーブルに追加する方法にしています。

https://github.com/KzclassLLC/GmailDeletionTool/blob/main/src/const.js#L12-L25

ラベルが条件を満たしているかの判定をする関数

https://github.com/KzclassLLC/GmailDeletionTool/blob/main/src/main.js#L101-L136

ラベルに@が含まれているか?@の以降に数字があるか?を判定します。
削除対象となるラベルだった場合は、削除する日数も取得して返却します。

ログとトースト

https://github.com/KzclassLLC/GmailDeletionTool/blob/main/src/main.js#L138-L146

これは見ての通りです。

まとめ

GASでGmailを定期的に削除するツールを作成しました。
GASでは、Gmailを簡単に操作するためのサービスが色々ありますので、このように簡単なスクリプトで便利なツールを作ることができます。
Googleの各種サービスを使用して、ちょっと面倒くさい作業がある場合や、定期的に実施したい作業がある場合、このようなツールを作成することで、作業の効率化ができます。
Google Workspace をお使いの方、Gmailの容量で困っている方、GASの勉強をされている方の参考になれば幸いです。

Discussion