MENU

GAS×Gmail連携|メール自動化の完全ガイド

GAS×Gmail連携|メール自動化の完全ガイド

毎日同じメールを手打ちしていると、地味に時間を食う。大量のメールから特定の情報だけ抜き出したい場面や、添付ファイルを1件ずつ保存する作業も、回数が増えるほどしんどくなる。

GAS(Google Apps Script)を使えば、Gmailの操作を丸ごと自動化できる。メール送信、取得、ラベル付け、添付ファイルの保存まで、すべてプログラムで制御可能だ。

目次

GAS×Gmail連携でできること

自動化できる操作一覧

操作 できること 活用例
メール送信 自動送信、一括送信 定型連絡、リマインダー
メール取得 条件検索、内容抽出 レポート作成、データ収集
ラベル管理 自動振り分け、整理 受信トレイ整理
添付ファイル 自動保存、処理 請求書管理、データ収集
下書き作成 テンプレート作成 承認後に送信

導入効果の例

作業 手動 自動化後
日次報告メール 10分/日 0分(自動)
請求書の添付ファイル保存 5分/件 自動
問い合わせメールの集計 30分/日 自動

GmailAppの基本メソッド一覧

メール送信系

メソッド 説明 主な引数
sendEmail() メール送信 to, subject, body, options
createDraft() 下書き作成 to, subject, body

メール取得系

メソッド 説明 戻り値
search() 検索条件でスレッド取得 GmailThread[]
getInboxThreads() 受信トレイのスレッド GmailThread[]
getThreadById() ID指定でスレッド取得 GmailThread

スレッド・メッセージ操作

メソッド 説明
getMessages() スレッド内のメッセージ取得
getSubject() 件名取得
getFrom() 送信者取得
getBody() 本文取得(HTML)
getPlainBody() 本文取得(テキスト)
getDate() 受信日時取得
getAttachments() 添付ファイル取得

ラベル操作

メソッド 説明
getUserLabelByName() ラベル取得
createLabel() ラベル作成
addLabel() スレッドにラベル追加
removeLabel() ラベル削除

実践例1: 条件に合うメールをスプレッドシートに記録

ユースケース

  • 問い合わせメールを自動集計
  • 特定の送信者からのメールを記録
  • 日次のメール受信レポート作成

コード


/**
 * 条件に合うメールをスプレッドシートに記録
 */
function logEmailsToSheet() {
  // 検索条件(過去24時間の未読メール)
  const searchQuery = 'is:unread newer_than:1d';

  // スプレッドシート設定
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // メールを検索
  const threads = GmailApp.search(searchQuery, 0, 50);

  threads.forEach(thread => {
    const messages = thread.getMessages();
    const latestMessage = messages[messages.length - 1];

    // データを取得
    const date = Utilities.formatDate(
      latestMessage.getDate(),
      'Asia/Tokyo',
      'yyyy-MM-dd HH:mm'
    );
    const from = latestMessage.getFrom();
    const subject = latestMessage.getSubject();
    const body = latestMessage.getPlainBody().substring(0, 200); // 先頭200文字

    // スプレッドシートに追記
    sheet.appendRow([date, from, subject, body]);

    // 既読にする(オプション)
    thread.markRead();
  });

  console.log(`${threads.length}件のメールを記録しました`);
}

検索クエリの例

目的 クエリ
未読メール is:unread
特定の送信者 from:example@gmail.com
件名に含む subject:請求書
過去7日間 newer_than:7d
添付ファイル付き has:attachment
複合条件 from:boss@company.com is:unread

実践例2: 定型メールの自動送信

ユースケース

  • 毎日の日報リマインダー
  • 月初の請求書送付
  • 定期的なステータス報告

コード(基本版)


/**
 * シンプルなメール送信
 */
function sendSimpleEmail() {
  const to = 'recipient@example.com';
  const subject = '【日報リマインダー】本日の日報を提出してください';
  const body = `
お疲れ様です。

本日の日報提出をお願いいたします。
提出期限: 18:00

━━━━━━━━━━━━━━━━━
日報フォーム: https://example.com/form
━━━━━━━━━━━━━━━━━
`;

  GmailApp.sendEmail(to, subject, body);
  console.log('メールを送信しました');
}

コード(HTML形式 + CC/BCC)


/**
 * HTML形式でメール送信(CC/BCC付き)
 */
