📧

Gmailの添付ファイルを自動でGoogleドライブに保存する仕組みを作ってみた【請求書を例に解説】

に公開

はじめに

毎月、メールで届く請求書やレポート、契約書などの添付ファイル

手動でダウンロードして、ファイル名を付けて、Googleドライブのフォルダに整理…
これが意外と手間で、地味に時間を取られる作業だったりします。

本記事では、Google Apps Script(GAS) を使って、
Gmailで受信したメールの添付ファイルを自動でGoogleドライブに保存し、整理する仕組みを紹介します。


できること

以下のような処理を自動で行います。

  • Gmailで「GCP請求」ラベルが付いたメールを対象に
  • 添付ファイル(例:請求書のPDF)を指定フォルダに保存
  • ファイル名を 前月の年月_差出人名_送信日時.拡張子 で整理
  • 処理済みのメールには「格納済」ラベルを付けて、重複処理を防止

実行結果のファイル名例

2403_野口英世_250424_093012.pdf
  • 2403: 請求書の対象月(メール送信日の1ヵ月前)
  • 野口英世: 差出人の名前(社名やメールアドレスは除外)
  • 250424_093012: メールの送信日時(2桁年 + 時間)

具体例:GCPから届く請求書メールの場合

Gmailで以下のような件名のメールが届いたとします。

【xxxxxxx】 Google Cloud Platform & APIs: xxxx-xxxxx-xxxxx の請求書の用意ができました

このようなメールに Gmail のフィルタ機能で「GCP請求」ラベルを自動で付与しておけば、
本スクリプトがそのラベル付きメールを対象に、添付されたPDFを自動保存します。


スクリプト全文(コピペOK)

function saveInvoiceAttachmentsToDrive() {
  const sourceLabelName = 'GCP請求';
  const doneLabelName = '格納済';
  const folder = DriveApp.getFolderById('xxxxxx'); // ←保存先フォルダIDを指定

  const sourceLabel = GmailApp.getUserLabelByName(sourceLabelName);
  const doneLabel = GmailApp.getUserLabelByName(doneLabelName) || GmailApp.createLabel(doneLabelName);

  const threads = sourceLabel.getThreads();

  threads.forEach(thread => {
    const messages = thread.getMessages();

    messages.forEach(message => {
      const fromFull = message.getFrom();
      const nameOnlyMatch = fromFull.match(/^([^<]+)/);
      let senderName = nameOnlyMatch ? nameOnlyMatch[1].trim() : fromFull;

      senderName = senderName.replace(/社名など|株式会社|有限会社|(株)|<.*?>/gi, '').trim();
      senderName = senderName.replace(/\s+/g, '_').replace(/[^a-zA-Z0-9_---]/g, '');

      const originalDate = message.getDate();
      const lastMonth = new Date(originalDate);
      lastMonth.setMonth(lastMonth.getMonth() - 1);

      const yymm = Utilities.formatDate(lastMonth, Session.getScriptTimeZone(), 'yyMM');
      const dateStr = Utilities.formatDate(originalDate, Session.getScriptTimeZone(), 'yyMMdd_HHmmss');

      const attachments = message.getAttachments();
      attachments.forEach(file => {
        const ext = file.getName().split('.').pop();
        const filename = `${yymm}_${senderName}_${dateStr}.${ext}`;
        folder.createFile(file.copyBlob()).setName(filename);
      });
    });

    thread.removeLabel(sourceLabel);
    thread.addLabel(doneLabel);
  });
}

セットアップ手順

  1. Google Apps Script を開いて新規プロジェクトを作成
  2. 上記コードを貼り付ける
  3. DriveApp.getFolderById() に保存先フォルダIDを入力
  4. Gmailで「GCP請求」「格納済」ラベルを用意(なければ自動作成されます)
  5. Gmailのフィルタで、対象メールに「GCP請求」ラベルを自動付与するよう設定
  6. スクリプトを実行(初回はGmailとDriveへのアクセス権を許可)

🛡️ セキュリティ上の注意点

便利な自動化機能ですが、運用上のセキュリティにもご配慮ください。

  • 信頼できる差出人のみを対象にすること
    添付のPDFファイルに悪意あるスクリプトが含まれている場合もあるため、
    フィルタ条件で送信元を絞り込むことが推奨されます。

  • 保存先のアクセス管理
    自動保存されたファイルを他のメンバーが開く可能性がある場合、
    フォルダの共有設定にも注意が必要です。

  • 保存されたファイルのチェック体制
    完全な無確認運用にせず、たとえば月1回まとめてチェックする仕組みを併用すると安心です。


応用アイデア

  • PDF以外のファイルはスキップ
  • 特定のキーワードが含まれるメールのみ対象にする
  • 保存先を年/月単位のフォルダで分ける
  • Google Drive上でファイル名による分類を自動化(Google Apps Script + フォルダ整理)

まとめ

請求書やレポートが毎月届くような業務では、
このようなスクリプトでの自動化が大きな時短・ミス防止につながります。

CareNet Engineers

Discussion