Gmailで届いた請求書や資料を、そのたびにダウンロードしてGoogle Driveへ保存していませんか?
件数が少ないうちはそれほど大変ではありませんが、
「メールを開く → 添付を保存 → Driveを開く → フォルダを探す → アップロード」
という作業を毎回繰り返すのは、地味に手間がかかります。
Google Apps Script(GAS)を使えば、Gmailに届いた添付ファイルを指定したGoogle Driveフォルダへ自動保存できます。
今回は実際に、次の内容まで動作確認しました。
- PDFファイルの自動保存
- 複数添付ファイルの保存
- 日本語ファイル名の保存
- 二重保存の防止
- 処理済みメールへのラベル付与
- 10分おきの自動実行
この記事では、実際に使用したコードと設定方法を順番に紹介します。
✅ この記事は実際に動作検証しています
Gmailのテストメールを使い、件名を条件に対象メールを検索して、添付ファイルをGoogle Driveへ自動保存する処理を確認しました。複数添付ファイルの保存や、処理済みラベルによる重複保存防止も検証しています。
検証結果: Gmail検索:成功 / 添付保存:成功 / 複数添付:確認済み / ラベルによる重複保存防止:確認済み
今回作る仕組み
今回作るのは、次のような自動化です。
Gmailにメールが届く
↓
件名などの条件に一致するメールを検索
↓
添付ファイルを取得
↓
Google Driveの指定フォルダへ保存
↓
処理済みメールに「Drive保存済み」ラベルを付ける
さらにApps Scriptのトリガーを設定して、一定間隔で自動実行します。
そのため、設定後は基本的に手動操作する必要はありません。
今回はテストとして、
【請求書】2026年9月分
という件名のメールを対象にしました。
Google Driveに保存先フォルダを作る
まず、添付ファイルの保存先になるGoogle Driveフォルダを作ります。
今回は、
TaskLess Lab_Gmail添付自動保存テスト
というフォルダを作成しました。
フォルダを開くと、ブラウザのURLは次のようになります。
https://drive.google.com/drive/folders/XXXXXXXXXXXX
このうち、
XXXXXXXXXXXX
の部分がフォルダIDです。
あとでApps Scriptに設定するので、コピーしておきます。
Apps Scriptを作成する
Google Apps Scriptを開き、新しいプロジェクトを作成します。
今回は、
TaskLess Lab Gmail添付自動保存テスト
という名前にしました。
新しいプロジェクトを作成し、次のコードを貼り付けます。
※新規プロジェクト作成時に元から入っている文字は削除します
function saveGmailAttachmentsToDrive() {
// 保存先のGoogle DriveフォルダID
const FOLDER_ID = "ここにフォルダIDを入れる";
// 処理済みメールにつけるラベル
const LABEL_NAME = "Drive保存済み";
// 対象メールの検索条件
const SEARCH_QUERY = 'has:attachment subject:"【請求書】"';
const folder = DriveApp.getFolderById(FOLDER_ID);
// ラベル取得。存在しなければ作成
let label = GmailApp.getUserLabelByName(LABEL_NAME);
if (!label) {
label = GmailApp.createLabel(LABEL_NAME);
}
const threads = GmailApp.search(SEARCH_QUERY);
threads.forEach(function(thread) {
// すでに処理済みならスキップ
const labels = thread.getLabels();
const alreadyProcessed = labels.some(function(threadLabel) {
return threadLabel.getName() === LABEL_NAME;
});
if (alreadyProcessed) {
return;
}
const messages = thread.getMessages();
messages.forEach(function(message) {
const attachments = message.getAttachments({
includeInlineImages: false,
includeAttachments: true
});
attachments.forEach(function(attachment) {
folder.createFile(attachment);
console.log(
"保存しました:" + attachment.getName()
);
});
});
// 処理済みラベルを付与
thread.addLabel(label);
});
}
Google DriveのフォルダIDを設定する
コード内の、
const FOLDER_ID = "ここにフォルダIDを入れる";
を、先ほどコピーしたGoogle DriveのフォルダIDに変更します。
例えば、
const FOLDER_ID = "1AbCdEfGh123456789";
のような形です。
対象にするメールを指定する
今回重要なのが、この部分です。
const SEARCH_QUERY = 'has:attachment subject:"【請求書】"';
これは、次の条件に一致するメールを検索する設定です。
- 添付ファイルがある
- 件名に「【請求書】」が含まれている
つまり、
【請求書】2026年9月分
や、
【請求書】10月分をお送りします
などが対象になります。
逆に、「【請求書】」を含まないメールは処理されません。
業務で使う場合は、ここを変更することで対象メールを絞り込めます。
最初は手動で実行する
コードを保存したら、まずは自動化せずに手動で動作確認します。
Apps Script上部から、
saveGmailAttachmentsToDrive
を選択して「実行」をクリックします。
初回はGoogleアカウントへのアクセス許可を求められるので、内容を確認して許可します。
実行後、対象メールの添付ファイルがGoogle Driveに保存されているか確認します。
今回のテストでは、PDFファイルが正常に保存されました。

処理済みメールには「Drive保存済み」ラベルが付く
今回のコードでは、ファイルを保存したあと、
Drive保存済み
というGmailラベルを付けています。

