Gmailの添付ファイルをドライブへ自動保存するには、Gmailのフィルタで対象にラベルを付け、GAS(Google Apps Script)を定期実行します。この記事では、PDF添付をGoogleドライブへコピーし、スプレッドシートに保存台帳を残すコードと設定手順を紹介します。まずプレビューと手動保存を試し、二重保存しないことを確認してから自動化します。
GmailのPDF添付を自動保存する仕組み
流れは「受信→フィルタでラベル付与→GASがPDFを保存→台帳へ記録→人が確認」です。メールを開いて保存し、URLを台帳へ転記する作業をまとめます。
添付の save_attachments.gs は、BBW保存対象 ラベルで検索したスレッド内の、直近30日のメッセージに付いたPDFを保存します。元メールや添付は変更・削除せず、ドライブにコピーを作ります。台帳には処理キー・保存日時・元ファイル名・保存URL・メッセージIDが残ります。
保存処理にAIは使いません。設定の理解にAIを使い、導入と結果を人がレビューする「2:AIと一緒にやる」の運用です。
用意するもの
- Gmail、Googleドライブ、スプレッドシート、Apps Scriptを利用できるアカウント
- 自分が書き込める練習用フォルダと、空の台帳用スプレッドシート
- 本記事に添付した
save_attachments.gs - 架空の内容で作ったPDFと、自分宛てのテストメール
組織のアカウントでは利用可否を確認し、最初は自分が管理する練習用の保存先で試します。
手順1:Gmailのフィルタでラベルを自動付与する
Gmailで BBW保存対象 ラベルを作り、架空のPDF付きテストメールに手動で付けます。実務用フィルタは、後の保存テストが通ってから有効にします。
フィルタはパソコン版Gmailで、次の順に作成します。
- 検索オプションを開き、送信者や件名、添付の有無などの条件を入力します。
- 一度検索し、対象外のメールが混ざらないか確認します。
- その条件からフィルタを作成し、ラベルを付ける操作で
BBW保存対象を指定します。 - 既存メールにも適用する場合は、過去分の対象を確認してから適用します。
架空の件名を使った条件例です。下記はGmailの検索欄で使う検索式で、ターミナルのコマンドではありません。
subject:BBW練習 has:attachment filename:pdf
実務では送信者なども組み合わせて絞ります。返信には条件が一致しない場合もあるので、新着でラベル付与を確認します。フィルタの作り方はGmail公式ヘルプでも確認できます。
手順2:ドライブと台帳をGASに設定する
- ドライブに保存先フォルダを作成します。フォルダURLの
folders/の後ろにあるIDを控えます。 - 空のスプレッドシートを作成します。URLの
/d/の後ろから次の/までがIDです。 - 台帳の「拡張機能」から「Apps Script」を開きます。
- ひな形のコードを、添付
save_attachments.gsの全文に置き換えます。 - 冒頭の
folderIdとspreadsheetIdにIDだけを入力し、保存します。URL全体は入れません。
設定部分は次の形です。下記のIDは説明用なので、自分のIDに置き換えます。
const BBW_CONFIG = {
folderId: '保存先フォルダIDを入れる',
spreadsheetId: '台帳スプレッドシートIDを入れる',
query: 'has:attachment label:BBW保存対象 newer_than:30d',
extensions: ['pdf'],
sheetName: '保存台帳',
threadLimit: 100,
};添付コードの全文が必要です。「保存台帳」シートと見出しは初回保存時に自動作成します。
検索結果はメール単体ではなくスレッドです。同じスレッド内の別の返信にあるPDFも、日付条件を満たせば候補になります。特定の送信者にフィルタを絞っても、スレッド内の各メールの送信者までコードで再判定するわけではありません。最初は必要なPDFだけを含む独立したテストメールを使ってください。検索APIの公式仕様でも、戻り値はスレッドの配列です。
手順3:previewAttachmentsで保存前に確認する
Apps Scriptで実行する関数に previewAttachments を選び、実行します。この段階ではドライブのファイルも台帳も作成しません。
初回は承認が求められます。アカウントと各サービスへのアクセス内容を読み、コードと利用目的を確認して許可します。プレビューを選んでも、プロジェクト全体で使うサービスの権限が求められる場合があります。未確認アプリの警告や組織によるブロックが出たら、内容を確認せずに進めず、管理者や公式案内を確認してください。
実行ログの preview:true と candidates 内のファイル名を見て、保存したいものだけか確認します。プレビューは保存済みを除外する処理ではないため、過去に保存したPDFも候補に表示されます。また、保存先のIDや書き込み権限が正しいかまでは確認しません。
PDFの判定は拡張子です。.pdf と .PDF が対象で、拡張子のない添付は除外します。内容や安全性の検査はしません。
手順4:saveAttachmentsで保存し、もう一度実行する
候補に問題がなければ、関数を saveAttachments に変えて実行します。
- ドライブにPDFが作成されたか確認します。
- 台帳の「保存台帳」に元ファイル名と保存URLが記録されたか確認します。
- 保存URLを開き、元の添付と内容が一致するか人が確認します。
- 同じ関数をもう一度実行し、PDFと台帳の行が増えないか確認します。
ログの candidates は今回見つかった候補数、saved は今回台帳へ記録した件数、skipped は記録済みとして処理を省いた件数です。途中失敗後の再開では、既存ファイルを再利用して台帳に記録した分も saved に含みます。
架空データでの入力例と出力例
入力は件名「BBW練習 A社の請求書」、ラベル BBW保存対象 の当日付メールです。添付が A社_請求書.pdf と メモ.txt なら、PDFだけが候補です。
初回保存が成功したときのログ例です。
{"candidates":1,"saved":1,"skipped":0}同じ状態でもう一度保存したときのログ例です。
{"candidates":1,"saved":0,"skipped":1}台帳の出力例です。キーとURLは実際にはメールや保存ファイルに対応します。
| 項目 | 出力例 |
|---|---|
| 処理キー | メッセージID_添付番号_ハッシュ |
| 保存日時 | 実行時の日時 |
| 元ファイル名 | A社_請求書.pdf |
| 保存URL | 作成したPDFのドライブURL |
| メッセージID | 対象メールの識別子 |
保存名は 処理キー--A社_請求書.pdf です。一部の文字置換と名前の長さ制限を行い、PDFは変換しません。
二重保存防止の仕組みと限界
コードはメッセージID・添付の配列内の番号・内容のハッシュを組み合わせた処理キーを作り、台帳に同じキーがあれば保存を省きます。別メールに同じPDFが届いた場合は別の処理キーになるため、それぞれ保存します。全メールを通した内容の重複排除ではありません。
ファイル作成直後に台帳書き込みが失敗しても、再実行時に保存先の同名ファイルを探して再利用します。同じプロジェクト内の同時実行はロックで抑えます。添付のハッシュとロックの公式仕様を利用した設計です。
台帳や保存済みファイルの削除・改名・移動、別プロジェクトからの同時処理まで含めた完全な保証ではありません。台帳に記録済みのファイルを削除しても、このコードは自動復元しません。運用中は処理キー、見出し、保存名、保存先を手で変えないでください。
手順5:時間主導型トリガーで定期実行する
手動での保存と再実行を確認できたら、Apps Scriptのトリガー管理から追加します。
- 実行する関数に
saveAttachmentsを指定します。 - イベントの種類として時間主導型を選びます。
- 必要な実行間隔や時間帯を指定し、保存します。
- 次の実行後、実行履歴・ドライブ・台帳を確認します。
トリガーは作成者の権限で動きます。受信直後の実行や厳密な時刻は保証されません。停止はトリガーを削除します。失敗通知と実行履歴を確認する担当者も決めます。時間主導型トリガーの公式ガイドで現行の設定方法を確認できます。
うまくいかないとき
- 候補がない: Gmailで設定の検索式を検索し、ラベル名、添付の拡張子、受信日を確認します。コードはメッセージの日付でも直近30日に絞ります。検索式だけを変更しても古い添付は対象になりません。
- 100スレッドで停止する: これは本コードの安全用の上限です。到達すると保存前に止まります。処理済みも検索に残るため、台帳記録があっても対象数は減りません。Gmailで対象ラベルを整理し、残したい対象だけに付け直してプレビューします。
- IDや権限のエラー: IDだけを設定したか、実行アカウントに保存先と台帳へのアクセス権があるか確認します。
- 台帳の見出しが違う: 列の追加・並べ替え・名称変更を確認します。運用中の台帳を空にせず、トリガーを止め、変更箇所を確認してから戻します。
- 途中で失敗する: 保存済みファイルと台帳を残して原因を確認し、解消後に再実行します。実行時間や各サービスの割り当て、保存容量も確認します。
Google側の制限はアカウントや時期で変わります。具体的な上限値は固定で覚えず、Apps Scriptの公式割り当て一覧を確認してください。
機密情報・個人情報の注意点
メールの内容を外部AIへ送る処理はありませんが、ファイル名はプレビューログと台帳に残り、PDFは保存先の共有範囲で閲覧可能になります。メールと同じ共有範囲とは限らないため、フォルダ・台帳・スクリプトの共有相手を確認します。機密情報や個人情報を含む添付は、所属組織の取り扱いルールに従ってください。
AIに説明を頼むなら、設定IDを伏せたコードだけを渡し、次のプロンプトを使えます。
このGASの検索条件、必要な権限、重複を防ぐ仕組み、停止方法を説明してください。 コードの保存処理は変更しないでください。 メールや添付の実データ、個人情報、保存先IDは提示しません。 コードから判断できることと、実環境で確認すべきことを分けてください。
最終確認は人が行います。新しい条件や保存先に変えたときも、プレビューからやり直してください。
よくある質問
GmailのPDFは手動でもGoogleドライブへ保存できますか?
できます。少数ならGmailの添付から保存する操作でも対応できます。GASは対象の選別・保存・台帳記録を繰り返したい場合に向きます。
PDF以外の添付ファイルも自動保存できますか?
コードの extensions が対象を決めています。ただし、本記事はPDFを対象にしています。変更する場合は必要な拡張子に限定し、プレビューとテスト保存を確認してください。拡張子の変更だけでファイル形式を変換する機能はありません。
トリガーを入れれば確認は不要ですか?
不要にはなりません。権限変更、割り当て超過、検索範囲から外れた古いメールなどで保存が止まる可能性があります。実行履歴と台帳を定期的に見て、対象メールとの照合を続けてください。
検証範囲
添付コードを全行読み、検索・添付取得・ハッシュ・保存・台帳追記・ロックの使い方を確認しました。明らかな誤りは見つからず、コードは元のまま添付しています。
ローカルではJavaScript構文チェックと模擬APIによる確認を行い、プレビューで書き込まないこと、拡張子と日付の絞り込み、再実行の重複回避、返信添付の追加、台帳書き込み失敗後の再開、対象数の上限、見出し不一致時の停止、ファイル名の処理を確認しました。
実Google環境での認可、Gmail検索の実結果、PDF保存、台帳への記録、時間主導型トリガー、組織固有の権限制限は未検証です。架空データでの手動テストと再実行確認を済ませてから、実務へ移してください。
添付ファイル CC0 ・ 自由に持ち帰れます
- スクリプト ・ 3.6 KB
会社のデータをAIに入れる前に、社内ルールを確認しましょう。
コメント 0
まだコメントはありません。質問や、試してみた感想を書いてみませんか?