メールをExcel/Googleスプレッドシートにエクスポートする方法

メールをスプレッドシートにまとめたい場合は、以下の手順で行えます。メールメッセージを解析し、解析したデータをGoogleスプレッドシートにエクスポートできるアプリがあります。ActorAiもこの作業をサポートできます。

メールをExcelまたはGoogleスプレッドシートにエクスポートする一般的な用途を簡潔にまとめました。

  • 注文と発送の通知をエクスポートする。
  • CRMやデータベースの更新用に、メールのリード情報をエクスポートする。
  • リスト管理用に、バウンスしたメールアドレスを抽出する。
  • 共有スプレッドシートを使って、未解決の問題や依頼をチームと共有する。
  • 構造化されたメールデータをデータベースや業務アプリケーションにインポートする。
  • 重要な業務メールをバックアップしてアーカイブする。
  • 連絡先と住所から配信リストを作成する。
  • レポート作成用に、財務情報や経費情報を抽出する。

GmailからGoogleスプレッドシートにメールをエクスポートする

方法A:Google Workspaceアドオンを使う(最も簡単)

  • Google スプレッドシート → 拡張機能 → アドオンを開く。
  • 「GmailからSheetsへ」アドオンを検索する(ニーズに合うものを選択)
  • インストールして、Gmailアカウントを接続する。
  • ラベル/フォルダまたは検索フィルタを選択する。
  • エクスポートを実行する → データがスプレッドシートに表示される。
  • ヒント:毎日更新されるよう、自動更新を設定しましょう。

方法B:Google Apps Scriptを使う(自分で作成する方法)

  • Gmailの検索条件(label、from:、subject:、after:など)に一致するメールを取得します。
  • アクティブなシートに、整った列で書き込みます
  • カスタムメニューを追加します: メールのエクスポート → エクスポートを実行
  • 検索クエリ、メールの最大件数、メッセージ本文を含めるかどうかを設定できます

Google Apps Scriptを設定する(ExcelにエクスポートするDIY方式)

  1. 新しいGoogleスプレッドシートを開きます。
  2. 拡張機能 → アプリスクリプト.
  3. コードをすべて削除し、以下のスクリプトを貼り付けます。
  4. クリック 保存し、、次に 実行 → 起動時の処理 カスタムメニューを追加します。
  5. スプレッドシートに戻り、 メールのエクスポート → シートを設定 (Configタブと見出しが作成されます)。
  6. 検索内容を入力 Config!B2 (以下に例を示します)、その後 メールのエクスポート → エクスポートを実行.
/**************************************
 * Gmail → Google Sheets Exporter
 * Simple, DYI method for tech advanced.
 **************************************/

const CONFIG_SHEET = 'Config';
const OUTPUT_SHEET = 'Emails';
const PROPERTY_STORE = PropertiesService.getDocumentProperties();

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Email Export')
    .addItem('Setup sheet', 'setupSheet')
    .addItem('Run export', 'exportEmails')
    .addToUi();
}

function setupSheet() {
  const ss = SpreadsheetApp.getActive();
  // Config sheet
  let conf = ss.getSheetByName(CONFIG_SHEET);
  if (!conf) conf = ss.insertSheet(CONFIG_SHEET);
  conf.clear();

  conf.getRange('A1').setValue('Setting');
  conf.getRange('B1').setValue('Value');

  const rows = [
    ['Search query', 'label:inbox newer_than:30d'], // B2
    ['Max emails to fetch (per run)', 500],          // B3 (limit to avoid timeouts)
    ['Include message body? (true/false)', false],   // B4
    ['Body max characters', 5000],                  // B5
    ['Continue from last run? (true/false)', false]  // B6
  ];
  conf.getRange(2, 1, rows.length, 2).setValues(rows);
  conf.autoResizeColumns(1, 2);

  // Output sheet
  let out = ss.getSheetByName(OUTPUT_SHEET);
  if (!out) out = ss.insertSheet(OUTPUT_SHEET);
  out.clear();

  const headers = [
    'Date',
    'From',
    'To',
    'Subject',
    'Snippet',
    'Thread ID',
    'Message ID',
    'Labels',
    'Has Attachments',
    'Thread Link',
    'Message Link',
    'Body (optional)'
  ];
  out.getRange(1, 1, 1, headers.length).setValues([headers]);
  out.setFrozenRows(1);
  out.autoResizeColumns(1, headers.length);

  SpreadsheetApp.getUi().alert('Setup complete. Enter your query in Config!B2, then run "Email Export → Run export".');
}

