Gmail の特定ラベルを自動取得し、スプレッドシートに転記する方法

# Gmail の特定ラベルを自動取得し、スプレッドシートに転記する方法

GAS（Google Apps Script）を使って、Gmail の特定ラベルが付いたメールを自動でスプレッドシートに転記する手順をまとめました。たとえば「受注管理」「顧客問い合わせ」など、すぐにスプレッドシートにまとめたいラベルがある場合に活用できます。

## 目次

1.  目的・概要
2.  実装の流れ
3.  ソースコード解説
4.  カスタマイズのポイント
5.  まとめ

***

## 1. 目的・概要

Gmail で「SampleLabel」という名前のラベルを付けたメールを、1日に1回のペースで自動的にスプレッドシートへ転記します。転記対象は以下の項目とします。

*   日時 (Date)
*   From (送信元)
*   To (宛先)
*   メール本文

同じメールを何度も転記しないよう、**メールID** を使った重複チェックを行います。すでに処理したメールはスキップし、未処理のメールのみ書き込みます。

また、スプレッドシートのファイル名は「メール自動転記」など任意の名前を利用し、すでに存在すればそれを使い、なければ新規作成してから書き込みを行います。

***

## 2. 実装の流れ

ざっくりとした処理の流れは次の通りです。

1.  **対象ラベルの取得**\
    GmailApp.getUserLabelByName("SampleLabel") で指定のラベルを取得します。存在しない場合は処理を終了します。

2.  **スプレッドシートの取得 or 作成**\
    DriveApp.getFilesByName("メール自動転記") で同名ファイルがあるか確認し、あればオープン、なければ作成します。

3.  **シートのヘッダー行を設定**\
    A1 ~ D1 などにヘッダー（日時, From, To, メール内容）を設定します。

4.  **重複チェックのための ID 保存**
    *   GAS のスクリプトプロパティ (PropertiesService) に、前回処理したメールの ID を保存しておく
    *   スプレッドシート側の専用列に ID を保持する方法でもOK

5.  **ラベル付きスレッドを走査し、メールを取得**\
    メール1件ごとに、ID が未処理ならスプレッドシートに書き込み、処理済み ID リストに追加します。

6.  **処理後、トリガーを設定**\
    GAS の「トリガー」機能から、1日1回などの時間主導型でスクリプトを実行するように設定します。

***

## 3. ソースコード解説

以下のサンプルコードは、GAS のエディタに貼り付けて使うことができます。\
※ 「SampleLabel」や「メール自動転記」などは、実際の運用に合わせて書き換えてください。

```javascript
function updateEmailsToSheet() {
  // === 1. ターゲットラベルの取得 ===
  var labelName = "SampleLabel";  // ★ラベル名を置き換えてください
  var label = GmailApp.getUserLabelByName(labelName);
  if (!label) {
    Logger.log("指定のラベルが見つかりません: " + labelName);
    return;
  }

  // === 2. スプレッドシート取得 or 作成 ===
  var fileName = "メール自動転記";  // ★スプレッドシートの名称をお好みで変更
  var files = DriveApp.getFilesByName(fileName);
  var ss;
  if (files.hasNext()) {
    ss = SpreadsheetApp.open(files.next());
  } else {
    ss = SpreadsheetApp.create(fileName);
  }

  // シートの準備（最初のシートを使用）
  var sheet = ss.getSheets()[0];

  // === 3. ヘッダー行をチェックし、なければ設定 ===
  var header = sheet.getRange(1, 1, 1, 4).getValues()[0];
  var expectedHeader = ["日時", "From", "To", "メール内容"];
  if (header.join() !== expectedHeader.join()) {
    sheet.getRange(1, 1, 1, expectedHeader.length).setValues([expectedHeader]);
  }

  // === 4. スクリプトプロパティから、処理済みのメールID一覧を取得 ===
  var scriptProperties = PropertiesService.getScriptProperties();
  var processedIds = scriptProperties.getProperty("PROCESSED_MESSAGE_IDS");
  var processedIdList = processedIds ? JSON.parse(processedIds) : [];
  var processedIdSet = new Set(processedIdList);

  // === 5. 指定ラベルがついたスレッドを取得し、各メールを処理 ===
  var threads = label.getThreads();
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();

    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var msgId = message.getId();

      // すでに処理済みならスキップ
      if (processedIdSet.has(msgId)) {
        continue;
      }

      // メール情報を取得
      var date = message.getDate();        // 日時（Dateオブジェクト）
      var from = message.getFrom();        // 送信元
      var to = message.getTo();            // 宛先
      var body = message.getPlainBody();   // テキスト本文 (HTMLなら message.getBody())

      // === 6. スプレッドシートに書き込み ===
      var lastRow = sheet.getLastRow();
      sheet.getRange(lastRow + 1, 1).setValue(date);
      sheet.getRange(lastRow + 1, 2).setValue(from);
      sheet.getRange(lastRow + 1, 3).setValue(to);
      sheet.getRange(lastRow + 1, 4).setValue(body);

      // === 7. 処理済みIDとして追加し、次回以降の重複を防ぐ ===
      processedIdSet.add(msgId);
    }
  }

  // === 8. 更新したIDリストをスクリプトプロパティに保存 ===
  scriptProperties.setProperty("PROCESSED_MESSAGE_IDS", JSON.stringify(Array.from(processedIdSet)));

  Logger.log("処理が完了しました。");
}
```

