1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GASでGmailを自動処理する【ラベル振り分け・自動返信・添付ファイル保存】

1
Posted at

はじめに

「毎日届く定型メールの処理に時間を取られている」
「添付ファイルを手動でドライブに保存している」
「同じような返信を毎回書いている」

こうしたメール業務は、GAS(Google Apps Script)で自動化できます。この記事では、GmailApp を使った実用的な自動化パターンを4つ紹介します。

すべてコピペで動くコード付きです。

前提

  • Googleアカウントがあること
  • Apps Scriptの基本操作(スクリプト作成・トリガー設定)ができること

トリガーの設定方法が分からない場合は、GASのトリガー完全ガイドを先に読むとスムーズです。


基本:メールを検索する

Gmail自動化の起点は「対象メールを検索して取得する」ことです。

/**
 * 条件に合うメールを検索する
 */
function searchMails() {
  // Gmailの検索窓と同じ構文が使える
  const threads = GmailApp.search('from:info@example.com is:unread', 0, 50);

  threads.forEach(thread => {
    const messages = thread.getMessages();
    messages.forEach(message => {
      console.log('件名: ' + message.getSubject());
      console.log('差出人: ' + message.getFrom());
      console.log('本文: ' + message.getPlainBody().substring(0, 100));
    });
  });
}

よく使う検索演算子

演算子 意味
from:xxx@example.com 特定の差出人から
subject:請求書 件名に「請求書」を含む
is:unread 未読のみ
has:attachment 添付ファイルあり
newer_than:1d 過去1日以内
label:重要 特定ラベルが付いている
-label:処理済み 特定ラベルが付いていない(除外)

複数条件はスペースでつなぐとAND検索になります。


① 条件に応じてラベルを自動で振り分ける

Gmailの標準フィルタでも可能ですが、GASなら本文の内容による複雑な判定ができます。

/**
 * 未読メールを内容に応じてラベル分けする
 * ※ 時間主導型トリガー(30分おきなど)で実行
 */
function autoLabel() {
  const threads = GmailApp.search('is:unread -label:処理済み', 0, 50);

  // ラベルを取得(なければ作成)
  const labelUrgent = getOrCreateLabel('要対応');
  const labelInvoice = getOrCreateLabel('請求関連');
  const labelDone   = getOrCreateLabel('処理済み');

  threads.forEach(thread => {
    const message = thread.getMessages()[0];
    const subject = message.getSubject();
    const body    = message.getPlainBody();

    // 件名・本文のキーワードで判定
    if (subject.includes('至急') || body.includes('緊急')) {
      thread.addLabel(labelUrgent);
    } else if (subject.includes('請求') || subject.includes('見積')) {
      thread.addLabel(labelInvoice);
    }

    thread.addLabel(labelDone);  // 処理済みマーク
  });
}

/** ラベルを取得(存在しなければ作成) */
function getOrCreateLabel(name) {
  return GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
}

ポイント: -label:処理済み で除外し、処理後に「処理済み」ラベルを付けることで、同じメールを二重処理しない仕組みにしています。


② 添付ファイルを自動でGoogleドライブに保存する

請求書や納品書などを毎回手動で保存している場合、これで完全自動化できます。

/**
 * 添付ファイル付きメールをドライブに自動保存する
 * ※ 時間主導型トリガーで実行
 */
function saveAttachments() {
  const FOLDER_ID = 'ここにドライブのフォルダID';  // ★ 保存先フォルダ
  const folder = DriveApp.getFolderById(FOLDER_ID);

  const threads = GmailApp.search('has:attachment -label:保存済み newer_than:7d', 0, 30);
  const labelSaved = getOrCreateLabel('保存済み');

  threads.forEach(thread => {
    thread.getMessages().forEach(message => {
      const attachments = message.getAttachments();

      attachments.forEach(attachment => {
        // PDFのみ保存する例
        if (attachment.getContentType() !== 'application/pdf') return;

        // ファイル名に受信日を付けて保存
        const date = Utilities.formatDate(message.getDate(), 'Asia/Tokyo', 'yyyyMMdd');
        const fileName = `${date}_${attachment.getName()}`;

        folder.createFile(attachment.copyBlob()).setName(fileName);
        console.log('保存: ' + fileName);
      });
    });

    thread.addLabel(labelSaved);
  });
}