function getConfig_() {
  const ss = SpreadsheetApp.getActive();
  const conf = ss.getSheetByName(CONFIG_SHEET);
  if (!conf) throw new Error('Config sheet missing. Run "Setup sheet" first.');

  const getVal = (row) => conf.getRange(row, 2).getValue();

  return {
    query: String(getVal(2) || '').trim(),
    maxEmails: Number(getVal(3) || 500),
    includeBody: String(getVal(4)).toLowerCase() === 'true',
    bodyMaxChars: Number(getVal(5) || 5000),
    continueFromLast: String(getVal(6)).toLowerCase() === 'true',
  };
}

function exportEmails() {
  const cfg = getConfig_();
  if (!cfg.query) throw new Error('Please fill a Gmail search in Config!B2.');

  const ss = SpreadsheetApp.getActive();
  const out = ss.getSheetByName(OUTPUT_SHEET) || ss.insertSheet(OUTPUT_SHEET);

  // Resume support (optional)
  let startIndex = 0;
  if (cfg.continueFromLast) {
    startIndex = Number(PROPERTY_STORE.getProperty('startIndex') || 0);
  } else {
    PROPERTY_STORE.deleteProperty('startIndex');
    // If not continuing, start fresh by clearing previous rows (keep header)
    const lastRow = out.getLastRow();
    if (lastRow > 1) out.getRange(2, 1, lastRow - 1, out.getLastColumn()).clearContent();
  }

  const BATCH_SIZE_THREADS = 100; // Gmail returns threads, we’ll page through them
  const rows = [];
  let fetchedEmails = 0;

  while (fetchedEmails < cfg.maxEmails) {
    const threads = GmailApp.search(cfg.query, startIndex, BATCH_SIZE_THREADS);
    if (!threads.length) break;

    for (const thread of threads) {
      const msgs = thread.getMessages();
      for (const msg of msgs) {
        if (fetchedEmails >= cfg.maxEmails) break;

        const date = msg.getDate();
        const from = msg.getFrom();
        const to = msg.getTo();
        const subject = msg.getSubject() || '';
        const snippet = msg.getPlainBody().slice(0, 120).replace(/\s+/g, ' ').trim();
        const threadId = thread.getId();
        const msgId = msg.getId();
        const labels = thread.getLabels().map(l => l.getName()).join(', ');
        const hasAttachments = msg.getAttachments().length > 0;

        const threadLink = `https://mail.google.com/mail/u/0/#all/${threadId}`;
        const messageLink = `https://mail.google.com/mail/u/0/#inbox/${msgId}`;

        let body = '';
        if (cfg.includeBody) {
          // Prefer plain body; fallback to HTML stripped
          body = msg.getPlainBody();
          if (!body) {
            const html = msg.getBody();
            body = stripHtml_(html);
          }
          if (cfg.bodyMaxChars > 0 && body.length > cfg.bodyMaxChars) {
            body = body.slice(0, cfg.bodyMaxChars) + '…';
          }
        }

        rows.push([
          date,
          from,
          to,
          subject,
          snippet,
          threadId,
          msgId,
          labels,
          hasAttachments,
          threadLink,
          messageLink,
          body
        ]);

        fetchedEmails++;
      }
      if (fetchedEmails >= cfg.maxEmails) break;
    }

    startIndex += BATCH_SIZE_THREADS;
    // Safety: avoid 6-minute execution limit
    if (Utilities.getRemainingDailyQuota && rows.length >= 5000) break;
  }

  if (rows.length) {
    out.insertRowsAfter(out.getLastRow() || 1, rows.length);
    out.getRange(out.getLastRow() - rows.length + 1, 1, rows.length, rows[0].length).setValues(rows);
    out.autoResizeColumns(1, out.getLastColumn());
  }

  if (cfg.continueFromLast) {
    PROPERTY_STORE.setProperty('startIndex', String(startIndex));
  }

  SpreadsheetApp.getUi().alert(`Export complete: ${fetchedEmails} emails added.`);
}

