Gmail の特定ラベルを自動取得し、スプレッドシートに転記する方法
Gmail の特定ラベルを自動取得し、スプレッドシートに転記する方法
GAS(Google Apps Script)を使って、Gmail の特定ラベルが付いたメールを自動でスプレッドシートに転記する手順をまとめました。たとえば「受注管理」「顧客問い合わせ」など、すぐにスプレッドシートにまとめたいラベルがある場合に活用できます。
目次
- 目的・概要
- 実装の流れ
- ソースコード解説
- カスタマイズのポイント
- まとめ
1. 目的・概要
Gmail で「SampleLabel」という名前のラベルを付けたメールを、1日に1回のペースで自動的にスプレッドシートへ転記します。転記対象は以下の項目とします。
- 日時 (Date)
- From (送信元)
- To (宛先)
- メール本文
同じメールを何度も転記しないよう、メールID を使った重複チェックを行います。すでに処理したメールはスキップし、未処理のメールのみ書き込みます。
また、スプレッドシートのファイル名は「メール自動転記」など任意の名前を利用し、すでに存在すればそれを使い、なければ新規作成してから書き込みを行います。
2. 実装の流れ
ざっくりとした処理の流れは次の通りです。
-
対象ラベルの取得
GmailApp.getUserLabelByName("SampleLabel") で指定のラベルを取得します。存在しない場合は処理を終了します。 -
スプレッドシートの取得 or 作成
DriveApp.getFilesByName("メール自動転記") で同名ファイルがあるか確認し、あればオープン、なければ作成します。 -
シートのヘッダー行を設定
A1 ~ D1 などにヘッダー(日時, From, To, メール内容)を設定します。 -
重複チェックのための ID 保存
- GAS のスクリプトプロパティ (PropertiesService) に、前回処理したメールの ID を保存しておく
- スプレッドシート側の専用列に ID を保持する方法でもOK
-
ラベル付きスレッドを走査し、メールを取得
メール1件ごとに、ID が未処理ならスプレッドシートに書き込み、処理済み ID リストに追加します。 -
処理後、トリガーを設定
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回などのタイミングで実行するようセットすれば、自動化が完成します。
参考にしていただき、ご自身の運用に合わせてカスタマイズしてみてください。