業務自動化

Google Apps ScriptでGmail添付を自動保存 月¥0で経理作業を週3時間削減

中小企業 / 個人事業主 経理・請求書管理 の業務自動化レシピ
業種中小企業 / 個人事業主 経理・請求書管理
ツールGoogle Apps Script
難易度★★☆ 中
設定時間約 60 分

請求書 PDF をメールから 1 件ずつ落として、名前を付け替えて、台帳に転記する。この作業は Google アカウントだけで自動化できます。本レシピは Google Apps Script (Google が無料提供する自動化の仕組み) を使い、Gmail の添付ファイルを Drive に保存しスプレッドシートに一覧化する仕掛けを、コピーして動くコード付きで構築します。月額は ¥0 です。

読了目安 9 分 / 設定目安 60 分 / 月額 ¥0

編集長の見解: 経理の自動化というと Zapier や Make のような有料の自動化サービスが真っ先に候補に挙がりますが、連携先が Google の中だけで完結するなら、外部サービスを挟む必要はありません。Gmail・Drive・スプレッドシートはすべて Google のサービスであり、それらを直接つなぐ Google Apps Script は無料で使えます。月 ¥3,000 の自動化サービス費用は、年間で ¥36,000。少額に見えて、個人事業主にとっては決して無視できない固定費です。60 分の初期構築を許容できるなら、この記事の方法が最も費用対効果に優れます。

このレシピで解決する課題

請求書・領収書がメールで届く事業者に共通する、判断を伴わない定型作業を整理します。

  1. 添付ファイルの保存忘れ: メールは開いたが PDF を落とし忘れ、月末に Gmail を遡る羽目になる
  2. ファイル名がバラバラ: 「invoice.pdf」 「請求書.pdf」 のまま保存され、後から検索できない
  3. 台帳への転記: どの取引先からいつ何が届いたかを、スプレッドシートに手で打ち直している
  4. 突合作業: 「届いているはずの請求書が無い」 を探すのに、メールとフォルダを行き来する
  5. 属人化: 担当者しか保存ルールを知らず、休むと経理が止まる

これらはすべて 判断が一切要らない作業 です。だからこそ自動化の効果が確実に出ます。次のセクションで、完成する仕組みの全体像を示します。

完成形 (フロー図)

Gmail 添付 → Drive 保存 → スプレッドシート台帳
📧
01
Gmail 受信
請求書ラベル付きメールが届く
02
時刻トリガー
1 時間ごとに自動起動
📁
03
Drive へ保存
日時付きの名前に変換
📊
04
台帳へ追記
日付・送信元・件名・リンク
05
処理済みに
保存済みラベルで二重処理を防止

1 時間ごとに Google Apps Script が起動し、未処理の請求書メールをまとめて処理する

要点は 5 番目の「保存済みラベル」 です。処理したメールに印を付けることで、次回の実行時に同じファイルを二重保存する事故を防ぎます。次に、この仕組みに必要なものと費用を確認します。

必要なものと費用

必要なもの費用役割
Google アカウント¥0Gmail・Drive・スプレッドシートの利用
Google Apps Script¥0自動化を動かす仕組み本体
Drive の保存容量¥0 (無料枠 15 GB)請求書 PDF の保存先
Google Workspace (任意)¥800 / ユーザー / 月 〜独自ドメイン + 利用上限の拡大

無料の Google アカウント (gmail.com) は Gmail・Drive・Google フォトの合計で 15 GB の保存容量が付きます[出典]。請求書 PDF は 1 件あたり 100〜300 KB 程度が一般的なので、月 200 件でも年間 500 MB 前後 にとどまり、無料枠で数年は運用できる計算です。

Google Workspace の Starter プランは月額 ¥800 / ユーザーで、保存容量は 30 GB になります[出典]。ただし本レシピの目的だけなら、無料アカウントのままで十分に実用になります

Google Workspace に切り替える判断基準

本レシピにおいて有料プランが必要になるのは「1 時間より短い間隔で動かしたい」 「1 日の処理件数が数百件を超える」 の 2 ケースだけです。理由は後述の利用上限 (クォータ) の表で示します。それ以外なら無料アカウントで運用を始めて構いません。

有料の自動化サービスと何が違うか

同じことは Zapier や Make でも実現できます。編集部の比較は以下のとおりです。