### コードのポイント

*   **スクリプトプロパティ**\
    重複メールを判定するために、前回までの処理済みメールIDを保存しています。\
    `PropertiesService.getScriptProperties()` で取得し、JSON 形式で扱います。

*   **メール本文取得**\
    `getPlainBody()` はテキストのみ、`getBody()` はHTMLを含む本文を返します。メールの形態に合わせて使い分けてください。

*   **シートのヘッダー確認**\
    1行目(A1:D1) の内容を配列で取得し、想定のヘッダーと異なる場合は上書きしています。すでに別のヘッダーがある場合は注意が必要です。

*   **ファイル重複**\
    DriveApp.getFilesByName("メール自動転記") で同名ファイルが複数あると、`hasNext()` で最初に見つかった1つを使います。複数ある状況は避けた方が無難です。

***

## 4. カスタマイズのポイント

### 4-1. 重複チェックをシートで管理する

ここではスクリプトプロパティを使いましたが、**シート上に「メールID」列を持たせ、書き込んだIDを参照して重複を確認する**方法もあります。\
シートのデータと「いつ・どのメールを取り込んだのか」をまとめて管理できる点がメリットです。

### 4-2. メール本文が長大になる場合

受信メールの本文が非常に長かったり、多量に転記されると、シートが重くなりがちです。\
必要に応じて以下の工夫も考えられます。

*   一部のテキストだけを抜き出す
*   改行コードをシート内の改行に置き換える (`\n` → `\n` でセル内改行)
*   スプレッドシートへの書き込みではなく、BigQuery 等のデータベースに保存する
*   定期的に古い行をアーカイブする

### 4-3. テーブルとして見やすくしたい場合

スクリプトからヘッダーにフィルタービューを適用したり、シートの書式を設定することも可能です。\
たとえば、下記のように「ヘッダーを太字」にする方法があります。

```javascript
// ヘッダー行を太字に
sheet.getRange(1, 1, 1, expectedHeader.length).setFontWeight("bold");
```

***

## 5. まとめ

GAS を使うと、手動作業が多いメールの振り分け・集計を自動化できます。今回の例では、Gmailのラベル付けとスプレッドシートの書き込みを組み合わせましたが、以下のように応用が可能です。

*   添付ファイルを Drive に保存する
*   特定の本文を検知してチャットツールに通知する
*   フォーム投稿や他サービスへの連携をする

また、**定期実行のトリガー設定**を忘れずに行いましょう。GAS のエディタ画面右上の「トリガー」から、この `updateEmailsToSheet()` 関数を 1日1回などのタイミングで実行するようセットすれば、自動化が完成します。

参考にしていただき、ご自身の運用に合わせてカスタマイズしてみてください。