GASでGmailの添付ファイルをGoogleドライブに自動保存する方法
取引先から届く請求書・注文書・報告書をGmailで受け取り、毎回手動でダウンロードしてGoogleドライブに保存している——この作業をGASで自動化すると、1通あたり数分の手間がゼロになります。この記事では、Gmailの添付ファイルをGoogleドライブに自動保存するGASのコードを、検索条件・フォルダ指定・重複チェック・定期実行まで実用的な形で解説します。
目次
GASでGmailの添付ファイルを自動保存する仕組み
GASでGmailを操作するには GmailApp クラスを、Googleドライブを操作するには DriveApp クラスを使います。この2つを組み合わせることで、「Gmailで特定の条件に一致するメールを検索し、添付ファイルを取り出してGoogleドライブのフォルダに保存する」という処理を自動化できます。
処理の流れは以下のとおりです。まず GmailApp.search() でメールスレッドを検索します。次に各スレッドのメッセージを取り出し、getAttachments() で添付ファイル一覧を取得します。そして DriveApp.getFolderById() で保存先フォルダを指定し、folder.createFile(attachment) でファイルを作成します。
| 使用クラス | 主なメソッド | 役割 |
|---|---|---|
| GmailApp | search(query) | 条件でメールを検索 |
| GmailThread | getMessages() | スレッド内のメッセージ取得 |
| GmailMessage | getAttachments() | 添付ファイル一覧取得 |
| GmailAttachment | getName(), getBytes() | ファイル名・内容取得 |
| DriveApp | getFolderById(id) | 保存先フォルダを取得 |
| DriveFolder | createFile(blob) | ファイルを作成・保存 |
業務自動化でできること100選
経理・人事・営業・CS・総務・ITの6部門100事例を収録。各事例に月間削減時間と導入難易度を明記。今日から始められるチェックリスト付き。
基本コード——添付ファイルをドライブに保存する
以下は、過去1日以内に受信した添付ファイル付きメールを検索し、Googleドライブの指定フォルダに保存するシンプルなコードです。
function saveGmailAttachments() {
// 保存先フォルダIDをGoogleドライブのURLから取得して設定
const FOLDER_ID = 'ここにGoogleドライブのフォルダIDを入力';
const folder = DriveApp.getFolderById(FOLDER_ID);
// 過去1日以内の添付ファイル付きメールを検索
const query = 'has:attachment newer_than:1d';
const threads = GmailApp.search(query);
threads.forEach(thread => {
thread.getMessages().forEach(message => {
const attachments = message.getAttachments();
attachments.forEach(attachment => {
// ファイル名に受信日を付加して保存
const date = Utilities.formatDate(
message.getDate(), 'Asia/Tokyo', 'yyyyMMdd'
);
const fileName = `${date}_${attachment.getName()}`;
folder.createFile(attachment.copyBlob().setName(fileName));
Logger.log(`保存完了: ${fileName}`);
});
});
});
}
フォルダIDは、Googleドライブでフォルダをブラウザで開いた際のURLの末尾にある文字列です。例えばURLが https://drive.google.com/drive/folders/ABC123XYZ であれば、ABC123XYZ がフォルダIDです。
実用的な拡張——フォルダ分け・重複チェック・ファイル名管理
送信者やファイル種別でフォルダを自動振り分け
請求書はPDFフォルダ、画像はImagesフォルダといった振り分けを自動化するには、ファイルの拡張子や送信者のメールアドレスを判定して保存先フォルダを切り替えます。
function getTargetFolder(attachment, rootFolder) {
const name = attachment.getName().toLowerCase();
const subFolderName = name.endsWith('.pdf') ? '請求書PDF'
: name.endsWith('.xlsx') ? 'Excelファイル'
: name.endsWith('.csv') ? 'CSVデータ'
: 'その他';
// サブフォルダが存在しなければ作成
const iter = rootFolder.getFoldersByName(subFolderName);
return iter.hasNext() ? iter.next() : rootFolder.createFolder(subFolderName);
}
重複保存を防ぐチェック
同じメールを複数回処理すると、同じファイルが重複して保存されてしまいます。これを防ぐには2つのアプローチがあります。ひとつは保存済みのメッセージIDをPropertiesServiceに記録しておく方法、もうひとつはドライブ上の同名ファイルの存在チェックです。
function isAlreadySaved(folder, fileName) {
const files = folder.getFilesByName(fileName);
return files.hasNext(); // 同名ファイルが存在すればtrue
}
// 使用例
if (!isAlreadySaved(targetFolder, fileName)) {
targetFolder.createFile(attachment.copyBlob().setName(fileName));
Logger.log(`保存: ${fileName}`);
} else {
Logger.log(`スキップ(保存済み): ${fileName}`);
}
Gmailの検索条件を使いこなす
GASの GmailApp.search() には、Gmailの検索演算子をそのまま使えます。特定の送信者・件名・ラベルを条件にすることで、保存対象を精度よく絞り込めます。
| 検索クエリ例 | 説明 |
|---|---|
| has:attachment newer_than:1d | 過去1日以内の添付ファイル付きメール |
| from:supplier@example.com has:attachment | 特定の送信者からの添付付きメール |
| subject:請求書 has:attachment | 件名に「請求書」を含む添付付きメール |
| label:取引先 has:attachment | 特定ラベルの添付付きメール |
| filename:pdf has:attachment | PDF添付のメール(ファイル種別で絞り込み) |
複数の条件を組み合わせることもできます。例えば 'from:supplier@example.com subject:請求書 has:attachment newer_than:7d' とすれば、特定の取引先から過去1週間以内に届いた請求書PDFのみを対象にできます。
トリガーで毎日自動実行する設定
GASエディタからトリガーを設定する手順
手動でスクリプトを実行するのではなく、毎日決まった時刻に自動で添付ファイルを保存する仕組みを作るには、GASのトリガー機能を使います。
設定手順は以下のとおりです。GASエディタの左側メニューから「トリガー」を選択します。「トリガーを追加」をクリックし、実行する関数(saveGmailAttachments)を選択します。「イベントのソース」を「時間主導型」に設定し、「時間ベースのトリガーのタイプ」を「日付ベースのタイマー」に設定します。実行時刻を指定(例: 午前7〜8時)して保存します。
これで毎朝7時台に自動的に前日の添付ファイルがGoogleドライブに保存されます。担当者は朝出社したときには、すでにドライブにファイルが整理されている状態になります。
Gmailのラベルを活用した運用のコツ
GASで処理済みのメールに「保存済み」ラベルを付け、次回の検索クエリに -label:保存済み を加えると、重複処理を確実に防げます。ファイルの存在チェックよりも確実な方法です。thread.addLabel(GmailApp.getUserLabelByName('保存済み')) で実装できます。
Q添付ファイルのサイズに上限はありますか?
AGmailApp経由で扱える添付ファイルは1ファイルあたり最大50MBが目安です。これはGmailの添付ファイルサイズ上限(25MB)よりも大きいため、通常のメール業務では問題になることはほとんどありません。ただし、GASのメモリ上限(スクリプトの実行中に使用できるメモリ)に引っかかる場合があるため、大量の大容量ファイルを一度に処理する場合は注意が必要です。
Q特定の送信者からのメールだけ保存できますか?
Aはい、検索クエリに from:相手のメールアドレス を加えることで特定の送信者に絞り込めます。複数の送信者を対象にする場合は from:(aaa@example.com OR bbb@example.com) のように記述します。
QGoogleドライブの容量がいっぱいになった場合はどうなりますか?
AGoogleドライブの空き容量がなくなると、folder.createFile() でエラーが発生します。本番運用では、保存前にドライブの空き容量をチェックする処理を加えるか、定期的にGoogleドライブの使用量を確認する習慣を持つことを推奨します。
まとめ
この記事のポイント
- GASの GmailApp と DriveApp を組み合わせると、添付ファイルの自動保存が数十行のコードで実現できる
- Gmailの検索演算子(from・subject・label・filename等)で保存対象を精度よく絞り込める
- ファイル種別・送信者でフォルダを自動振り分けすると、保存後の管理がさらに楽になる
- 重複保存防止は「Gmailラベル」を活用するのが最も確実な方法
- トリガーで毎日自動実行すれば、担当者がやることはゼロになる
GmailやDriveの操作に慣れたら、GASとURLFetchAppを使った外部API連携の設計と認証方法を理解することで、社内ツール以外の外部サービスとの連携にも応用できます。
※本記事の情報は2026年4月時点のものです。