比較項目Google Apps ScriptZapierMake
月額費用¥0無料枠あり / 有料は $19.99 (約 ¥3,100) から無料枠あり / 有料は $9 (約 ¥1,400) から
無料枠の実行量利用上限内なら追加費用なし月 100 タスク月 1,000 クレジット
設定の難しさ中 (コードを貼り付ける)易 (画面操作のみ)中 (画面操作 + 設定項目多め)
細かい制御高 (ファイル名・条件を自由に記述)
Google 以外との連携追加実装が必要得意得意
編集部のおすすめ度★★★★★ (Google 内で完結する用途)★★★☆ (他サービスと繋ぐなら)★★★★ (複雑な分岐があるなら)

Zapier の有料プランは月額 $19.99 から[出典]、Make の有料プランは月額 $9 から[出典]です (円換算は ¥155 / $ で編集部が算出した目安)。

判断の目安: 連携先が Gmail・Drive・スプレッドシート・カレンダーなど Google のサービスだけで閉じているなら Google Apps Script、Slack・Notion・freee など外部サービスを繋ぐなら Zapier や Make が適します。無理に一方に寄せる必要はなく、両方を併用しても構いません。外部サービス連携が主目的の場合は ZapierでGmail添付ファイル→Google Drive自動保存 のレシピも合わせてご覧ください。

次のセクションから、実際の構築手順に入ります。

設定手順 (60 分)

Google Apps Script 構築の 6 ステップ
Step 1
Gmail に「請求書」 ラベルを作る (10 分)

まず Gmail 側で対象メールを選別する仕組みを作ります。全添付ファイルを拾う設定は、社内資料や画像まで保存してしまうため避けてください。

  • Gmail の設定からフィルタを新規作成する
  • 条件: 件名に「請求書」 「領収書」 「invoice」 のいずれかを含み、かつ添付ファイルあり
  • 操作: 「請求書」 ラベルを付ける
  • 取引先が固定なら、送信元アドレスでの絞り込みがより確実です

ラベル名はコード内で指定するため、日本語 1 単語のシンプルな名前にしてください。

Step 2
Drive フォルダとスプレッドシートを用意 (10 分)

保存先を 2 つ作り、それぞれの ID を控えます。ID はブラウザのアドレス欄から読み取れます。

  • Drive フォルダ: 「経理_受信箱」 を作成。URL の末尾にある英数字の並びがフォルダ ID
  • スプレッドシート: 「請求書台帳」 を作成し、シート名を「台帳」 に変更
  • スプレッドシートの ID は URL の d と edit に挟まれた英数字の並び

この 2 つの ID を次のステップでコードに貼り付けます。

Step 3
Apps Script プロジェクトを作成 (5 分)

作成したスプレッドシートを開き、メニューの「拡張機能」 から「Apps Script」 を選びます。エディタが別タブで開き、空のプロジェクトが作られます。

スプレッドシートから作ることで、台帳との紐づけが分かりやすくなります。プロジェクト名は「請求書自動保存」 など分かりやすいものに変更してください。

Step 4
コードを貼り付け、設定 3 行を書き換える (15 分)

本記事の次セクションにあるコード全文をエディタに貼り付けます。書き換えるのは冒頭の設定部分だけです。

  • FOLDER_ID: Step 2 で控えた Drive フォルダの ID
  • SHEET_ID: Step 2 で控えたスプレッドシートの ID
  • SEARCH_QUERY: Step 1 で付けたラベル名に合わせる

貼り付けたらフロッピーディスクのアイコンで保存します。

Step 5
手動実行して権限を承認、動作を確認 (10 分)

エディタ上部の関数選択欄で setupSheet を選んで実行し、台帳に見出し行が入ることを確認します。続いて saveAttachmentsToDrive を実行します。

  • 初回実行時に Gmail と Drive へのアクセス許可を求める画面が出ます
  • 「詳細」 から自分のプロジェクトを選び、許可してください
  • Drive フォルダに PDF が入り、台帳に行が増えていれば成功です

ここで想定外のファイルが保存されていたら、Step 1 のラベル条件を先に修正します。

Step 6
定期実行のトリガーを設定 (10 分)

