Gmailの添付ファイルをDriveに自動保存する

GASGmailDrive自動化
Gmailの添付ファイルをDriveに自動保存するのサムネイル

はじめに
こんにちは、GASおじです。今日は「Gmailの添付ファイルをGoogle Driveに自動保存する」スクリプトの作り方を解説するよ。中小企業の経営者さんやフリーランスの方は、日々のメールから資料や見積もりなどの添付ファイルを手作業で管理していることが多いはず。これ、GASを使えば無料で(Googleアカウントの利用枠内で追加の専用SaaS料金なし。ただしApps Scriptのquota・実行上限あり)自動化できるんだ。
ただし大事なのは、既存データをいきなり削除しないこと。復元ができるようにバックアップやロールバックの仕組みを組み込むことも必須だよ。

1. 何をどう自動化するのか?

Gmailの特定のラベル(例:「保存済み」)が付いたメールの添付ファイルを、Google Driveの新規フォルダに日時付きで保存する。
既存のDrive内のファイルは削除・上書きせず、新規ファイルを作る方式。これで誤って大事なファイルを消すリスクが減るね。
さらに、処理済みのメールには「保存済み」ラベルを付けて重複処理を防ぐ。

2. 初期設定と必要権限

  • Gmailのラベル「保存済み」を予め作成しておく(ラベル名は任意)。
  • Google Driveに添付ファイル保管用の親フォルダを作成し、そのIDを控える。
  • スクリプトはGmailとDriveのAPIにアクセスするので、初回実行時に認可が必要。
  • installable trigger(時間主導型トリガー)を設定して定期実行させる。

また、個人情報を含むメールや添付ファイルの扱いには慎重になろう。データの取り扱いポリシーを遵守し、必要に応じて社内ルールも整備してほしい。

3. 具体的なGoogle Apps Scriptコード例

function saveGmailAttachmentsToDrive() {
  const labelName = '保存済み';  // 既存のラベル名
  const parentFolderId = '【Driveの親フォルダIDをここに】'; // 事前に作成したフォルダID
  const parentFolder = DriveApp.getFolderById(parentFolderId);

  // 1. Gmailでラベル検索。未処理メールのみ取得
  const threads = GmailApp.search('label:inbox -label:' + labelName, 0, 50);
  if (threads.length === 0) {
    Logger.log('保存対象のメールはありませんでした');
    return;
  }

  // 処理用に新規フォルダを日時付きで作成(バックアップ/ロールバック用)
  const now = new Date();
  const folderName = Utilities.formatDate(now, Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss') + '_添付ファイル保存';
  const currentFolder = parentFolder.createFolder(folderName);

  // 2. 処理済みメールIDリスト(後で一括でラベル付け)
  const processedThreads = [];

  // 3. 添付ファイルをフォルダに保存
  threads.forEach(thread => {
    const messages = thread.getMessages();
    messages.forEach(message => {
      const attachments = message.getAttachments({includeInlineImages: false});
      attachments.forEach(file => {
        // ファイル名に日時を付けて重複回避
        const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
        const safeFileName = timestamp + '_' + file.getName();
        currentFolder.createFile(file.copyBlob()).setName(safeFileName);
      });
    });
    processedThreads.push(thread);
  });

  // 4. 処理済みメールにラベル付け(バッチ処理)
  const label = GmailApp.getUserLabelByName(labelName) || GmailApp.createLabel(labelName);
  processedThreads.forEach(thread => {
    thread.addLabel(label);
  });

  Logger.log('添付ファイルの保存が完了しました。保存先フォルダ: ' + currentFolder.getUrl());
}

ポイント解説

  • searchで未処理メールを限定取得(「保存済み」ラベルが付いていないもの)。
  • 添付ファイルは新規作成フォルダに保存し、既存ファイルをいじらない。
  • バッチ的に処理済みのメールにラベルを付けて重複処理を防止。
  • ファイル名にタイムスタンプを付けて上書きを防止。
  • 既存の削除APIは使わず、データの安全性を担保。

4. トリガー設定と復元手順

  • スクリプトエディタ上部の「時計アイコン」から「トリガー」を開き、saveGmailAttachmentsToDriveを時間主導型(例:1時間に1回)で設定しよう。
  • 定期的に添付ファイルがDriveに保存されるようになる。

万が一誤って処理した場合は、Driveの日時付きフォルダ単位でファイルを確認し、必要に応じて手動で復元が可能。
また、メールは削除しないのでGmail上で元メールは残っている。

5. コスト削減の仮定例

仮に毎日50通のメールで、ひとつの添付ファイル保存作業に10分かかるとしよう。

  • 1日の作業時間削減:50通 × 10分 = 500分(約8.3時間)
  • 時給2000円とすると、8.3時間 × 2000円 = 16,600円/日
  • 月20営業日で計算すると、16,600円 × 20日 = 332,000円/月の工数削減効果。

もちろんこれはあくまで仮定の計算式であり、実際の効果は業務内容や運用体制による。
そしてGoogle Apps ScriptはGoogleアカウントの利用枠内で追加の専用SaaS料金なし(Apps Scriptのquota・実行上限あり)だから、SaaSの月額費用を新たに払う必要もない。

おわりに

今回紹介したスクリプトはGASおじが普段から推奨している「安全第一、既存データを守る」設計思想に基づいている。
中小企業やフリーランスの皆さんもぜひ自動化して、貴重な時間をもっと本業に使ってほしい。

興味ある方は、GASおじラボのメンバーシップで500以上のツールを使い放題!
GASおじラボで500ツール使い放題 →

それではまた次回!おじさんでした。