個人事業主の皆さん、こんな気持ちになったことないですか?
☑️ 「領収書の紙の山…もう限界」
☑️ 「電帳法の“正解”がわからない」
☑️ 「自動化したいけど IT はちょっと…」
その“もやもや”わかります
毎年1〜3月になると領収書の山と徹夜祭り。
なんてこと、ありませんか?
特に 電子帳簿保存法(電帳法) の改正後は「何をどう保存すれば…」で頭が真っ白。
皆さん、正しく電帳法の対応ができていますか?
「ドキッ」としたそこの貴方!笑
※この記事は2026年10月時点の国税庁の資料(電子帳簿保存法一問一答(令和8年7月)、パンフレット)に合わせて更新しています。
今回、Google ドライブ × Cloud Vision API × Apps Script で
〈入れるだけ → 自動整理 → 完了メール〉が届く仕組みを作成、
無料枠の範囲で使えるツールだけで完結できる運用を作ってみました。
(無料枠を超えるとAPI利用料がかかります)
この記事で得られるもの
- 電帳法の本質が10分でわかる
- コピペで使える自動化コード(全文掲載)
- 領収書の整理・台帳づけの手間を減らす仕組み
IT が苦手でも、手順どおりに設定すれば動く。それが本記事のゴールです。
電子帳簿保存法(電帳法)概要
正式名称は「電子計算機を使用して作成する国税関係帳簿書類の保存方法等の特例に関する法律」です(長い!)。ですので、電子帳簿保存法(電帳法)と呼ばれます。
対象となる事業者
| 区分 | 対応 |
|---|---|
| 電子取引データ保存(メール・PDF・ネット経由で受け取った、または送った請求書や領収書など) | 法人・個人事業者とも必須 |
| 電子帳簿保存(会計ソフトで作った帳簿を電子のまま保存) | 希望者のみ |
| スキャナ保存(紙の領収書を読み取って保存) | 希望者のみ |
個人事業主も、電子で受け取った請求書・領収書の保存は避けて通れません。紙の領収書をスキャンして保存するかどうかは任意です
3つの保存方式
| 保存方式 | 具体例 | 主な要件 |
|---|---|---|
| ① 電子帳簿保存(希望者のみ) | 会計ソフトで作成した仕訳帳・総勘定元帳 | ・正規の簿記の原則(一般的には複式簿記)で作成した帳簿であること ・システムの説明書とディスプレイ等の備付け ・ダウンロードの求めに応じる ・(優良な電子帳簿は訂正削除履歴・検索機能なども必要) |
| ② スキャナ保存(希望者のみ) | 紙領収書をスマホやスキャナで読み取って保存 | ・おおむね7営業日以内に入力(業務処理サイクル方式なら最長2か月+おおむね7営業日以内) ・解像度200dpi 以上、24ビットカラー(一般書類はグレースケール可) ・タイムスタンプ(入力期間内に保存したことを確認できれば代替可) ・訂正削除の履歴が残る(または訂正削除ができない)システム、検索機能 ・帳簿との相互関連性(重要書類) ・ディスプレイ・プリンタ・操作説明書・システム概要書などの備付け(14インチ以上のカラーディスプレイ等。グレースケールで読み取る一般書類はカラー対応不要) |
| ③ 電子取引データ保存(必須) | PDF 請求書、EC の注文メール | ・改ざん防止の措置(タイムスタンプ、訂正削除の履歴が残るシステム、事務処理規程のいずれか) ・ディスプレイ等の備付け ・日付・金額・取引先で検索できること(範囲指定・組合せ検索、またはダウンロードの求めへの対応も必要。基準期間の売上高が5,000万円以下の方などは、ダウンロードの求めに応じられれば検索要件は不要) |
※スキャナ保存の入力期間のうち業務処理サイクル方式は、事務の処理規程を定めている場合のみ使えます。見積書・注文書などの一般書類は、入力期間の制限なしやグレースケールでの読み取りも認められますが、事務の手続を明らかにした書類の備付けが必要です。
出典:国税庁パンフレット(スキャナ保存、電子帳簿等保存、令和8年6月版)
電子取引データ保存の現在のルール
- 電子取引データは電子のまま保存:令和6年1月1日以後は、PDF を印刷した紙の保存で代えることは NG
- 宥恕措置は令和5年12月31日で終了:令和6年1月からは、要件に沿って保存できない「相当の理由」があり、ダウンロードや書面の提示の求めに応じられる場合に限り、データを保存しておけばよい猶予措置に変わっています(事前の届出は不要)
- 検索要件は簡易な方法でも可:表計算ソフトの索引簿や、規則性のあるファイル名で対応できます
出典:国税庁「電子取引データの保存方法について」(令和6年11月)、一問一答
優良な電子帳簿などの優遇措置(任意)
必須ではありませんが、会計ソフトで「優良な電子帳簿」の要件を満たして保存し、あらかじめ届出書を出しておくと、対象の帳簿に関連する過少申告について、過少申告加算税の割合が原則10%から5%に軽減されます(その課税期間の初日から優良な電子帳簿として備付け・保存している必要があります)。また、青色申告特別控除75万円は令和9年分以後の所得税が対象で、「優良な電子帳簿」または「デジタルシームレス保存」の要件を満たしたうえで電子申告し、正規の簿記の原則による記帳と貸借対照表・損益計算書の期限内の提出が前提です。優遇措置を受けるには、届出書の提出(青色申告特別控除75万円の場合は所得税の青色申告承認申請手続も)が必要になります(既に優良な電子帳簿で65万円控除を受けている場合は、75万円控除のために改めて届出書を出す必要はありません)。使っている会計ソフトが対応しているかは、国税庁のパンフレット(令和8年6月)が案内している JIIMA の認証ソフト一覧などで確認してください。
遵守しない場合のリスク
- 青色申告の承認の取消しの対象となり得る
- スキャナ保存の要件を満たさないと、紙の原本を保存していない限り、消費税の 仕入税額控除の否認 などの可能性
ただし、青色申告の承認の取消しは、違反の程度や記帳状況などを総合的に見て判断され、要件違反があれば直ちに必ず取り消されるものではない、と国税庁は説明しています。とはいえ、リスクを抱えたままにする理由もありません。
個人事業主がやるべきこと
- 受領形態を判定:紙?電子?でフローを分ける
- ファイル名ルールを統一:
YYYY-MM-DD_取引先_内容_金額.pdfなど。日付・金額・取引先を含め、順序を統一します - 改ざん防止措置 を決める:個人なら、国税庁のひな形をもとに事務処理規程を作り、運用して備え付ける方法が手軽です(タイムスタンプや対応ソフトでも可)
- 検索要件 を満たす整理方法を用意:表計算ソフトの台帳+ファイル名、または会計ソフト
会計ソフトを使って領収書を管理していれば対応しやすくなります(ソフトの設定や運用、説明書の備付けなどの要件は別途確認が必要です)が、個人事業主だと、自分で管理をしていたり、年に1回青色申告の時にだけ会計ソフトを触ります、という人もいらっしゃるかと思います。そんな方にこそ、実践してほしい方法を今からお伝えします。
領収書が「紙か電子か」で判断。
- 電子なら 電子のまま 改ざん防止の措置+検索できる状態で保存。
- 早いうちに 自動化フロー を作れば、確定申告前に慌てずに済む。
電帳法を「味方」にする3つの視点
目的を“紙レス化”と勘違いしない
そもそも電帳法は、紙をなくすこと自体が目的ではありません。保存するときに押さえる柱は以下の2つです。
- 改ざん防止(電子取引データなら、タイムスタンプ、訂正削除の履歴が残るシステム、事務処理規程などの措置。スキャナ保存は別の要件があります)
- 検索性(日付・金額・取引先で即ヒット)
“決済方法”ではなく“受領形態”で分岐
| 受領形態 | 保存義務 |
|---|---|
| 紙領収書 | 紙保存 OK |
| PDFなど電子での領収書 | 電子保存義務 |
青色申告は“ご褒美”ではなく“担保”
電子取引データを要件どおり保存していないと、青色申告の承認の取消しの対象となり得ます。承認が取り消されれば、青色申告の特典は使えなくなります。
個人事業主がハマる 5 大トラップ
以下によくある「やらかし」をトラップとしてまとめました。
| トラップ | 違反内容 |
|---|---|
| PDF を印刷しバインダー保存 | 電子取引保存違反 |
| ファイル名ルールも索引簿もない | 検索できる状態にしていない(検索要件に注意) |
| スキャナ保存で、入力期間(おおむね7営業日など)を過ぎてからスキャン | スキャナ保存の入力期間の要件に注意 |
| SaaS 領収書を保存し忘れ(サービス上でも保存要件を満たせていない) | 保存義務を満たさないおそれ |
| タイムスタンプって?何それ?美味しいの? | 電子取引は、タイムスタンプのほか事務処理規程でも対応できます |
知らない間に違反してたってことにならないように手を打ちましょう!
自動化戦略
採用ツールは Google の 3 兄弟
有料ツールでも良いなら会計ソフトを使うのが良いです。
でも基本、無料で済ませたいですよね。
ということで以下のツールを使います。
| 役割 | ツール |
|---|---|
| 保管・版管理 | Google Drive |
| OCR(領収書の読み取り) | Cloud Vision API |
| 自動処理 | Google Apps Script |
処理の流れ
できるだけ簡素化したいということで、以下の流れを考えました。
- Google Driveの所定のフォルダに領収書を格納
- Google Apps Script(GAS)が定期巡回し、Google Spredsheetに自動でログ付けした上で領収書のファイルをルールに基づいた適正な形式でリネーム
領収書の読み取り自体はシンプルに以下の流れで処理を行います。
- フォルダ内の 画像(jpg/png)を取得
- 画像 OCR で文字列を読み取り
- 日付/金額/会社名 を簡易的に抽出(日付は西暦表記が前提です)
Google Apps Script 概要
Google が提供する“クラウド上の JavaScript 実行環境”です。
Google Apps Scriptの頭文字をとってGASと呼びます。
- ブラウザだけで開発・実行でき、PC に何もインストール不要
- Gmail / Google スプレッドシート / Drive などを 簡単に自動操作 できる
GAS で出来ること一例
GASを使えばこんなことが簡単にできます。
| 用途 | 具体例 |
|---|---|
| 自動メール送信 | スプレッドシートの期限リストを毎朝メール |
| 他サービス連携 | Slack に Drive 更新通知を送る |
スクリプトの作り方
- Google ドライブ を開く
+新規→その他→Google Apps Scriptをクリック無題のプロジェクトが表示されれば OK
コード.gsが最初のスクリプトファイルになります。function myFunction(){ }がデフォルト関数です。
この辺りの細かい話は今回はわからなくても大丈夫です。
Google Cloud Vision API キー取得・設定マニュアル
GASを利用する準備ができたらCloud Vision APIを取得しましょう。
事前に用意するもの
| 項目 | メモ |
|---|---|
| Google アカウント | Gmail で OK |
| お支払い方法の登録 | Google Cloud の利用開始時に登録します(無料枠の1,000ユニット/月を超えた分だけ課金されます。大量に処理しない限り無課金でいけるはずです) |
Google Cloud Console にログイン
- ブラウザで https://console.cloud.google.com/ へアクセス
- 右上が自分のアカウント名になっているか確認
Cloud Vision API 専用プロジェクトを作成
- 左上 「プロジェクトを選択」 ▶ 「新しいプロジェクト」
- プロジェクト名:
vision-receipt-ocr(自由に名前をつけて下さい) - 場所はそのまま “組織なし” で OKです
- 「作成」 ▶ 数秒で完了
費用を見分けやすくするために OCR 専用プロジェクト を分けておくと便利です!作成したプロジェクトが請求先アカウントとリンクされ、課金が有効になっているかも確認してください。
API を有効化
- 新しく作ったプロジェクトを選択した状態で
左メニュー ▸「API とサービス」▸「ライブラリ」 - 検索窓に Cloud
Vision APIと入力 - 「Cloud Vision API」 をクリック ▶ 「有効にする」
Cloud Vision APIのところに価格表があるので参考にして下さい(ドキュメント テキスト検出の料金は下記ページで確認できます)。
API キーを発行
- 左メニュー ▸「API とサービス」▸「認証情報」
- 上部の+認証情報を作成 ▶ 「API キー」
- ポップアップに キー文字列 が表示されるのでコピーして残しておく
セキュリティ制限(強く推奨)
万が一のことを考えて、APIに制限をかけることをお勧めします。
左メニュー ▸「API とサービス」▸「認証情報」で出てくるAPIキー部分で新たに作ったAPIキーの名前部分をクリックして以下の設定をします。
| ステップ | 操作 | 理由 |
|---|---|---|
| API の制限 | 「キーを制限」を選び、Cloud Vision API だけにしましょう | 他 API への悪用防止 |
| キーの管理 | キー文字列を人に見せない・記事や SNS に貼らない | 第三者による不正利用の防止 |
無料枠と料金の目安
以下のサイトに料金の詳細が記載されています。