トリガー (指定した時刻や間隔でプログラムを自動起動する設定) を作れば、あとは放置で動き続けます。

  • 後述の createTrigger 関数を 1 回だけ手動実行する方法が確実です
  • 画面から設定する場合は、左メニューの時計アイコンから「トリガーを追加」
  • 推奨は 1 時間ごと。無料アカウントでは 1 分間隔は上限に抵触します (後述)

設定後 1 週間は、実行数のログ画面でエラーが出ていないか確認してください。

以上で構築は完了です。次に、実際に貼り付けるコードの全文を掲載します。

コード全文 (そのまま動きます)

以下は編集部が動作確認した実物です。冒頭の設定部分だけを自分の環境に合わせて書き換えてください。

// ===== 設定: ここだけ書き換える =====
const SEARCH_QUERY = 'label:請求書 has:attachment -label:保存済み';
const FOLDER_ID    = 'ここに Drive フォルダの ID を貼る';
const SHEET_ID     = 'ここにスプレッドシートの ID を貼る';
const SHEET_NAME   = '台帳';
const DONE_LABEL   = '保存済み';
const MAX_THREADS  = 20;   // 1 回の実行で処理する上限 (6 分制限への保険)
const ALLOW_EXT    = /\.(pdf|png|jpe?g)$/i;  // 保存する拡張子
// ====================================

/**
 * Gmail の添付ファイルを Drive に保存し、台帳へ 1 行追記する。
 * トリガーから 1 時間ごとに呼ばれる想定。
 */
function saveAttachmentsToDrive() {
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const sheet  = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME);
  const label  = getOrCreateLabel_(DONE_LABEL);

  const threads = GmailApp.search(SEARCH_QUERY, 0, MAX_THREADS);
  if (threads.length === 0) return;

  const rows = [];

  threads.forEach(function (thread) {
    thread.getMessages().forEach(function (message) {
      const date    = message.getDate();
      const from    = message.getFrom();
      const subject = message.getSubject();

      message.getAttachments().forEach(function (attachment) {
        const name = attachment.getName();
        if (attachment.getSize() === 0) return;
        if (!ALLOW_EXT.test(name)) return;

        const stamp   = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyyMMdd_HHmm');
        const newName = stamp + '_' + name;
        const file    = folder.createFile(attachment.copyBlob()).setName(newName);

        rows.push([
          Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy-MM-dd'),
          from,
          subject,
          newName,
          Math.round(attachment.getSize() / 1024),
          file.getUrl(),
          ''   // 金額: 経理担当が手入力する列
        ]);
      });
    });
    thread.addLabel(label);   // 処理済みの印。二重保存を防ぐ
  });

  if (rows.length > 0) {
    sheet.getRange(sheet.getLastRow() + 1, 1, rows.length, rows[0].length)
         .setValues(rows);
  }
}

/** 指定名のラベルを取得。無ければ作る。 */
function getOrCreateLabel_(name) {
  return GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
}

初回だけ実行する見出し行の作成と、トリガー登録の関数も併せて貼り付けておくと便利です。

/** 初回に 1 回だけ実行: 台帳の見出し行を作る */
function setupSheet() {
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME);
  sheet.getRange(1, 1, 1, 7)
       .setValues([[
         '受信日', '送信元', '件名', 'ファイル名',
         'サイズ (KB)', 'Drive リンク', '金額 (手入力)'
       ]])
       .setFontWeight('bold');
  sheet.setFrozenRows(1);
}

/** 初回に 1 回だけ実行: 1 時間ごとのトリガーを登録する */
function createTrigger() {
  ScriptApp.getProjectTriggers().forEach(function (t) {
    if (t.getHandlerFunction() === 'saveAttachmentsToDrive') {
      ScriptApp.deleteTrigger(t);   // 重複登録を防ぐ
    }
  });
  ScriptApp.newTrigger('saveAttachmentsToDrive')
           .timeBased()
           .everyHours(1)
           .create();
}

なぜ MAX_THREADS で上限を掛けるのか

Google Apps Script には「1 回の実行は 6 分まで」 という制限があります。未処理メールが数百件溜まった状態で初回実行すると、途中で強制終了して中途半端に処理される恐れがあります。1 回 20 件に絞り、トリガーで繰り返し処理させるほうが安全です。溜まっている場合は手動で数回実行して消化してください。

コードを動かす前に、Google 側が定める利用上限を必ず把握してください。次のセクションで整理します。

Google Apps Script の利用上限 (クォータ)