フォルダIDの調べ方:Googleドライブでフォルダを開いたときのURL
https://drive.google.com/drive/folders/【この部分がフォルダID】


③ 定型メールに自動返信する

問い合わせに対する一次返信を自動化する例です。

/**
 * 特定の条件のメールに自動返信する
 * ※ 時間主導型トリガーで実行
 */
function autoReply() {
  const threads = GmailApp.search('to:info@example.com is:unread -label:返信済み', 0, 20);
  const labelReplied = getOrCreateLabel('返信済み');

  threads.forEach(thread => {
    const message = thread.getMessages()[0];
    const senderName = extractName(message.getFrom());

    const replyBody = `
${senderName} 様

お問い合わせいただきありがとうございます。
内容を確認のうえ、1〜3営業日以内に担当者よりご連絡いたします。

今しばらくお待ちくださいますようお願いいたします。

──────────────
株式会社サンプル
info@example.com
──────────────
`.trim();

    thread.reply(replyBody);
    thread.addLabel(labelReplied);
  });
}

/** "山田太郎 <yamada@x.com>" から名前だけ取り出す */
function extractName(from) {
  const match = from.match(/^(.+?)\s*</);
  return match ? match[1].replace(/"/g, '') : from;
}

注意: 自動返信は誤爆すると相手に迷惑がかかります。検索条件を十分に絞り込み、必ずテスト用アドレスで動作確認してから本番運用してください。


④ メール内容をスプレッドシートに記録する

受注メールや問い合わせを一覧化して管理したい場合に使えます。

/**
 * 対象メールの情報をスプレッドシートに記録する
 * ※ 時間主導型トリガーで実行
 */
function logMailsToSheet() {
  const SHEET_ID = 'ここにスプレッドシートのID';  // ★
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('メールログ');

  const threads = GmailApp.search('subject:お問い合わせ -label:記録済み', 0, 50);
  const labelLogged = getOrCreateLabel('記録済み');

  threads.forEach(thread => {
    const message = thread.getMessages()[0];

    sheet.appendRow([
      message.getDate(),                          // 受信日時
      message.getFrom(),                          // 差出人
      message.getSubject(),                       // 件名
      message.getPlainBody().substring(0, 500),   // 本文(500文字まで)
      thread.getPermalink(),                      // メールへのリンク
    ]);

    thread.addLabel(labelLogged);
  });
}

getPermalink() でメールへの直リンクを記録しておくと、スプレッドシートから該当メールにすぐ飛べて便利です。


実行制限に注意

GASのGmail操作には1日あたりの上限があります(無料アカウントの目安)。

操作 1日の上限
メール送信 100通
メール読み取り 20,000通
スクリプト実行時間 90分

大量処理をする場合は、GmailApp.search() の第3引数(取得件数)を絞り、複数回のトリガー実行に分割する設計にします。


まとめ

GASを使ったGmail自動化の基本パターンは以下の4つです。

  1. ラベル自動振り分け:内容による複雑な条件分岐ができる
  2. 添付ファイル自動保存:ドライブへの保存を完全自動化
  3. 自動返信:一次対応のスピードを上げる
  4. スプレッドシート記録:メール内容を一覧管理・集計可能に

共通のコツは、「処理済みラベル」を付けて二重処理を防ぐことです。この設計にしておけば、トリガーで定期実行しても安全に運用できます。


メール業務の自動化のご相談

「自社のメール処理フローを自動化したい」「他システムとも連携させたい」などのご相談を受け付けています。

🌐 https://datarou.com

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?