Gmailの請求書/領収書を自動でGoogle Driveへ保存する方法(電帳法の考え方つき)

“今日から回る最小構成”をゴールに、年→月フォルダ、Gmailラベル、簡易スクリプト、台帳8列、監査チェックまでまとめます。

前提(超要約):電子取引は「真実性・可視性」を満たす保存が必要です。
現実運用では 重複防止年→月の整理台帳での可視化処理ログ が効きます。

2分で動作確認(Trial)

テンプレ集は 無料テンプレ配布 / 機能とプランの違いは プラン比較

まずは1分テスト:本当に“何かが起きる”のを体験

  1. Driveで 証憑管理 フォルダを作り、URL末尾のIDを控える(例:https://drive.google.com/drive/folders/ABCDEFG12345 の 「ABCDEFG12345」部分)
  2. スプレッドシートを開き、拡張機能 → Apps Script
  3. エディタに最初から入っている myFunction() などの行はすべて消去
  4. 下の「1分テスト用」コードを貼る
  5. 【証憑管理のフォルダID】 を1.のURL末尾のIDで上書きして保存実行(承認を許可)
  6. Driveに 証憑管理/[今年]年/[今月]月 が自動作成、test_*.txt が1つでき、シートに1行追記されていればOK
1分テスト用(単体で動く/フォルダ作成+ファイル作成+台帳1行)
// ★ここを書き換え
const ROOT_FOLDER_ID = '【証憑管理のフォルダID】';
const LEDGER_SHEET   = '台帳';

function quickTestStandalone(){
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName(LEDGER_SHEET) || ss.insertSheet(LEDGER_SHEET);

  const tz = Session.getScriptTimeZone();
  const now = new Date();
  const y = Utilities.formatDate(now, tz, 'yyyy');
  const m = Utilities.formatDate(now, tz, 'MM');

  const root = DriveApp.getFolderById(ROOT_FOLDER_ID);
  function getOrCreate(parent, name){
    const it = parent.getFoldersByName(name);
    return it.hasNext() ? it.next() : parent.createFolder(name);
  }
  const yFolder = getOrCreate(root, y + '年');
  const mFolder = getOrCreate(yFolder, m + '月');

  const file = mFolder.createFile(Utilities.newBlob('test','text/plain','test.txt'))
                      .setName('test_' + Date.now() + '.txt');

  sh.appendRow([
    Utilities.formatDate(now, tz, 'yyyy-MM-dd'),
    'テスト','','',file.getName(),file.getId(),
    '証憑管理/' + y + '年/' + m + '月','quickTest'
  ]);
}
// 実行メニューで quickTestStandalone を選んで実行
実行するとフォルダとテストファイルを作成し、シートに1行追記します。まずは“動く体験”を。

1. フォルダ設計:年→月で迷わない

ルートDrive:証憑管理(IDを控える)
年フォルダ2025年 のように毎年作成
月フォルダ01月12月(ゼロ埋め推奨)
保存ルール自動保存時に 証憑管理/2025年/10月 へ振り分け

2. Gmailラベル設計:収集の入口を作る

Gmailの検索演算子(例:from:@amazon.co.jp has:attachment)で条件を作り、フィルタで Receipts_Inbox を自動付与します。

コピペ用のフィルタ例とラベル名セットは 無料テンプレ配布 にまとめています。

3. 簡易Apps Script(学習用サンプル:Gmail→Drive)

以下は学習用の最小サンプルです(保証なし)。指定ラベルのスレッドから添付ファイルを年→月に保存し、簡単な重複チェック(SHA-256)と台帳追記を行います。
※ まずは上の「1分テスト」で承認済みにしておくとスムーズです。

学習用サンプル(Google Apps Script)
// ===== 設定 =====
const ROOT_FOLDER_ID = '【証憑管理のフォルダID】'; // Driveの「証憑管理」フォルダ
const LABEL_INBOX    = 'Receipts_Inbox';
const LABEL_DONE     = 'Receipts_Done';
const LABEL_DUP      = 'Receipts_Duplicate'; // 任意
const LEDGER_SHEET   = '台帳';               // A:H を使用

// ===== メイン =====
function processReceipts() {
  const label = GmailApp.getUserLabelByName(LABEL_INBOX);
  if (!label) return;

  const threads = label.getThreads(0, 30); // 1回30スレッドまで
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName(LEDGER_SHEET) || ss.insertSheet(LEDGER_SHEET);

  threads.forEach(t => {
    const msgs = t.getMessages();
    msgs.forEach(m => saveMessage(m, sh));
    t.removeLabel(label);
    t.addLabel(getOrCreateLabel(LABEL_DONE));
  });
}

function saveMessage(msg, sh) {
  const date = msg.getDate();
  const y = Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy');
  const m = Utilities.formatDate(date, Session.getScriptTimeZone(), 'MM');
  const monthFolder = ensureMonthFolder(y, m);

  const attachments = msg.getAttachments({includeInlineImages:false});
  attachments.forEach(att => {
    const hash = toHex(Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, att.getBytes()));
    if (existsByHash_(hash, monthFolder)) {
      msg.addLabel(getOrCreateLabel(LABEL_DUP));
      return;
    }
    const file = monthFolder.createFile(att.copyBlob()).setName(att.getName());
    file.setDescription('hash=' + hash);

    // --- 台帳8列(例) ---
    // A:日付 B:取引先 C:金額 D:書類種別 E:ファイル名 F:ファイルID G:保存先パス H:備考
    const row = [
      Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy-MM-dd'),
      guessVendor_(msg), '', '', file.getName(), file.getId(),
      '証憑管理/' + y + '年/' + m + '月', 'msgId=' + msg.getId()
    ];
    sh.appendRow(row);
  });
}