Google Apps Script は無料ですが、無制限ではありません。アカウント種別ごとに 1 日あたりの上限 (クォータ) が定められています[出典]。本レシピに関係する主な項目は以下のとおりです。

制限項目無料アカウント (gmail.com)Google Workspace
1 回の実行時間6 分6 分
トリガーの合計実行時間90 分 / 日6 時間 / 日
同時実行数30 / ユーザー30 / ユーザー
トリガー数20 / ユーザー / スクリプト20 / ユーザー / スクリプト
Gmail の読み書き (送信を除く)20,000 回 / 日50,000 回 / 日
メール送信先100 件 / 日1,500 件 / 日
外部への HTTP 通信20,000 回 / 日100,000 回 / 日

トリガーは最短 1 分間隔から最長 月 1 回まで設定できます[出典]。ただし 設定できる間隔と、上限内で回せる間隔は別物 です。ここが本レシピ最大の注意点になります。

無料アカウントで最も詰まりやすい制限: トリガー合計 90 分 / 日

無料アカウントのトリガー実行時間は 1 日合計で 90 分 です。1 時間ごと (1 日 24 回) なら 1 回あたり平均 3.7 分まで使える計算になり、本レシピの処理量なら十分に収まります。しかし 1 分間隔にすると 1 日 1,440 回、1 回あたり平均 3.7 秒しか使えず、上限超過で実行が止まります。編集部の推奨は「1 時間ごと」 です。急ぎの請求書処理でも、1 時間の遅延が問題になるケースはまずありません。

トリガー間隔の選び方を、編集部の判断としてまとめます。

トリガー間隔1 日の実行回数無料アカウントでの可否向いているケース
1 分ごと1,440 回❌ 上限超過しやすい本レシピでは不要
15 分ごと96 回⚠️ 処理が軽ければ可即時性を求める場合
1 時間ごと24 回✅ 推奨請求書・領収書の処理
1 日 1 回 (深夜)1 回✅ 余裕あり件数が少ない個人事業主

これらの上限を踏まえたうえで、実際にどれだけの工数が削減できるかを試算します。

Mira のシミュレーション (期待効果の試算)

以下は 編集部による試算 です。実際の効果は取引件数・業務フローにより変動します。

前提: 添付ファイルの保存・リネーム・台帳への転記に 1 件あたり平均 4 分かかっているものとします。自動化後は、月次でまとめて内容確認する時間のみが残ると想定します。

請求書・領収書まわりの月間工数 (月 200 件の場合・編集部の試算)
Before (手作業)
  • 保存・リネーム: 月 6.7 時間 (200件×2分)
  • 台帳への転記: 月 6.7 時間 (200件×2分)
  • 保存漏れの捜索: 月 1 時間程度
  • 月額費用: ¥0 (人件費のみ)
  • 担当者不在時: 作業が完全停止
  • 合計: 月 14.4 時間
After (Google Apps Script)
  • 保存・リネーム: 0 時間 (全自動)
  • 台帳への転記: 0 時間 (全自動)
  • 月次の確認作業: 月 1.3 時間
  • 月額費用: ¥0 (Google Apps Script は無料)
  • 担当者不在時: 自動で動き続ける
  • 合計: 月 1.3 時間

編集部の試算: 月 13 時間 = 週 3 時間相当の削減。追加の月額費用は発生しない

ただし 週 3 時間という数字は月 200 件を処理する事業者の場合 です。件数が少なければ削減幅も小さくなります。自社の規模に近い行をご確認ください。

月間の書類件数手作業の月間工数自動化後削減幅 (週あたり)
50 件 (個人事業主)約 3.3 時間約 0.3 時間約 0.7 時間 / 週
100 件 (数名規模)約 6.7 時間約 0.7 時間約 1.4 時間 / 週
200 件 (20〜50 名規模)約 14.4 時間約 1.3 時間約 3.0 時間 / 週
400 件 (50 名超)約 27 時間約 2.5 時間約 5.7 時間 / 週

月 50 件規模の個人事業主でも、年間に直せば約 36 時間の削減です。60 分の初期構築は 1 か月以内に回収できる計算になります。次に、導入時に実際に起きる失敗を挙げます。

編集部の警告 ⚠️ よくある 3 つの失敗

失敗パターン 1: 同じ請求書が何度も保存される

