“今日から回る最小構成”をゴールに、年→月フォルダ、Gmailラベル、簡易スクリプト、台帳8列、監査チェックまでまとめます。
前提(超要約):電子取引は「真実性・可視性」を満たす保存が必要です。
現実運用では 重複防止・年→月の整理・台帳での可視化・処理ログ が効きます。
証憑管理 フォルダを作り、URL末尾のIDを控える(例:https://drive.google.com/drive/folders/ABCDEFG12345 の 「ABCDEFG12345」部分)【証憑管理のフォルダID】 を1.のURL末尾のIDで上書きして保存 → 実行(承認を許可)証憑管理/[今年]年/[今月]月 が自動作成、test_*.txt が1つでき、シートに1行追記されていればOK// ★ここを書き換え
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 を選んで実行
| ルート | Drive:証憑管理(IDを控える) |
|---|---|
| 年フォルダ | 2025年 のように毎年作成 |
| 月フォルダ | 01月〜12月(ゼロ埋め推奨) |
| 保存ルール | 自動保存時に 証憑管理/2025年/10月 へ振り分け |
Receipts_Inbox:取り込み対象(フィルタで自動付与)Receipts_Done:取り込み済フラグReceipts_Duplicate:重複時に付与(任意)Gmailの検索演算子(例:from:@amazon.co.jp has:attachment)で条件を作り、フィルタで Receipts_Inbox を自動付与します。
コピペ用のフィルタ例とラベル名セットは 無料テンプレ配布 にまとめています。
以下は学習用の最小サンプルです(保証なし)。指定ラベルのスレッドから添付ファイルを年→月に保存し、簡単な重複チェック(SHA-256)と台帳追記を行います。
※ まずは上の「1分テスト」で承認済みにしておくとスムーズです。
// ===== 設定 =====
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 '';
}
ROOT_FOLDER_ID の右にある 【証憑管理のフォルダID】 を差し替えて保存Receipts_Inbox を付ける(またはフィルタで自動付与)Receipts_Done ラベルは削除してOK※ まずは手動実行で動作確認→問題なければ任意でトリガーで自動化、の順が確実です。
| 列 | 項目 | 説明 |
|---|---|---|
| A | 日付 | 証憑日(メール受信日で代替可) |
| B | 取引先 | 差出人や件名から推測・手修正でOK |
| C | 金額 | 後で入力でも可(まずは保存を最優先) |
| D | 区分 | 請求書、納品書など |
| E | ファイル名 | 保存したファイル名 |
| F | ファイルID | DriveのファイルID(リンク化に便利) |
| G | 保存先パス | 例:証憑管理/2025年/10月 |
| H | 備考 | メッセージIDやエラー記録など |
台帳のGoogleスプレッドシートひな型は 無料テンプレ配布 からコピーできます。
ROOT_FOLDER_IDの誤り/権限(自分のDriveか)/初回承認未実施上の手順は“最小で動く”やり方です。
電帳法ポケットでは、年→月フォルダ自動・重複抑止(SHA-256)・台帳8列・処理ログ/内訳/エラーログまで一式を提供。Gmailラベル運用もテンプレ済みで、2分で動作確認できます。
購入前に違いを確認 → プラン比較
← トップへ戻る