// ====== 補助 ======
function ensureMonthFolder(y, m) {
  const root = DriveApp.getFolderById(ROOT_FOLDER_ID);
  const yName = y + '年', mName = m + '月';
  const yFolder = getOrCreateFolder_(root, yName);
  return getOrCreateFolder_(yFolder, mName);
}

function getOrCreateFolder_(parent, name) {
  const it = parent.getFoldersByName(name);
  return it.hasNext() ? it.next() : parent.createFolder(name);
}

function getOrCreateLabel(name){
  return GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
}

function existsByHash_(hash, folder) {
  const files = folder.getFiles();
  while (files.hasNext()) {
    const f = files.next();
    const desc = f.getDescription() || '';
    if (desc.indexOf('hash=' + hash) !== -1) return true;
  }
  return false;
}

function toHex(bytes){
  return bytes.map(function(b){ b = (b & 0xff) + 0x100; return b.toString(16).slice(-2); }).join('');
}

// ざっくり取引先を推測(必要なら辞書化)
function guessVendor_(msg){
  const from = msg.getFrom() || '';
  const m = from.match(/<(.*?)>/);
  const addr = (m ? m[1] : from).toLowerCase();
  if (addr.indexOf('amazon') >= 0) return 'Amazon';
  if (addr.indexOf('rakuten') >= 0) return 'Rakuten';
  return '';
}
学習用・無保証。商用利用や再配布はご遠慮ください(本ページへの引用リンクは可)。製品版はエラーハンドリング/辞書優先度/重複判定の範囲/ログ構造などが異なります。
使い方(Gmail連携版)
  1. 上の学習用コードを貼り、ROOT_FOLDER_ID の右にある 【証憑管理のフォルダID】 を差し替えて保存
  2. 添付ありのテスト用メールをGmail宛に送り、ラベル Receipts_Inbox を付ける(またはフィルタで自動付与)
  3. ラベルの付け方はGmail右上の歯車 → すべての設定 → フィルタとブロック中のアドレス → フィルタを作成 → 例:添付ファイルありにチェック や From:@amazon.co.jp → フィルタを作成 → ラベルを付ける:Receipts_Inbox → フィルタを作成
  4. スクリプト実行で 関数: processReceipts を選び、承認→実行
  5. 証憑管理/YYYY年/MM月フォルダが作成され、その中にメールの添付ファイルが保存されており、台帳に1行追記の3点が揃えば成功
  6. (任意)トリガーで時間主導(10〜15分)を設定すると自動化
  7. Gmailのスレッドに付いたテスト用メールの Receipts_Done ラベルは削除してOK

※ まずは手動実行で動作確認→問題なければ任意でトリガーで自動化、の順が確実です。

4. 台帳8列の最低限

項目説明
A日付証憑日(メール受信日で代替可)
B取引先差出人や件名から推測・手修正でOK
C金額後で入力でも可(まずは保存を最優先)
D区分請求書、納品書など
Eファイル名保存したファイル名
FファイルIDDriveのファイルID(リンク化に便利)
G保存先パス例:証憑管理/2025年/10月
H備考メッセージIDやエラー記録など

台帳のGoogleスプレッドシートひな型は 無料テンプレ配布 からコピーできます。

5. 監査で見られるポイント

6. つまづき対処

7. もっとラクにするなら

上の手順は“最小で動く”やり方です。
電帳法ポケットでは、年→月フォルダ自動重複抑止(SHA-256)台帳8列処理ログ/内訳/エラーログまで一式を提供。Gmailラベル運用もテンプレ済みで、2分で動作確認できます。

2分で動作確認(Trial)

購入前に違いを確認 → プラン比較

← トップへ戻る