GASでGmailを効率化する方法 〜もしあなたがシステム管理者だったら〜

朝9時、サーバーモニタリングのアラートが鳴る。システム管理者として、君は既に戦場にいる。次々と入ってくるメール、どれも一刻を争うかのように見える。目の前の画面には「未読:253件」の通知が冷たく表示されている。メールを処理する暇なんてない。だが、この未読の海からどうにかして脱出しなければならない。

システム管理者がGmailで重要なメールを受けるかどうかなんていう野暮なツッコミはなしにて、Gmailには幸いにもGoogle Apps Script(GAS)という救命ボートがある。今日はそれを使って、Gmailの管理を少しでも楽にする方法を考えてみよう。


目的

大量のメールの処理は、誰にとってもストレスの源だ。もしあなたがGmailを使っていてそう思うなら、GASを使って効率化することで、不要なメールを自動で整理し、本当に重要なメッセージに集中できるようにする事も出来る。このスクリプトを導入すれば、毎日何百通もの無駄な通知に苛立つことも少なくなるだろう。


準備

  1. Gmailアカウント:これは必須。システム管理者なら当然のように持っているものだが、ここで問題はその数ではない。問題は、どれだけ君がその膨大な量に耐えられるかだ。
  2. GASエディタ:Googleスプレッドシートから、拡張機能 > Apps Scriptを開く。多くの人がこれを面倒に感じるかもしれないが、管理者にとっては日常の一部に過ぎない。

コードの説明

まずは、未読メールを検索し、それにラベルを付け、重要なものだけを目立たせる簡単なスクリプトだ。この一手間で、君の時間と労力はぐっと削減される。

function manageEmails() {
  // 未読メールを検索
  const query = 'is:unread';
  const threads = GmailApp.search(query);

  // 未読メールが見つかった場合、重要なものをラベル付け
  if (threads.length > 0) {
    for (let i = 0; i < threads.length; i++) {
      const thread = threads[i];
      if (thread.getFirstMessageSubject().match(/サーバーダウン|緊急/)) {
        const label = GmailApp.getUserLabelByName('重要');
        thread.addLabel(label);
        Logger.log('重要なメールを検出しました: ' + thread.getFirstMessageSubject());
      }
      thread.markRead();
    }
  } else {
    Logger.log('未読のメールはありません。');
  }
}

コードのポイント

  1. constを使って固定の値を設定querythreadsのような値は変更されないため、constで宣言する。
  2. letはループ内でのみ使用iのように変化する変数はletで宣言し、スコープを限定する。
  3. ラベル操作addLabel()を使って、「サーバーダウン」や「緊急」というキーワードを含むメールに自動でラベルを追加。これで、緊急対応が必要なものだけを最優先で処理できる。

制限と注意点

GASを使う際には、いくつかの制限や注意点がある。これを無視すると、システム管理者としての時間が無駄に削がれる可能性がある。

1. 1日の実行リミット

GASは、Gmail APIを使って1日あたりの操作に制限を設けている。通常のアカウントだと、1日20,000通までメールの処理が可能だ。しかし、膨大な数のメールを処理するシステム管理者にとって、この制限はすぐに達するかもしれない。制限を超えると、その日はスクリプトが止まってしまう。この瞬間、君の忙しさは元通りだ。

2. 削除操作のリスク

メールを削除するのは慎重に行う必要がある。GASで誤って重要な通知を消してしまった場合、その責任を負うのは君だ。だから、削除よりもアーカイブやラベル付けといった管理方法を優先した方が安全だ。

function deleteEmails() {
  const query = 'subject:「未処理」';
  const threads = GmailApp.search(query);
  
  for (let i = 0; i < threads.length; i++) {
    const thread = threads[i];
    thread.moveToTrash();
    Logger.log('メールを削除しました: ' + thread.getFirstMessageSubject());
  }
}

3. 頻繁なリクエストを避ける

GASで頻繁にメールを操作すると、Gmail APIのリクエスト数上限に達することがある。定期的にスクリプトを実行するのは良いが、無駄なリクエストを避けるため、重要なメールだけを対象にするフィルターを活用しよう。


Gmailの特定機能

了解しました。フィルタリングによるメール管理を、より細かく、実践的に充実させた内容にします。


【GASでGmailを効率化する方法】システム管理者の叫び - 第4弾


フィルタリングによる細かな管理

システム管理者として、受信トレイが膨大な量の通知やレポートであふれ返るのは日常茶飯事だろう。Gmail自体にはフィルタリング機能があるが、それをGASでさらに細かく制御することで、重要なメールをすぐに見つけ出し、不要なものは自動的にアーカイブや削除することができる。

ここでは、送信者件名などを条件にメールをフィルタリングし、それに基づいて自動で処理を行う方法を紹介する。これにより、重要なメールが埋もれてしまうリスクを大幅に軽減できる。


基本的なフィルタリング:送信者と件名での検索

例えば、定期的に届く障害報告やシステム通知を送信元のドメインや件名の一部でフィルタリングし、対応が必要なメールだけをピックアップできる。以下のスクリプトでは、送信元がadmin@example.comで、件名に「障害報告」が含まれるメールを検索して処理する。

function filterEmails() {
  // 特定の送信者と件名でフィルタリング
  const query = 'from:admin@example.com subject:「障害報告」';
  const threads = GmailApp.search(query);

  if (threads.length > 0) {
    for (let i = 0; i < threads.length; i++) {
      const thread = threads[i];
      Logger.log('フィルタされたメール: ' + thread.getFirstMessageSubject());

      // ラベルを付けてアーカイブ
      const label = GmailApp.getUserLabelByName('障害報告');
      thread.addLabel(label);
      thread.moveToArchive();
    }
    Logger.log(threads.length + '件のメールをアーカイブしました。');
  } else {
    Logger.log('フィルタされたメールはありません。');
  }
}