これには、同じ添付ファイルを何度も保存しないための役割があります。
二重保存を防止できるか確認
自動化では、同じメールを何度も処理してしまうと、同じファイルが増えてしまう可能性があります。
invoice.pdf
invoice.pdf
invoice.pdf
そこで、今回のコードでは処理前に、
const alreadyProcessed = labels.some(function(threadLabel) {
return threadLabel.getName() === LABEL_NAME;
});
で「Drive保存済み」ラベルの有無を確認しています。
ラベルが付いていれば、
if (alreadyProcessed) {
return;
}
によって処理をスキップします。
実際に同じメールに対してスクリプトをもう一度実行しましたが、同じ添付ファイルが二重保存されないことを確認できました。
複数の添付ファイルも保存できる
次に、1通のメールへ複数のファイルを添付して確認しました。
今回は、
- PDFファイル
- 画像ファイル
の2つを添付しました。
その状態でスクリプトを実行したところ、PDF・画像ともにGoogle Driveへ保存されました。
メールにも正常に「Drive保存済み」ラベルが付きました。
コードでは、
attachments.forEach(function(attachment) {
folder.createFile(attachment);
});
としているため、取得した添付ファイルを順番に保存しています。
日本語のファイル名も文字化けしなかった
日本語ファイル名についても確認しました。
例えば、
請求書_2026年9月.pdf
というファイルを添付して実行しました。
今回のテスト環境では、日本語部分が文字化けすることなく、そのままGoogle Driveへ保存されました。
10分おきに自動実行する
ここまでの状態では、Apps Scriptの「実行」ボタンを押さなければ処理されません。
そこで、Apps Scriptのトリガーを設定します。
左側メニューの時計アイコンから「トリガー」を開き、「トリガーを追加」をクリックします。
今回は次のように設定しました。
| 項目 | 設定内容 |
|---|---|
| 実行する関数 | saveGmailAttachmentsToDrive |
| デプロイ | Head |
| イベントのソース | 時間主導型 |
| 時間ベースのトリガー | 分ベースのタイマー |
| 間隔 | 10分おき |

これでApps Scriptが定期的に実行されます。
「10分おき」に設定しても、必ず毎時00分・10分・20分のように正確な時刻で実行されるわけではないため、おおむね10分間隔でチェックされる仕組みと考えるのが分かりやすいです。
本当に自動保存されるか確認
最後に、自動化が正常に動いているか確認しました。
新しく、
【請求書】2026年9月分
というメールを添付ファイル付きで送信します。
今回はApps Scriptの「実行」ボタンを押さず、そのまま待ちました。
その結果、
- Google Driveへ添付ファイルが保存
- Gmailに「Drive保存済み」ラベルが付与
されました。
つまり、
メール受信
↓
Apps Scriptが自動実行
↓
添付ファイルをDriveへ保存
↓
処理済みラベルを付与
まで、手動操作なしで実行できました。
Apps Scriptの実行履歴でも、「時間主導型」として正常に完了していることを確認できます。

保存されない場合に確認するポイント
フォルダIDが正しいか
まず確認したいのが、
const FOLDER_ID = "...";
の部分です。
保存先Google DriveフォルダのURLから取得したIDが正しく入力されているか確認します。
メールの件名が検索条件に一致しているか
今回のコードでは、
subject:"【請求書】"
を指定しています。
そのため、メール件名に「【請求書】」が含まれていなければ対象になりません。
添付ファイルが付いているか
検索条件には、
has:attachment
も含まれています。
添付ファイルがないメールは処理対象外です。
すでに「Drive保存済み」ラベルが付いていないか
一度処理したメールは再処理しない仕様です。
再テストするときは、新しいメールを送信するのが分かりやすいです。
Apps Scriptの実行履歴を確認する
Apps Scriptの左側メニューから「実行数」を開くと、スクリプトの実行履歴を確認できます。
正常に動作している場合は、ステータスに、
完了
と表示されます。
エラーになっている場合は、ここから原因を確認できます。
この仕組みを実務向けに拡張するなら
今回はできるだけシンプルな構成にしました。
ただし、この仕組みをベースにすると、さらにいろいろな自動化ができます。
- PDFだけを保存する
- 特定の送信元だけを対象にする
- 送信元ごとにフォルダを分ける
- 月ごとのフォルダを自動作成する
- ファイル名を自動変更する
- 保存後にSlackなどへ通知する
- 請求書の内容を読み取って一覧化する
最初から複雑な仕組みを作るより、まず今回のような「添付を自動保存する」処理から始めて、必要に応じて機能を追加する方が管理しやすいです。
Google Workspaceでは、フォーム回答後のメール送信も自動化できます。

まとめ
Google Apps Scriptを使うことで、Gmailに届いた添付ファイルをGoogle Driveへ自動保存できます。
今回実際に確認できたのは、
- PDFの保存
- 複数添付ファイルの保存
- 日本語ファイル名の保存
- 二重保存の防止
- 処理済みラベルの付与
- 時間主導トリガーによる自動実行
です。
一度設定してしまえば、
メールを開く
↓
添付をダウンロード
↓
Driveを開く
↓
アップロード
という一連の作業を減らせます。
請求書や定期的に届く資料など、「毎回同じように添付ファイルを保存している」業務とは相性のいい自動化です。


