ワザ箱 暮らしと仕事の悩みを、手順で解決するサイト

メールの添付ファイルを毎回手でダウンロードして保存するのが面倒

公開 2026年11月2日2026年11月時点の情報
先に結論

Gmailのフィルタで対象メールに専用ラベルを付け、Apps Scriptがその添付をドライブのフォルダへ保存します。
保存後にラベルを外し、同名のファイルは作りません。

  1. Gmailで専用ラベルを作り、フィルタで自動で付ける
  2. 保存先フォルダのIDを控える
  3. Apps Scriptにコードを貼り、1回手で実行して許可する
  4. 1時間ごとのトリガーを1つ作る
  5. ラベルが消えてフォルダにPDFが増えれば完了

請求書は月に何通も届き、毎回の保存が手間です。

※画面名は2026年11月時点のものです。

白い札を結んだ緑のファイルボックスに、白い紙やオレンジの封筒が差し込まれていく絵

1専用ラベルと保存先を用意する

パソコンのGmailで 請求書保存 など新しいラベルを作ります。保存後に外れるので、整理用のラベルとは分けます。フィルタでこのラベルを付けます(作り方は問い合わせメールの仕分け)。

保存先はドライブでフォルダを開き、アドレスの folders/ 以降を ? の手前まで控えます(この記事の補足)。

2コードを貼って1回実行する

  1. script.google.com の「新しいプロジェクト」で中身を下のコードに替え、1〜3行目を書き換えて保存
  2. プルダウンで saveAttachments を選び「実行」
  3. 権限を選ぶ画面が出たら、Gmailとドライブの両方を許可する
  4. 「このアプリは確認されていません」と出たら「詳細」 → 「(プロジェクト名)に移動(安全ではありません)」で続行
const LABEL_NAME = '請求書保存';
const FOLDER_ID = 'ここにフォルダID';
const ONLY_PDF = true; // PDF以外も保存するなら false に

function saveAttachments() {
  const label = GmailApp.getUserLabelByName(LABEL_NAME);
  if (!label) throw new Error('ラベル名を確認');
  const folder = DriveApp.getFolderById(FOLDER_ID);
  for (const thread of label.getThreads(0, 20)) {
    const msgs = thread.getMessages();
    for (const msg of msgs) {
      const stamp = Utilities.formatDate(msg.getDate(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
      let n = 0;
      for (const att of msg.getAttachments({ includeInlineImages: false })) {
        const name = att.getName();
        if (ONLY_PDF && !/\.pdf$/i.test(name)) continue;
        const fileName = `${stamp}_${++n}_${name}`;
        if (folder.getFilesByName(fileName).hasNext()) continue;
        folder.createFile(att.copyBlob().setName(fileName));
      }
    }
    thread.refresh();
    if (thread.getMessageCount() === msgs.length) thread.removeLabel(label);
  }
}
ラベルありまだ保存していない印

保存が済むとラベルを外す。途中で止まったり処理中に新着が来たりしたら、ラベルを残して次の実行でやり直す。保存したファイルを移動・改名すると同名チェックが効かず再保存されることがあるので、整理するならコピーする

名前にメールの日時と添付の番号を付け、同名があれば作りません。インライン画像は除き、同じスレッドのほかのメールのPDFも保存されます。
出典: Class GmailMessage / Class GmailThread / Class Folder

承認時、自分で貼ったコード以外は許可しない(この記事の提案)。会社のアカウントは、管理者が許可していないと承認できないことがあります。
出典: データアクセスの監視と制限

31時間ごとに動かす

  1. 左の「トリガー」 → 右下の「トリガーを追加」
  2. 関数 saveAttachments と時間主導型のタイプを選び、間隔を1時間ごとにする
  3. 「保存」を押す

トリガーは1件だけにします(2件あると同時に動き二重保存の原因に。この記事の提案)。止めるときは script.google.com の「マイ トリガー」で、その他アイコン→「トリガーを削除」。
出典: インストール可能なトリガー

保存されない時の確認

あわせて読みたい

スプレッドシートを誤って消されても戻せるよう毎日自動でバックアップしたい GASで宛先ごとに名前や本文の一部を変えてメールを一括送信したい GASでスプレッドシートに書き出すと電話番号の先頭の0が消える スプレッドシートの行ごとにGoogleドキュメントの案内状を一括で作りたい