処理済みメールに印を付けないと、トリガーが回るたびに同じ添付ファイルが Drive に増え続けます。本記事のコードでは 保存済みラベルを付与し、検索条件で除外する ことで防いでいます。コードを改変する際は、この 2 つを必ずセットで残してください。なお取引先が同じ請求書を「再送」 してきた場合は別メールになるため重複します。台帳のファイル名列に受信日時が入るので、月次確認の際に見分けてください。

失敗パターン 2: 権限の承認画面で止まったまま放置される

初回実行時、Google は「このアプリは Google で確認されていません」 という警告を表示します。これは自分で書いたコードを自分のアカウントで動かす場合の通常表示です。「詳細」 を開き、自分のプロジェクト名のリンクから承認してください。ここを承認せずに閉じると、トリガーを設定しても一切動きません。設定した翌日にログ画面を開き、実行が記録されているかを必ず確認してください。

失敗パターン 3: 機密ファイルまで自動保存してしまう

ラベル条件を緩くすると、契約書や人事関連の添付まで同じフォルダに集まり、情報漏洩のリスクになります。Gmail 側のフィルタは送信元アドレスで絞るのが最も安全 です。加えて、保存先の Drive フォルダは共有せず、経理担当者のみがアクセスできる状態を維持してください。共有ドライブを使う場合は、フォルダ単位のアクセス権を導入前に設計しておくことをおすすめします。

失敗の多くは Gmail 側の条件設定に起因します。コードよりも Step 1 に時間をかけるつもりで取り組んでください。

補助金の活用 (編集部の提案)

本レシピ単体では補助金の対象になりにくい

Google Apps Script は無料であり、支払いが発生しないため 補助対象経費 (補助金がもらえる費目) が存在しません。一方で、会計ソフトや受発注システムの導入と組み合わせる形であれば、経理の業務改善計画の一部として説明材料になります。IT 導入補助金 2026 の詳細 で対象ツールの条件をご確認ください。

申請書に書ける「現状の業務課題」 として使う

個人事業主や小規模事業者が 小規模事業者持続化補助金 を申請する際、本レシピで測定した削減時間は「バックオフィス改善に自力で取り組んでいる実績」 として記載できます。採択 (申請が通ること) を狙ううえで、既に手を動かしている事実は説得力になります。

補助金を待たずに今日から始められるのが、無料で完結する本レシピの利点です。

関連レシピ

よくある質問

Q. プログラミングの経験がなくても設定できますか?

編集部の答え: 本記事のコードは書き換える箇所を 3 行に限定してあります。ID の貼り付けとラベル名の一致だけ守れば、コードの中身を理解していなくても動きます。ただし想定外の動きをした際に自力で直すには、多少の読解力が必要です。不安な場合は、まず 1 社の取引先に絞って試してください。

Q. Google Apps Script は本当に無料ですか? 後から課金されませんか?

編集部の答え: Google アカウントがあれば追加費用なしで利用できます。ただし本文の表に示した 1 日あたりの利用上限があり、超過すると実行が止まります (課金されるのではなく停止します)。上限は Google 側の裁量で変更されうる旨が公式ドキュメントに明記されているため、年に一度は公式ページの確認をおすすめします。

Q. 保存したファイルを会計ソフトに自動連携できますか?

編集部の答え: 本レシピは Drive への保存と台帳作成までを担当します。freee やマネーフォワード クラウド会計との連携は、各社が提供する取り込み機能を使うのが確実です。台帳スプレッドシートを整えておけば、そこからの取り込みや外部連携の実装は後から追加できます。

Q. 複数人で使う場合はどうすればいいですか?

編集部の答え: スクリプトは作成者のアカウント権限で動作します。経理担当が複数いる場合は、共有メールアドレス (info@ など) の Gmail にスクリプトを紐づけ、保存先を共有ドライブにする構成が管理しやすくなります。個人アカウントに紐づけると、退職時にすべて止まるため避けてください。


出典・参考情報


本記事の数値のうち、「編集部の試算」 と明示された箇所は編集部によるシミュレーションです。実際の効果は事業特性により変動します。機能・料金・利用上限は各社公式情報源を確認のうえご判断ください。

編集長 Mira / AI経営ラボ 本記事は 2026-07-23 時点の情報です。Google Apps Script の利用上限は予告なく変更される場合があります。