ポイント解説

  • from::指定された送信者からのメールをフィルタリング。ここではadmin@example.comを使っているが、実際の運用ではサーバーやモニタリングツールからの通知に合わせて調整可能。
  • subject::件名に特定のキーワードが含まれるメールだけをフィルタリング。この例では「障害報告」を基準にしているが、その他の通知やアラートに合わせて変更できる。

複数条件でのフィルタリング

さらに、複数の条件を組み合わせてより細かくフィルタリングすることも可能だ。例えば、特定の送信者からの重要な障害報告のみを検索したい場合、次のようなクエリが考えられる。

function advancedFilterEmails() {
  // 複数条件でフィルタリング
  const query = 'from:admin@example.com subject:「障害報告」 is:unread label:重要';
  const threads = GmailApp.search(query);

  if (threads.length > 0) {
    for (let i = 0; i < threads.length; i++) {
      const thread = threads[i];
      Logger.log('重要なメールをフィルタ: ' + thread.getFirstMessageSubject());

      // 重要なメールに特定のラベルを追加してアーカイブ
      const label = GmailApp.getUserLabelByName('緊急対応');
      thread.addLabel(label);
      thread.moveToArchive();
    }
    Logger.log(threads.length + '件の重要なメールをアーカイブしました。');
  } else {
    Logger.log('該当する重要なメールはありません。');
  }
}

ポイント解説

  • is:unread:未読メールのみを対象にするフィルター。これにより、既に処理済みのメールを除外できる。
  • label::特定のラベルが付いているメールに絞ってフィルタリング。たとえば「重要」というラベルが付いているメールだけを対象にすることで、さらなる絞り込みが可能。

日付によるフィルタリング

定期的に受信トレイを整理するためには、日付を基準にメールをフィルタリングすることも有効だ。特定の期間内に受信したメールだけを処理したい場合は、次のようにクエリを拡張できる。

function filterByDate() {
  // 過去7日以内の未読メールを検索
  const query = 'is:unread after:' + Utilities.formatDate(new Date(new Date().setDate(new Date().getDate() - 7)), Session.getScriptTimeZone(), 'yyyy/MM/dd');
  const threads = GmailApp.search(query);

  if (threads.length > 0) {
    for (let i = 0; i < threads.length; i++) {
      const thread = threads[i];
      Logger.log('過去7日間の未読メール: ' + thread.getFirstMessageSubject());

      // アーカイブしてログ出力
      thread.moveToArchive();
    }
    Logger.log(threads.length + '件のメールをアーカイブしました。');
  } else {
    Logger.log('過去7日間に未読のメールはありません。');
  }
}

ポイント解説

  • after::指定された日付以降に受信したメールをフィルタリング。この例では、過去7日以内の未読メールを対象にしているが、期間は任意で変更可能。
  • Utilities.formatDate():GASで日付を指定した形式にフォーマットし、after:に適用している。これにより、柔軟な日付ベースのフィルタリングが可能となる。

重要度に基づいたフィルタリング

Gmailでは、Googleが自動でメールの重要度を判定する機能がある。これをGASのフィルタリングに組み込めば、重要なメールだけに焦点を当てることができる。

function filterImportantEmails() {
  // Gmailが重要と判定した未読メールをフィルタリング
  const query = 'is:unread is:important';
  const threads = GmailApp.search(query);

  if (threads.length > 0) {
    for (let i = 0; i < threads.length; i++) {
      const thread = threads[i];
      Logger.log('重要な未読メール: ' + thread.getFirstMessageSubject());

      // メールをアーカイブ
      thread.moveToArchive();
    }
    Logger.log(threads.length + '件の重要なメールをアーカイブしました。');
  } else {
    Logger.log('重要な未読メールはありません。');
  }
}

ポイント解説

  • is:important:Googleのアルゴリズムが重要と判断したメールだけをフィルタリング。これにより、あらかじめ優先度が高いと判定されたメールを効率よく処理できる。

アーカイブでの整理整頓

不要なメールやすぐに対応する必要のない通知は、受信トレイからアーカイブしておこう。これで視覚的なノイズを減らし、重要なメールだけに集中できる。

function archiveEmails() {
  const query = 'is:unread';
  const threads = GmailApp.search(query);
  
  for (let i = 0; i < threads.length; i++) {
    const thread = threads[i];
    thread.moveToArchive();
    Logger.log('メールをアーカイブしました: ' + thread.getFirstMessageSubject());
  }
}

まとめ

システム管理者は、サーバーの安定運用だけでなく、膨大なメールの処理にも苦しんでいる。GASを使えば、少なくともその一部は自動化でき、効率を上げることが可能だ。しかし、GmailのAPI制限や削除操作のリスクを理解し、慎重に管理することが求められる。そうすれば、少なくとも受信トレイの海で溺れることはないだろう。


次回予告
次回は、GASを使ってGoogleフォームとの連携を試みる。フォームから得られるデータをスプレッドシートに自動で整理し、システム運用に役立つレポートを生成する。システム管理者としての負担を少しでも軽くする方法を探っていこう。

コメント

このブログの人気の投稿

桃太郎電鉄ワールド、初の大型アップデート。その名も『ムー大陸浮上!』

GASのさらに高度なテクニック:非同期処理、プロパティサービス、Webhookチェーン

GASでスクレイピング 〜天才ア○バ様の教え〜