| 無料枠 | 超過料金 (参考) |
|---|---|
| 最初の1,000ユニット / 月 | 1,001〜5,000,000ユニットは $1.50 / 1,000 ユニット |
月の処理枚数がそれほど多くなければ、無料枠 に収まるケースが多いと考えられます。心配であれば、「課金アラート ($1 で通知)」 を設定しておくと安心です(アラートは通知で、自動停止ではありません)。
Google Spreadsheetの準備
領収書のログ付け用のGoogle spreadsheetを準備して下さい。
ファイルには「台帳」と「ログ」というシートを事前に作成しておいて下さい。
台帳
台帳には実際の領収書の情報を自動で書き込みしていきます。
1行目に以下の項目名を記載しておいて下さい。
| 取引日 | 取引先名 | 内容 | 金額(円) | ファイル名 |
ログ
ログのシートには実行記録を付けていきます。
エラー情報もこちらで確認可能です。
1行目には以下の項目名を記載しておいて下さい。
| 記録日時 | ファイル名 | 結果 |
コピペで使える! 完全版スクリプト
最終準備
フォルダのIDとspreadsheetのIDを確認します。
フォルダIDは格納するドライブのURLの以下の部分です。
spreadsheetのIDはシートのURLの以下の部分です。
実行!
今までの準備ができたら、GASに以下のスクリプトを貼り付けて実行して下さい。
- フォルダ ID/シート ID/API キー/メール先をご自身のものに変更して下さい
processReceiptsSmartDebugを実行します- 初回は手動で「実行」を押して実行して下さい。承認が必要となります
- 次回以降はGAS側で設定するタイマーで作動します
// ===== 設定値 =====
const FOLDER_ID = 'xxxxxx'; // ←領収書フォルダIDに変更して下さい
const SHEET_ID = 'xxxxxx'; // ←スプレッドシートIDに変更して下さい
const API_KEY = 'xxxxx'; // ←Cloud Vision APIキーに変更して下さい
const ALLOWED_EXTENSIONS = ['jpg', 'jpeg', 'png'];
const REPORT_EMAIL = 'your@email.com'; // ←送信先メールアドレスに変更してください
// ===== メイン処理 =====
function processReceiptsSmartDebug() {
const folder = DriveApp.getFolderById(FOLDER_ID);
const ledgerSheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('台帳');
const logSheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('ログ');
const existingFilenames = ledgerSheet.getDataRange().getValues().map(row => row[4]);
const files = folder.getFiles();
let fileProcessed = false;
let updates = [];
while (files.hasNext()) {
const file = files.next();
const name = file.getName();
const ext = name.split('.').pop().toLowerCase();
Logger.log(`チェック中:${name}`);
if (!ALLOWED_EXTENSIONS.includes(ext)) {
logSheet.appendRow([new Date(), name, 'スキップ:非対応拡張子']);
continue;
}
if (name.startsWith('[済]')) {
logSheet.appendRow([new Date(), name, 'スキップ:処理済み']);
continue;
}
const text = performOCR(file);
Logger.log(`OCR抽出結果(${name}): ${text?.substring(0, 100) || 'なし'}`);
if (!text || text.length < 10) {
logSheet.appendRow([new Date(), name, 'エラー:テキスト抽出できず']);
continue;
}
const extracted = extractInfoFromText(text);
Logger.log(`抽出結果(${name}): ${JSON.stringify(extracted)}`);
if (!extracted) {
logSheet.appendRow([new Date(), name, 'エラー:情報抽出できず']);
continue;
}
const { date, vendor, detail, amount } = extracted;
const newFileName = `[済]_${date}_${vendor}_${detail}_${amount}.${ext}`;
if (existingFilenames.includes(newFileName)) {
logSheet.appendRow([new Date(), name, 'スキップ:重複ファイル名']);
continue;
}
file.setName(newFileName);
const record = [date, vendor, detail, amount, newFileName];
ledgerSheet.appendRow(record);
logSheet.appendRow([new Date(), newFileName, '保存成功']);
updates.push(record);
fileProcessed = true;
}
if (!fileProcessed) {
logSheet.appendRow([new Date(), 'ファイルなし', '新規ファイルなし・処理対象なし']);
}
sendUpdateReport(updates);
}
// ===== テキスト抽出:OCR =====
function performOCR(file) {
try {
const blob = file.getBlob();
const base64 = Utilities.base64Encode(blob.getBytes());
const visionUrl = `https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}`;
const payload = {
requests: [{
image: { content: base64 },
features: [{ type: 'DOCUMENT_TEXT_DETECTION' }]
}]
};
const options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload)
};
const response = UrlFetchApp.fetch(visionUrl, options);
const json = JSON.parse(response.getContentText());
return json.responses[0].fullTextAnnotation?.text || '';
} catch (e) {
Logger.log('OCR失敗:' + e.message);
return '';
}
}
// ===== テキストから情報抽出(強化済み)=====
function extractInfoFromText(text) {
const dateMatch = text.match(/(令和\d+年\s*)?\d{4}年\s*\d{1,2}月\s*\d{1,2}日|\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/);
const amountMatch = text.match(/(?:¥|¥)?\s?(\d{1,3}(?:,\d{3})+|\d+)\s?(?:円)?/);
const vendorMatch = text.match(/(株式会社\s?\S+|\S+会社)/);
const detail = "領収書";
if (!dateMatch || !amountMatch || !vendorMatch) return null;
const date = formatDateForFile(dateMatch[0]);
const vendor = vendorMatch[0].replace(/\s/g, '').substring(0, 15);
const amount = amountMatch[1].replace(/[^\d]/g, '');
return { date, vendor, detail, amount };
}
function formatDateForFile(rawDate) {
const cleaned = rawDate.replace(/[年月日.\-]/g, '/').replace(/\s/g, '');
const d = new Date(cleaned);
const yyyy = d.getFullYear();
const mm = ('0' + (d.getMonth() + 1)).slice(-2);
const dd = ('0' + d.getDate()).slice(-2);
return `${yyyy}-${mm}-${dd}`;
}
// ===== メール送信 =====
function sendUpdateReport(records) {
if (records.length === 0) return;
const body = records.map(r =>
`取引日: ${r[0]}\n取引先: ${r[1]}\n内容: ${r[2]}\n金額: ${r[3]}円\nファイル名: ${r[4]}\n`
).join('\n---\n');
MailApp.sendEmail({
to: REPORT_EMAIL,
subject: "【領収書OCR】処理完了レポート",
body: `以下のファイルが処理され、台帳に追加されました:\n\n${body}`
});
}
これで準備は整いました。
あとは定期的に実行できるように設定しましょう。
GAS スクリプトを定期実行(トリガー)する方法
GAS のトリガーとは?
指定した条件(時間・イベント)で自動的に関数を呼び出す仕組みです。
サーバーや PC を立ち上げておく必要はなく、Google のクラウドが定期的に回してくれます(1回の実行時間などに上限はあります)。
代表的なトリガー種類
| 種類 | 例 | 使いどころ |
|---|---|---|
| 時間主導型 | 毎日 21:00、5 分おき | 領収書フォルダの巡回処理 |
| フォーム送信 | Google フォーム回答時 | アンケート自動メール |
| スプレッドシート編集 | セル編集時 | 在庫警告メール |
今回は 時間主導型 を使います。
時間トリガー設定手順
例えば、毎晩21時に実行したいとすると以下のように設定します。
- Apps Script エディタを開き、左側ツールバーの時計アイコン(「トリガー」) をクリック
- +トリガーを追加 を押す
- ポップアップで下記を選択 項目 設定値 実行する関数
processReceiptsSmartDebug(メイン関数名) デプロイ ソース 「Head」(最新バージョン)
イベントのソース 時間主導型
時間ベースのタイプ 毎日実行するタイプ
時刻の指定 21時〜22時 (例) - 保存
→ Google アカウント権限許可
→ 完了
これだけ!
以後毎晩21時台に、決められたプログラムを実行します(実行時刻は指定の時間帯の中で多少ずれます)。
今回のスクリプトであれば、
1) 所定のフォルダを巡回 → 2) 対象のファイルをOCR → 3) 台帳更新/ログ付け → 4) メール通知
が自動で実行されます。
保存フォルダに領収書のjpgファイルを適当に置いておくだけで勝手に処理してくれます!
*PDF で受け取った領収書は電子取引データなので、このスクリプトでは読み取らず、元のファイルのまま保存し、ファイル名を日付・金額・取引先がわかる形に整えてください。
*読み取りは完璧にはできない可能性があります。金額は本文中で最初に見つかった数字(日付などを誤って拾うこともあります)を拾い、取引先は「株式会社」などの会社表記を拾い、先頭15文字で切り詰めるだけの簡易な仕組みです。処理完了メールを見て、原本の画像と照らして間違いがないか確認します。直すときは、台帳の内容とファイル名の両方を同じ内容にそろえましょう。
*読み取りに失敗した画像はフォルダに残り、次回の実行でもう一度OCRにかかります(その分も課金対象です)。失敗が続くファイルは別のフォルダへ移してください。
*この仕組みは、領収書を「日付・金額・取引先で探せる状態」に整えるためのものです。紙の領収書をスキャナ保存の要件(タイムスタンプなど)まで満たして電子化したい場合は、国税庁の要件を満たす対応ソフトを使うのが一般的です。紙の原本を捨てられるのは、スキャナ保存の要件をすべて満たした場合だけで、このスクリプトだけでは満たせません。要件に自信が持てないあいだは、紙の原本も保存しておいてください。
*個別の税務判断は、税理士さんや所轄の税務署にご相談ください。
自分の事業に合う進め方を相談したいとき
「どこまで対応すれば足りるのか整理したい」「スクリプトの設定でつまずいた」「領収書以外の業務も自動化したい」という方は、ENTHRIVER のサービスをご覧ください。AI や自動化ツールの活用はAI・自動化の支援、経営まわり全般はサービス一覧から相談できます。
以上、電帳法と領収書整理の自動化の進め方でした!


