0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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回などのタイミングで実行するようセットすれば、自動化が完成します。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?