問い合わせや注文のメールを毎日スプレッドシートに手作業でコピーしている場合、件数が増えるほど転記漏れや二重登録が起きやすくなります。
この記事では、Google Apps Scriptで受信メールを自動でスプレッドシートに転記する仕組みを、検索条件の書き換え方と二重転記を防ぐ設計まで整理しています。
完成イメージと仕組み
完成すると、受信トレイに届いたメールのうち条件に合うものだけを、日時・差出人・件名・本文の順でスプレッドシートに1行ずつ追記する状態になります。
仕組みは単純で、GmailApp.search() が条件に合うメールを探し、見つかった分だけシートに書き込み、書き込み終わったメールには専用のラベルを付けます。
このラベルが付いたメールは次回の検索対象から外れるため、同じメールを何度も転記する心配がありません。
問い合わせメールの一次対応まで含めて自動化したい場合は、モデルケースも参考になります。
手順
準備からトリガー設定まで、4つのステップで完成します。
Step1. スプレッドシートとスクリプトを用意する
転記先にするスプレッドシートを新規作成し、1行目に「受信日時」「差出人」「件名」「本文」の見出しを入れます。
続けてスプレッドシート上部のメニューから拡張機能を開き、Apps Scriptを選ぶとスクリプトエディタが立ち上がります。
Step2. コードを貼り付ける(コード全文)
スクリプトエディタに表示されているコードを全て消し、次のコードを貼り付けます。
function transferMailsToSheet() {
const sheetName = '問い合わせ一覧'; // ★ここを変える: 転記先シート名
const searchQuery = 'label:inbox subject:(お問い合わせ) -label:処理済'; // ★ここを変える: 検索条件(Step3の表を参照)
const processedLabelName = '処理済';
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
if (!sheet) {
throw new Error(`シート「${sheetName}」が見つかりません`);
}
let processedLabel = GmailApp.getUserLabelByName(processedLabelName);
if (!processedLabel) {
processedLabel = GmailApp.createLabel(processedLabelName);
}
const threads = GmailApp.search(searchQuery);
threads.forEach((thread) => {
thread.getMessages().forEach((message) => {
sheet.appendRow([
message.getDate(),
message.getFrom(),
message.getSubject(),
message.getPlainBody().slice(0, 200),
]);
});
thread.addLabel(processedLabel);
});
} GmailApp.search() が検索条件に合うメールのスレッドをまとめて取得し、スレッドごとに含まれる個々のメールを取り出して1行ずつシートに追記します。
最後の thread.addLabel(processedLabel) が、転記済みの目印を付ける部分です。
このラベル付けがあるため、翌日以降スクリプトを再実行しても同じメールが二重に追記されません。
Step3. 検索条件を自分の業務に合わせる(書き換え表)
書き換えるのは searchQuery の中身だけです。
Gmailの検索演算子は次のように組み合わせられます。
| 絞り込みたい内容 | 演算子 | 記入例 |
|---|---|---|
| 特定の相手から届いたメール | from: | from: customer@example.com |
| 件名にキーワードを含むメール | subject: | subject:(見積もり) |
| 特定のラベルが付いたメール | label: | label:重要案件 |
| 期間を指定する | after: / before: | after:2026/07/01 before:2026/07/08 |
| 直近の日数だけ対象にする | newer_than: | newer_than:1d |
| 添付ファイル付きだけに絞る | has:attachment | has:attachment |
複数の演算子は半角スペースで区切ると、全ての条件を満たすメールだけに絞り込まれます。
除外したい条件の前に「-」を付ければ、その条件に一致するメールを対象から外せます。
Step4. 時間トリガーを設定する
スクリプトエディタの左側にある時計マークの「トリガー」を開き、右下の「トリガーを追加」から設定します。
実行する関数にはtransferMailsToSheetを選び、イベントのソースは時間主導型、種類は分ベースまたは時間ベースのタイマーを選び、実行間隔を指定して保存します。
保存が終われば、指定した間隔で新着メールの確認と転記が自動で繰り返されます。
Google Apps Scriptでどの業務から自動化すべきか迷う場合は、判断基準を別記事で整理しています。

同じメールを二重に転記しないための仕組み
このスクリプトが二重転記を防いでいるのは、検索条件と後処理の2箇所が連動しているためです。
searchQuery に含めた -label:処理済 が、過去に転記済みのメールを検索結果から除外します。
そして転記が終わった直後に 処理済 ラベルを付けることで、次回以降の検索から確実に外れる状態を作っています。
トリガーの実行間隔を短くしても、この仕組みがある限り同じメールが重複して行に追加されることはありません。
逆にラベル付けの行を削除してしまうと、実行のたびに同じメールが際限なく追記されるため、コードを変更するときはこの2箇所を残したまま調整してください。
転記したメールをきっかけに担当者へ通知したい場合は、シート更新の通知を組み合わせる方法も参考になります。

Google Apps Scriptでのメール転記について相談してみませんか?
「検索条件をどう書けば自社の業務に合うか分からない」「添付ファイルの保存まで含めて自動化したい」「社内にGoogle Apps Scriptを設計できる人材がいない」
少しでもお心当たりがあれば、お気軽にご相談ください。
現在、Google Apps Scriptを使った業務自動化のお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. 一度に処理できるメール件数に上限はありますか?
GmailApp.search() は引数を指定しない場合、最大500件のスレッドを取得します。
それ以上のメールが対象になる場合は、開始位置と取得件数を指定する引数を追加して複数回に分けて呼び出してください。
Q. 添付ファイルも一緒に転記できますか?
コード自体は本文の転記のみですが、message.getAttachments() で添付ファイルを取得し、Google Driveへの保存処理を追加すれば対応できます。
添付ファイルの容量が大きい場合は、保存先のフォルダ容量にも注意してください。
Q. 同じスレッドに届いた返信メールも転記されますか?
転記されません。
処理済みラベルはスレッド単位で付くため、一度転記したスレッドに後から届いた返信は次回以降の検索対象から外れます。
返信も1通ずつ記録したい場合は、スレッド単位ではなくメッセージ単位で転記済みを管理する作りに変える必要があります。
Q. トリガーの実行間隔はどれくらいにすればよいですか?
問い合わせのように即時性が求められる業務は5分から15分おき、社内向けの定期集計であれば1時間おきが目安です。
Gmailの検索には1日あたりの呼び出し回数に上限があるため、業務に必要な速さと実行回数のバランスで決めてください。