function sendHtmlEmail() {
  const to = 'main@example.com';
  const subject = '【週次レポート】今週の進捗報告';

  const htmlBody = `
    <h2>週次進捗レポート</h2>
    <p>今週の進捗をご報告いたします。</p>
    <table border="1" style="border-collapse: collapse;">
      <tr>
        <th>タスク</th>
        <th>進捗</th>
      </tr>
      <tr>
        <td>機能開発A</td>
        <td>完了</td>
      </tr>
      <tr>
        <td>テスト</td>
        <td>80%</td>
      </tr>
    </table>
    <p>以上、よろしくお願いいたします。</p>
  `;

  const options = {
    cc: 'manager@example.com',
    bcc: 'archive@example.com',
    htmlBody: htmlBody,
    name: '自動送信システム'
  };

  GmailApp.sendEmail(to, subject, '', options);
}

コード(スプレッドシートから一括送信)


/**
 * スプレッドシートの宛先リストに一括送信
 *
 * シート構成:
 * A列: メールアドレス
 * B列: 名前
 * C列: 送信ステータス
 */
function sendBulkEmails() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();

  const subject = '【ご案内】新サービスのお知らせ';

  for (let i = 1; i < data.length; i++) { // 1行目はヘッダー
    const email = data[i][0];
    const name = data[i][1];
    const status = data[i][2];

    // 既に送信済みならスキップ
    if (status === '送信済') continue;

    const body = `
${name} 様

いつもお世話になっております。
新サービスのご案内をさせていただきます。

【詳細はこちら】
https://example.com/service

ご不明点がございましたらお気軽にお問い合わせください。
    `;

    try {
      GmailApp.sendEmail(email, subject, body);
      sheet.getRange(i + 1, 3).setValue('送信済');
    } catch (e) {
      sheet.getRange(i + 1, 3).setValue('エラー: ' + e.message);
    }

    // レート制限対策
    Utilities.sleep(1000);
  }
}

実践例3: メールの自動振り分け・ラベル付け

ユースケース

  • 送信者別に自動分類
  • 重要度別に振り分け
  • プロジェクト別に整理

コード


/**
 * メールを自動でラベル付けして振り分け
 */
function autoLabelEmails() {
  // ラベル設定
  const rules = [
    { query: 'from:boss@company.com', labelName: '上司' },
    { query: 'from:client@customer.com', labelName: '顧客' },
    { query: 'subject:請求書', labelName: '請求書' },
    { query: 'subject:緊急', labelName: '緊急対応' }
  ];

  rules.forEach(rule => {
    // ラベルを取得(なければ作成)
    let label = GmailApp.getUserLabelByName(rule.labelName);
    if (!label) {
      label = GmailApp.createLabel(rule.labelName);
    }

    // 未読かつ条件に合うメールを検索
    const threads = GmailApp.search(`${rule.query} is:unread`, 0, 20);

    threads.forEach(thread => {
      thread.addLabel(label);
      console.log(`ラベル「${rule.labelName}」を追加: ${thread.getFirstMessageSubject()}`);
    });
  });
}

トリガー設定で完全自動化


/**
 * 初回セットアップ: 10分ごとに自動実行
 */
function setupAutoLabelTrigger() {
  // 既存のトリガーを削除
  const triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(trigger => {
    if (trigger.getHandlerFunction() === 'autoLabelEmails') {
      ScriptApp.deleteTrigger(trigger);
    }
  });

  // 新しいトリガーを作成
  ScriptApp.newTrigger('autoLabelEmails')
    .timeBased()
    .everyMinutes(10)
    .create();

  console.log('トリガーを設定しました');
}

実践例4: 添付ファイルをGoogleドライブに自動保存

ユースケース

  • 請求書PDFを自動保存
  • レポートの添付ファイルを収集
  • データファイルの自動バックアップ

コード


/**
 * 添付ファイルをGoogleドライブに自動保存
 */