function stripHtml_(html) {
  // Lightweight HTML → text
  return String(html || '')
    .replace(/<style[\s\S]*?<\/style>/gi, '')
    .replace(/<script[\s\S]*?<\/script>/gi, '')
    .replace(/<[^>]+>/g, ' ')
    .replace(/\s+/g, ' ')
    .trim();
}

Googleスプレッドシート向けのシンプルなスクリプト版。

function exportSimple() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const query = 'label:inbox newer_than:7d';
  const threads = GmailApp.search(query, 0, 100);
  const rows = [['Date','From','Subject','Snippet','Thread Link']];
  threads.forEach(t => {
    t.getMessages().forEach(m => {
      rows.push([
        m.getDate(),
        m.getFrom(),
        m.getSubject(),
        m.getPlainBody().slice(0,120).replace(/\s+/g,' ').trim(),
        'https://mail.google.com/mail/u/0/#all/' + t.getId()
      ]);
    });
  });
  sheet.clear().getRange(1,1,rows.length,rows[0].length).setValues(rows);
}

OutlookからExcelにメールをエクスポートする

1. OutlookのCSVエクスポート機能を使う:

  • に移動 ファイル > 開く/エクスポート > インポート/エクスポート.
  • を選択 ファイルにエクスポート を選択 カンマ区切り値(CSV).
  • エクスポートするメールフォルダー(例:受信トレイ)を選択します。
  • と表示されたら、クリックします カスタムフィールドの割り当て 必要なメール属性だけを選択するには、をクリックします。たとえば、 差出人、 宛先、 件名、 受信日時など。
  • エクスポートを完了し、CSVファイルをExcelで開くと、メタデータのみを確認できます。

2. Outlookでテキスト形式のメタデータを絞り込んでコピーする:

  • Outlookで必要な列(差出人、日付など)だけを表示するカスタムビューを作成します。
  • メールを選択してコピーし、Excelに貼り付けます。
  • この方法は少量のメールを処理する場合に手早く済ませられます。特に、特定のヘッダー情報やメタデータだけをエクスポートする場合に便利です。

3. Power Queryを使って動的にエクスポートする:

  • ExcelのPower Queryを使うと、Outlookに直接接続して、必要なフィールドだけに絞り込めます。
  • この方法なら、データを最小限に抑えながら、継続的な更新や自動化が可能です。
  1. Excelを開き、「データ」タブに移動します。
  2. 「データの取得」>「その他のソースから」>「Microsoft Exchangeから」を選択します。
  3. Outlookのメールアドレスを入力し、サインインして接続します。
  4. 対象のメールが含まれるメールボックスのフォルダー(例:受信トレイ)を選択します。
  5. Power Queryエディターで、「件名」「差出人」「宛先」「受信日時」など、必要な列だけを選択します。
  6. 日付や差出人などで絞り込むフィルターを設定します。
  7. 「閉じて読み込む」をクリックし、フィルターで絞り込んだメールデータをExcelのテーブルにインポートします。
  8. クエリをいつでも更新すれば、新しいメールや変更されたメールを反映できます。

注:メールアプリとしてActor内にこの機能を組み込むことを計画しています。現在、ユーザーの関心度を調査中です。

注:ExcelとGoogleスプレッドシートのどちらにエクスポートしても違いはありません。どちらもGoogleとMicrosoftが提供する優れたツールです。

これで、メールをスプレッドシートにまとめられました。分析、絞り込み、共有に活用できます。定期的にこの作業を行う場合は、希望する間隔で繰り返し実行するための自動化が必要です。

こんにちは、ACTORです。あなたのように忙しいビジネスパーソンの毎日をよりシンプルにするために作られました。

スケジュール管理やメール対応、あるいは本当に大切なことへの集中をお手伝いする、これまでで最高のデジタルパートナーになることが私の使命です。

動画:使い始める

やり取りを重ねるたびにあなたのニーズをより深く理解できるよう、常に学び、改善を続けています。

頼れる副操縦士のような存在だと思ってください。ストレスを減らし、貴重な時間を取り戻すお手伝いをします。
一緒にやることリストを片付け、整理整頓を保ち、毎日をより生産的にしていきましょう。

細かなことは私に任せて、大局に集中してください。毎日をもっとスムーズにしませんか? さっそく始めましょう!

こちらからお試しください

注:この記事/ページに記載されている比較や情報は、公開情報に基づいており、すべてを網羅しているとは限りません。記載されている製品名およびブランド名は、それぞれの所有者の商標または登録商標です。