Gmailのメールを条件指定して一括削除するApps Script

Gmailのメールを条件指定して一括削除するApps Script


# Gmail# Google Apps Script

はじめに

Google Driveの容量が圧迫されてきたので、Gmailで不要なメールをまとめて削除するためのGoogle Apps Scriptを書きました。 (その場しのぎですが、まあやらないよりは…)

Gmailの画面から検索して消していくと一度に50件ずつしか削除できず手作業では非常に面倒です。 既存のWeb上にも似たようなスクリプトがあったものの削除が1件ずつ実行されていてかなり遅かったり、自分が想定している挙動とは少し違っていたりしたので、自分用に作りました。

いつか誰かが使うこともあると思うので、指定したGmail検索条件に一致するスレッドをまとめてゴミ箱に移動するスクリプトを残しておきます。

本文

スクリプト

Apps Scriptで以下を実行します。

searchQueryにはGmailの検索ボックスに入力するものと同じ条件を指定できます。例えば特定の送信元からのメールを消したい場合は、from:[email protected]のように指定します。

function deleteEmails() {
  const searchQuery = "from:[email protected]"; // 検索条件。Gmailの画面上で入力するものと同じはず
  const searchBatchSize = 500; // 一度に取得するスレッド数
  const deleteBatchSize = 100; // GmailApp.moveThreadsToTrash の上限
  let deletedCount = 0;

  while (true) {
    const threads = GmailApp.search(searchQuery, 0, searchBatchSize);
    const numThreads = threads.length;

    if (numThreads === 0) {
      Logger.log("対象のメールの削除がおわりました");
      break;
    }

    // 一度に100件までしか削除できないので分割して処理
    for (let i = 0; i < numThreads; i += deleteBatchSize) {
      const deleteTargets = threads.slice(i, i + deleteBatchSize);
      GmailApp.moveThreadsToTrash(deleteTargets);
      Utilities.sleep(1000);
    }

    deletedCount += numThreads;
    Logger.log(deletedCount + "件のスレッドを削除");

    Utilities.sleep(1000);
  }
}

処理の流れ

やっていることは単純です。

  1. GmailApp.searchで条件に一致するスレッドを取得する
  2. GmailApp.moveThreadsToTrashでゴミ箱に移動する
  3. 対象がなくなるまで繰り返す

ポイントというほどではないですが、GmailApp.searchGmailApp.moveThreadsToTrashで処理できる件数が異なるため、deleteBatchSizeを定義して分割して処理を行うようにしています。

実行前に検索条件を確認する

このスクリプトは条件に一致したスレッドをまとめてゴミ箱へ移動するので、searchQueryを間違えると想定外のメールまで対象になります。 そのため以下のように事前に条件が間違っていないか確認をしておくと良いと思います。

  • 先にGmailの画面で同じ検索条件を入力して、削除対象が意図したものだけになっているか
  • 数件削除したら処理を終了させる

条件は以下のようなものを使えるので、なかなか柔軟にできそうです。

from:[email protected]
from:[email protected] older_than:1y
subject:(unsubscribe) older_than:6m

クォータや実行時間のエラーについて

Apps ScriptやGmail APIまわりのクォータ、実行時間の制限などでエラーになることがあります。

細かく調べきれていませんが、バッチでゴミ箱へ移動しても劇的に速いというほどではありませんでした。 大量に対象がある場合は、途中で落ちる前提で考えておいたほうが良さそうです。

このスクリプトは毎回同じ検索条件で検索し直しているため、途中でエラーになった場合でも、基本的には再実行すれば残りの対象から処理が続きます。予期せぬエラーが出たときは、まず再実行で良いかなと思っています。

まとめ

Gmailで条件に一致するメールをまとめて削除したかったので、Apps Scriptでスレッド単位にゴミ箱へ移動するスクリプトを作りました。 自分がやったことを残しておけばAIにも「前やったアレなんだっけ?」みたいに聞けるというのも少し期待しています。