function saveAttachmentsToDrive() {
  // 検索条件(添付ファイル付きの未処理メール)
  const searchQuery = 'has:attachment label:未処理';

  // 保存先フォルダ
  const folderId = 'YOUR_FOLDER_ID'; // ドライブのフォルダIDを指定
  const folder = DriveApp.getFolderById(folderId);

  // ラベル
  const unprocessedLabel = GmailApp.getUserLabelByName('未処理');
  const processedLabel = GmailApp.getUserLabelByName('処理済') ||
                          GmailApp.createLabel('処理済');

  const threads = GmailApp.search(searchQuery, 0, 10);

  threads.forEach(thread => {
    const messages = thread.getMessages();

    messages.forEach(message => {
      const attachments = message.getAttachments();

      attachments.forEach(attachment => {
        const fileName = attachment.getName();
        const contentType = attachment.getContentType();

        // PDFのみ保存する場合
        if (contentType === 'application/pdf') {
          // ファイル名に日付を追加(重複防止)
          const date = Utilities.formatDate(
            message.getDate(),
            'Asia/Tokyo',
            'yyyyMMdd'
          );
          const newFileName = `${date}_${fileName}`;

          // ドライブに保存
          folder.createFile(attachment.copyBlob().setName(newFileName));
          console.log(`保存しました: ${newFileName}`);
        }
      });
    });

    // ラベルを更新
    if (unprocessedLabel) thread.removeLabel(unprocessedLabel);
    thread.addLabel(processedLabel);
  });
}

フォルダIDの取得方法

  • Googleドライブで対象フォルダを開く
  • URLの末尾部分がフォルダID

https://drive.google.com/drive/folders/【ここがID】

ChatGPT連携: メール文面の自動生成

ユースケース

  • 問い合わせへの返信文生成
  • 顧客情報に応じたパーソナライズメール
  • 英語メールの自動翻訳・返信

コード


/**
 * ChatGPTでメール返信文を生成
 */
function generateEmailReply(originalEmail) {
  const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');

  const prompt = `
以下のメールに対する丁寧な返信文を作成してください。

【受信メール】
${originalEmail}

【返信の条件】
- ビジネスメールとして適切な敬語
- 簡潔に要点を押さえる
- 必要に応じて確認事項を含める
`;

  const payload = {
    model: 'gpt-4o-mini',
    messages: [{ role: 'user', content: prompt }],
    max_tokens: 500
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: { 'Authorization': 'Bearer ' + apiKey },
    payload: JSON.stringify(payload)
  };

  const response = UrlFetchApp.fetch(
    'https://api.openai.com/v1/chat/completions',
    options
  );
  const data = JSON.parse(response.getContentText());

  return data.choices[0].message.content;
}

/**
 * 未読メールに対して返信下書きを自動作成
 */
function createReplyDrafts() {
  const threads = GmailApp.search('is:unread label:要返信', 0, 5);

  threads.forEach(thread => {
    const messages = thread.getMessages();
    const latestMessage = messages[messages.length - 1];

    const originalEmail = `
件名: ${latestMessage.getSubject()}
送信者: ${latestMessage.getFrom()}
本文:
${latestMessage.getPlainBody()}
    `;

    // ChatGPTで返信文を生成
    const replyBody = generateEmailReply(originalEmail);

    // 下書きを作成
    latestMessage.createDraftReply(replyBody);
    console.log(`下書きを作成: ${latestMessage.getSubject()}`);
  });
}

セキュリティ注意事項

1. 権限の確認

GAS×Gmailを使用すると、以下の権限が必要になる。

権限 内容 リスク
Gmail読み取り メール内容の取得 機密情報へのアクセス
Gmail送信 メール送信 なりすまし送信
Gmail変更 ラベル、削除 意図しない削除

2. APIキーの管理


// ❌ NG: コードに直書き
const apiKey = 'sk-xxxxxxxxxxxx';

// ✅ OK: スクリプトプロパティに保存
const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');

3. 送信制限

アカウント種別 1日の送信上限
無料Gmail 100件
Google Workspace 2,000件

// 送信前に残り枠を確認
const remaining = MailApp.getRemainingDailyQuota();
console.log(`残り送信可能数: ${remaining}`);

4. テスト時の注意


// 本番送信前にログで確認
function testSendEmail() {
  const to = 'test@example.com';
  const subject = 'テスト';
  const body = '本文';

  // 実際には送信せず、ログに出力
  console.log(`To: ${to}`);
  console.log(`Subject: ${subject}`);
  console.log(`Body: ${body}`);

  // GmailApp.sendEmail(to, subject, body); // コメントアウト
}

まとめ

GAS×Gmail連携でできること

機能 メソッド 活用例
メール送信 sendEmail() リマインダー、一括送信
メール取得 search() レポート作成、データ収集
ラベル管理 addLabel() 自動振り分け
添付ファイル getAttachments() 自動保存

このガイドのコードでできること

  • 条件に合うメールをスプレッドシートに自動記録
  • 定型メール・一括メールの自動送信
  • ルールベースの自動ラベル付け
  • 添付ファイルのGoogleドライブ自動保存
  • ChatGPT連携で返信文を自動生成

次のステップ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次