Gmailの受信メールを、
スプレッドシートに自動で書き出す(GAS)。
問い合わせ・注文・予約のメールを、あとで集計したり担当を割り振ったりするために、毎回スプレッドシートへ手でコピーしていませんか。このページでは Google Apps Script(GAS)で、Gmailで受信したメールを1通1行でスプレッドシートに自動で書き出す方法を、よくある失敗(重複・取りこぼし・件名が数式として動く)の対策込みで紹介します。
1. できること
| 項目 | このページのコード |
|---|---|
| 対象のメール | Gmailの検索式で指定(送信元・件名・ラベルなど)。例:from:(order@example.com) newer_than:7d |
| 書き出す内容 | メールID・受信日時・送信元・件名・本文の先頭300文字・添付ファイル数・Gmailで開くリンク |
| 書き出し方 | まだ書き出していないメールだけを、古い順にまとめて追記(1行ずつ書かないので速い) |
| 実行 | トリガーで1時間おきなど。手動で ▶ を押しても同じ結果(重複しない) |
2. 準備
- 新しいスプレッドシートを作り、「拡張機能 → Apps Script」を開きます。
- 下のコードを貼り付け、
QUERYを対象にしたいメールの検索式に書き換えます(先にGmailの検索窓で試すと確実です)。 - ▶ で
exportMailsを一度実行し、Gmailとスプレッドシートの許可を与えます。「メール一覧」シートに行が入れば成功です。 - 左の時計アイコン「トリガー」→「トリガーを追加」→ 関数
exportMails・「時間主導型」・「1時間おき」などで保存します。
3. コード全文(コピペで動きます)
const QUERY = 'in:inbox newer_than:7d -in:chats'; // 例: 'from:(order@example.com) newer_than:7d'
const SHEET = 'メール一覧';
const BODY_CHARS = 300; // 本文は先頭だけ(全文を貼るとシートが重くなる)
const LIMIT_MS = 4.5 * 60 * 1000; // 6分の実行上限の手前で止める
function exportMails() {
const start = Date.now();
const lock = LockService.getScriptLock();
if (!lock.tryLock(10 * 1000)) return;
try {
const sh = sheet_();
const done = new Set(sh.getLastRow() > 1
? sh.getRange(2, 1, sh.getLastRow() - 1, 1).getValues().map(r => String(r[0]))
: []);
const rows = [];
const threads = GmailApp.search(QUERY, 0, 100);
outer:
for (const th of threads) {
for (const msg of th.getMessages()) {
if (Date.now() - start > LIMIT_MS) break outer; // 残りは次回の実行で
const id = msg.getId();
if (done.has(id)) continue;
const body = msg.getPlainBody().replace(/\s+/g, ' ').trim().slice(0, BODY_CHARS);
rows.push([id, msg.getDate(), safe_(msg.getFrom()), safe_(msg.getSubject()),
safe_(body), msg.getAttachments({ includeInlineImages: false }).length,
'https://mail.google.com/mail/u/0/#all/' + id]);
done.add(id);
}
}
if (rows.length) {
rows.sort((a, b) => a[1] - b[1]); // 古い順に追記
sh.getRange(sh.getLastRow() + 1, 1, rows.length, rows[0].length).setValues(rows);
}
} finally {
lock.releaseLock();
}
}
// = + - @ で始まる文字は数式として実行されないよう先頭に ' を付ける
function safe_(s) {
s = String(s || '');
return /^[=+\-@]/.test(s) ? "'" + s : s;
}
function sheet_() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sh = ss.getSheetByName(SHEET);
if (!sh) {
sh = ss.insertSheet(SHEET);
sh.appendRow(['メールID', '受信日時', '送信元', '件名', '本文(先頭)', '添付数', 'Gmailで開く']);
sh.setFrozenRows(1);
}
return sh;
}
書き換えるのは主に QUERY です。本文をもっと残したいときは BODY_CHARS を増やしますが、1セルは5万文字までで、長くするほどシートが重くなります。
4. このコードが防いでいる4つの失敗
- 同じメールが何行も入る:書き出したメールのIDをA列に残し、次回からはスキップします。トリガーと手動実行が重なっても
LockServiceで同時実行を防ぎます。 - 返信がついたスレッドの新しいメールを取りこぼす:「処理済みラベルを付けて除外する」方法は、ラベルがスレッド単位なので、同じスレッドに後から届いたメールを見落とします。このコードはメール1通ごとのIDで判定します。
- 件名が数式として動いてしまう:件名や送信元が
=+-@で始まると、スプレッドシートが数式として解釈します。外部から届く文字列なので、悪意ある=HYPERLINK(...)などが仕込まれることもあります。先頭に'を付けて、ただの文字として書き込みます。 - 件数が多い日に途中で止まる:GASの1回の実行は6分までです。4.5分で自分から止めて、それまでの分を書き込み、残りは次の実行で続けます。
5. よくあるつまずき
QUERY をGmailの検索窓に貼って、対象メールが出るか確認してください。newer_than:7d は「7日以内」です。過去分をまとめて取り込みたいときは、初回だけ newer_than:90d などに広げ、何回か実行します(1回の検索は最大100スレッド)。日時がおかしい:スクリプトのタイムゾーンは「プロジェクトの設定」で、表示形式はシートの「表示形式 → 数字 → 日時」で変えられます。
「Gmailで開く」リンクが別のアカウントを開く:ブラウザで複数のGoogleアカウントにログインしている場合、リンクの
/u/0/ を /u/1/ などに変えてください。6. AIはどこに使う?
書き出しそのものにAIは不要です。便利なのはその次で、一覧にしたメールを「見積依頼・予約変更・クレーム」などに分類する、返信の下書きを作るといった使い方です。AIに渡すのは件名と本文の必要な部分だけにし、送る前には必ず人が確認してください。問い合わせへの返信下書きは Gmailの問い合わせ返信をAIで下書き、フォームの回答をAIで分類して通知する方法は Googleフォームの回答をAIで分類・通知 にまとめています。
このページのコードを含む6本を、1つのシートでまとめて動かしたい方へ
無料記事のコードは1本ずつ単独で使う前提のため、同じプロジェクトに複数入れると定数名が衝突します。セット版は添付保存・Slack/Chat通知・古いメール整理・送信元ラベル・シート書き出し・未返信リマインドの6本が同時に動くよう整理し、「今すぐ実行/定期実行ON・OFF(二重登録なし)」メニューと日本語の導入手順を付けました。APIキー不要で、追加費用はかかりません。
Gmail自動化GAS 6本セット(APIキー不要/$9)を見る →Gumroad での販売です。デジタル納品のため、ダウンロード後の返金はお受けできません(不具合時は誠実に対応します)。
自分で設定するのが不安な方へ(ココナラ・日本円):シート1列のAI一括処理と、当日分の自動サマリーメールのGAS2本+日本語手順書を、ココナラで販売しています(3,000円・税抜〜)。初期設定サポート(+4,000円)や、あなたの実データで自動化フローを1つ一緒に作る導入伴走(+12,000円)は任意のオプションです(いずれも税抜)。対応できるかは購入前の見積り相談で確認できます。
ココナラで導入相談・購入する →一覧にしたあと、返信の下書きまで自動化したい方へ
届いた問い合わせをAIで分類し、登録した事実(FAQ)だけを使って返信の下書きを作る拡張版です。noreply・通知・メルマガは自動でスキップし、お試しモードで結果を確認してから本番にできます。
Gmail問い合わせ AI 下書き返信・拡張版(FAQ参照・除外送信元・お試しモード/$3)を見る → 請求書PDF+AI添え状・議事録AI要約など、そのまま動くGAS5本+日本語の導入手順書(PRO版・$39)→手で貼って使うプロンプトだけ欲しい方へ:事務AIプロンプト集12種(無料・投げ銭歓迎)
Gumroad での販売です。このページのメール書き出しのコードは無料で、有料版には含まれていません。AI を使う機能には OpenAI の API キー(従量課金)が必要です。デジタル納品のため、ダウンロード後の返金はお受けできません(不具合時は誠実に対応します)。
Gmailの返信漏れを毎朝リマインド · Gmailの添付ファイルをドライブに自動保存 · Gmail問い合わせ返信をAIで下書き · スプレッドシートから差し込みメールを下書き作成 · Googleフォームの自動返信メール · 無料本:GAS×ChatGPT事務自動化の基本