Gmail検索・エクスポート GASコード詳細説明書

function searchGmailAndSaveToFile() {
  // 検索条件の設定
  const startDate = new Date('2025-07-12'); 
  const unixTime1 = startDate.getTime();
  const startNum = Math.floor(unixTime1/1000)-32400;

  const endDate = new Date('2025-07-13');   // 検索終了日時 (例: 2024年12月31日)
  const unixTime2 = endDate.getTime();
  const endNum = Math.floor(unixTime2/1000)-32400;
  const subjectKeyword = '会議';

  // 出力ファイルの設定
  const fileName = `Gmail検索結果_${Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss')}.txt`;
  let outputContent = ''; // ファイルに書き込む内容を蓄積する変数

  // 日時をGmailのクエリ形式に変換
  const formattedStartDate = startNum.toString();
  const formattedEndDate = endNum.toString();

  // 検索クエリの作成
  const searchQuery = `after:${formattedStartDate} before:${formattedEndDate} subject:${subjectKeyword}`;

  Logger.log(`検索クエリ: ${searchQuery}`);
  outputContent += `検索クエリ: ${searchQuery}\n\n`;

  // Gmailを検索
  const threads = GmailApp.search(searchQuery);

  if (threads.length === 0) {
    Logger.log('該当するメールは見つかりませんでした。');
    outputContent += '該当するメールは見つかりませんでした。\n';
  } else {
    Logger.log(`見つかったメールの数: ${threads.length}`);
    outputContent += `見つかったメールの数: ${threads.length}\n\n`;

    // 各スレッド(会話)を処理
    threads.forEach(thread => {
      const messages = thread.getMessages();

      messages.forEach(message => {
        const subject = message.getSubject();
        const from = message.getFrom();
        const date = message.getDate();
        const body = message.getPlainBody();

        const messageInfo = `-----------------------------------\n` +
                          `日時: ${date}\n` +
                          `件名: ${subject}\n` +
                          `送信元: ${from}\n` +
                          `メッセージID: ${message.getId()}\n` +
                          `本文:\n${body}\n`; // 本文全体をファイルに出力

        Logger.log(messageInfo); // ログにも出力
        outputContent += messageInfo + '\n'; // ファイル内容に蓄積
      });
    });
  }

  // Google Driveにテキストファイルを作成
  try {
    DriveApp.createFile(fileName, outputContent, MimeType.PLAIN_TEXT);
    Logger.log(`ファイル "${fileName}" をGoogle Driveに作成しました。`);
  } catch (e) {
    Logger.log(`ファイルの作成中にエラーが発生しました: ${e.toString()}`);
  }
}

概要

このGoogle Apps Script(GAS)コードは、Gmailから指定した条件に合致するメールを検索し、メールの詳細情報(件名、送信者、日時、本文)をテキストファイルとしてGoogle Driveに自動保存する機能を提供します。

主な機能

  • 日時範囲指定: 特定の期間内のメールを検索
  • 件名フィルタ: 件名に特定のキーワードを含むメールを抽出
  • 詳細情報出力: メールの基本情報と本文全体を記録
  • 自動ファイル生成: 検索結果をタイムスタンプ付きファイル名で保存

コードの詳細解析

1. 検索条件の設定

const startDate = new Date('2025-07-12'); 
const endDate = new Date('2025-07-13');
const subjectKeyword = '会議';
  • 検索期間: 2025年7月12日( タイムゾーン : UTC+9時間 = 32400 で調整)
  • 検索キーワード: 件名に「会議」を含むメール

2. Unix時間への変換処理

const unixTime1 = startDate.getTime();
const startNum = Math.floor(unixTime1/1000)-32400;
  • JavaScriptの日付をUnix時間(秒)に変換
  • -32400は日本時間(JST)のタイムゾーン調整(UTC+9時間 = 32400秒)

3. ファイル名の動的生成

const fileName = `Gmail検索結果_${Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss')}.txt`;
  • 実行時の日時を使用して一意のファイル名を生成
  • 形式例: Gmail検索結果_20250724_143055.txt

4. Gmail検索クエリの構築

const searchQuery = `after:${formattedStartDate} before:${formattedEndDate} subject:${subjectKeyword}`;
  • Gmailの高度な検索演算子を使用
  • after:before: で日時範囲を指定
  • subject: で件名検索を実行

5. メール情報の抽出と整形

各メールから以下の情報を抽出:

  • 日時: message.getDate()
  • 件名: message.getSubject()
  • 送信者: message.getFrom()
  • メッセージID: message.getId()
  • 本文: message.getPlainBody()(プレーンテキスト形式)

6. 出力形式

-----------------------------------
日時: [送信日時]
件名: [メールの件名]
送信元: [送信者のメールアドレス]
メッセージID: [Gmail内部ID]
本文:
[メール本文全体]

使用方法

1. 事前準備

  • Google Apps Scriptプロジェクトを作成
  • Gmailへのアクセス権限を付与
  • Google Driveへの書き込み権限を確認

2. カスタマイズ可能な設定

  • 検索期間: startDateendDate を変更
  • 検索キーワード: subjectKeyword を任意の文字列に変更
  • ファイル名: fileName の命名規則を調整

3. 実行方法

  1. GASエディタで関数 searchGmailAndSaveToFile() を選択
  2. 実行ボタンをクリック
  3. 権限承認を行う(初回のみ)
  4. Google Driveに結果ファイルが自動保存される

注意事項とベストプラクティス

セキュリティ

  • 権限スコープ: Gmail読み取りとDrive書き込み権限が必要
  • データ取り扱い: メール本文が平文でファイルに保存されるため、機密情報に注意

パフォーマンス

  • 実行時間制限: GASは6分の実行時間制限があるため、大量メール検索時は分割処理を検討
  • APIクォータ: Gmail APIの呼び出し制限に注意

エラーハンドリング

try {
  DriveApp.createFile(fileName, outputContent, MimeType.PLAIN_TEXT);
  Logger.log(`ファイル "${fileName}" をGoogle Driveに作成しました。`);
} catch (e) {
  Logger.log(`ファイルの作成中にエラーが発生しました: ${e.toString()}`);
}
  • ファイル作成時のエラーを適切にキャッチ
  • ログ出力でトラブルシューティングを支援

拡張可能性

機能追加の提案

  1. 添付ファイル処理: 添付ファイルの情報や保存機能
  2. CSV出力: 構造化データとしてCSV形式での出力
  3. メール分類: 送信者やラベル別の自動分類
  4. 定期実行: トリガー設定による自動実行
  5. 通知機能: 処理完了時のメール通知

検索条件の拡張例

// 複数キーワード検索
const searchQuery = `after:${startDate} before:${endDate} (subject:削除 OR subject:取消)`;

// 送信者指定
const searchQuery = `from:example@domain.com subject:${keyword}`;

// ラベル指定
const searchQuery = `label:重要 after:${startDate}`;

トラブルシューティング

よくある問題

  1. 権限エラー: Gmail/Drive APIの権限を再承認
  2. ファイル作成失敗: Drive容量不足やファイル名の文字制限を確認
  3. 検索結果が0件: 日時範囲やキーワードの設定を見直し
  4. タイムゾーンエラー: -32400の調整値を環境に合わせて変更

このコードは、メールアーカイブやコンプライアンス対応、データ分析など様々な用途で活用できる実用的なツールです。