HiÐΞClassic

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

SHOGAKU
a month ago
Gmail の特定ラベルを自動取得し、スプレッドシートに転記する方法目次1. 目的・概要2. 実装の流れ3. ソースコード解説コードのポイント4. カスタマイズのポイント4-1. 重複チェックをシートで管理する4-2. メール本文が長大になる場合4-3. テーブルとして見やすくしたい場合5. まとめ

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」や「メール自動転記」などは、実際の運用に合わせて書き換えてください。

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. テーブルとして見やすくしたい場合

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

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

5. まとめ

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

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

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

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


コメント
いいね
投げ銭
最新順
人気順
SHOGAKU
a month ago
コメント
いいね
投げ銭
最新順
人気順
トピック
アプリ

Astar Network

DFINITY / ICP

NFT

DAO

DeFi

L2

メタバース

BCG

仮想通貨 / クリプト

ブロックチェーン別

プロジェクト

目次
Tweet
ログイン