「あれ、あの請求書のファイル、どこに保存したっけ…?」
「とりあえずデスクトップに置いておこう(そして画面がアイコンで埋め尽くされる)」
年末が近づくと、PCの中の整理整頓、憂鬱になりますよね。
在宅ワークでCADオペレーターをしている私も、全く同じでした。
「ちゃんと整理しなきゃ」とは思っても、忙しい時に毎回ファイル名を打ち込むのは面倒くさい。
でも、適当な名前で保存すると、後で「電帳法(電子帳簿保存法)」の検索要件(日付・取引先・金額)を満たしているか不安になる…。
そんなジレンマを解消するために、「何も考えずにボタンをポチポチ押すだけで、完璧なファイル名を作ってくれるツール」を自作してみました。
コードなんて書いたことのない私でも、Windowsの「メモ帳」だけで作れたこのツール。
あまりに便利なので、コードを無料で公開します。コピペするだけで使えますので、ぜひ試してみてください。
なぜ、わざわざ「ツール」を作るのか?
「ファイル名くらい、手で打てばいいじゃない」
そう思うかもしれません。でも、ちょっと計算してみてください。
「3ヶ月」で元が取れる計算
私がこのツールを作るのにかかった時間は、コピペ作業を含めてもたったの15分です。
一方で、毎回手入力でファイル名をつけている時間は、1回30秒だとしても、月に10ファイルあれば年間で1時間以上のロスになります。
- 手入力のロス: 毎月5分(年間60分)
- ツール作成時間: 15分
つまり、このツールを作って3ヶ月使い続ければ、そこから先はずっと「時間の貯金」が増え続けるということです。
忙しい私たちフリーランスこそ、こういう「地味な自動化」に投資すべきだと思いませんか?
3分で作れる「自分専用リネームツール」
今回紹介するのは、こんなツールです。

このツールの特徴:
- インストール不要: アプリを入れる必要はありません。
- ネット不要: オフラインでも動くので、カフェでも飛行機でも使えます。
- 電帳法対応: 「日付_金額_内容_取引先」という、法律の要件を満たすファイル名が自動で作れます。
使い方はシンプル。
「いくら?どんな?」「何?」「誰?」というボタンを選んでいくだけ。
最後に「コピー」ボタンを押せば、20251207_100000_請求書_A社 といったファイル名がクリップボードに入ります。あとは保存画面で貼り付けるだけ!
【実践】魔法のレシピ(作り方)
では、実際に作ってみましょう。作業時間は3分です。
ステップ1:素材をコピーする
以下の「魔法のコード」をすべてコピーしてください。これがツールの設計図です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>シンプル・リネーム(オフライン)</title>
<style>
/* デザイン設定 */
:root {
--primary: #2563eb; --primary-bg: #eff6ff; --primary-hover: #1d4ed8;
--secondary: #16a34a; --secondary-bg: #f0fdf4;
--gray-bg: #f3f4f6; --border: #e5e7eb;
--text-main: #374151; --text-sub: #6b7280;
}
body {
font-family: "Helvetica Neue", Arial, sans-serif;
background-color: var(--gray-bg); margin: 0;
display: flex; justify-content: center; align-items: center;
min-height: 100vh; color: var(--text-main);
}
.container {
background-color: white; padding: 24px; border-radius: 12px;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
width: 100%; max-width: 450px; box-sizing: border-box;
}
h2 { font-size: 1.25rem; margin: 0 0 16px 0; padding-bottom: 8px; border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; align-items: center; }
.tag-law { font-size: 0.75rem; background-color: #fee2e2; color: #dc2626; padding: 2px 8px; border-radius: 4px; font-weight: normal; }
.form-group { margin-bottom: 20px; }
label { display: flex; justify-content: space-between; font-size: 0.875rem; font-weight: 500; margin-bottom: 6px; }
.badge-any { font-size: 0.7rem; background-color: #e5e7eb; padding: 1px 6px; border-radius: 4px; color: #4b5563; }
/* 入力欄のスタイル調整 */
input { width: 100%; padding: 10px; border: 1px solid #d1d5db; border-radius: 6px; font-size: 1rem; box-sizing: border-box; outline: none; }
input:focus { border-color: var(--primary); box-shadow: 0 0 0 2px var(--primary-bg); }
/* 日付欄も入力できるように背景色を白に */
#inputDate { background-color: white; font-family: monospace; letter-spacing: 1px; }
.preset-container { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
button { cursor: pointer; border: none; font-family: inherit; }
.btn-preset { padding: 4px 10px; font-size: 0.75rem; border-radius: 9999px; border: 1px solid transparent; background-color: white; transition: all 0.2s; }
.btn-preset:active { transform: scale(0.95); }
.theme-blue .btn-preset { background-color: var(--primary-bg); color: var(--primary); border-color: #bfdbfe; }
.theme-blue .btn-preset:hover { background-color: #dbeafe; }
.theme-green .btn-preset { background-color: var(--secondary-bg); color: var(--secondary); border-color: #bbf7d0; }
.theme-green .btn-preset:hover { background-color: #dcfce7; }
.amount-area { background-color: #f9fafb; padding: 12px; border-radius: 8px; border: 1px solid var(--border); }
.amount-input-wrapper { position: relative; }
.amount-input-wrapper input { padding-left: 10px; background-color: white; }
.amount-desc { font-size: 0.65rem; color: #9ca3af; margin-top: 4px; text-align: right; }
.result-box { background-color: #eff6ff; border: 1px solid #dbeafe; border-radius: 8px; padding: 12px; display: flex; align-items: center; justify-content: space-between; margin-top: 4px; }
.result-code { font-family: monospace; font-weight: bold; color: var(--primary); font-size: 1.1rem; word-break: break-all; }
.btn-copy { background-color: var(--primary); color: white; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 0.875rem; margin-left: 12px; flex-shrink: 0; }
.btn-copy:hover { background-color: var(--primary-hover); }
.btn-copy.copied { background-color: var(--secondary); }
.btn-reset { color: var(--text-sub); font-size: 0.75rem; background: none; margin-left: auto; display: block; margin-top: 8px; }
.btn-reset:hover { color: var(--text-main); }
.date-reset { text-align: right; margin-top: 4px; }
.date-reset button { background: none; color: var(--primary); font-size: 0.75rem; text-decoration: underline; }
</style>
</head>
<body>
<div class="container">
<h2>🏷️ シンプル・リネーム <span class="tag-law">電帳法対応</span></h2>
<!-- 日付 -->
<div class="form-group">
<label>いつ? (取引日 yyyymmdd)</label>
<input type="text" id="inputDate" placeholder="20250101">
<div class="date-reset"><button onclick="setToday()">今日の日付に戻す</button></div>
</div>
<!-- 補足 / 金額 (任意) -->
<div class="form-group amount-area">
<label>補足 / 金額 <span class="badge-any">任意</span></label>
<div class="amount-input-wrapper">
<input type="text" id="inputAmount" placeholder="例: AI自動化、11000 など">
</div>
<p class="amount-desc">※ここに入力した内容が、日付のすぐ後に来ます</p>
</div>
<!-- 内容 -->
<div class="form-group theme-green">
<label>何? (内容)</label>
<div class="preset-container" id="contentPresets"></div>
<input type="text" id="inputContent" placeholder="例: 請求書">
</div>
<!-- 相手/案件 -->
<div class="form-group theme-blue">
<label>誰の? (取引先)</label>
<div class="preset-container" id="clientPresets"></div>
<input type="text" id="inputClient" placeholder="例: A社">
</div>
<!-- 結果 -->
<div style="margin-top: 24px;">
<label style="color:var(--text-sub); font-size:0.75rem;">生成されたファイル名 (拡張子なし)</label>
<div class="result-box">
<code id="resultOutput" class="result-code"></code>
<button onclick="copyToClipboard()" class="btn-copy">コピー</button>
</div>
</div>
<button onclick="resetForm()" class="btn-reset">↺ 入力をリセット</button>
</div>
<script>
/* =================================================================
【設定エリア】 自由に書き換えてください
================================================================= */
const clients = [
"A社",
"B社",
"MKT",
"個人",
"事業"
];
const contents = [
"請求書",
"領収書",
"投稿済",
"記事下書き",
"ネタ",
"素材",
"確定申告"
];
/* =================================================================
プログラム本体
================================================================= */
window.onload = function() {
setToday();
createButtons('clientPresets', clients, setClient);
createButtons('contentPresets', contents, setContent);
updateResult();
};
function setToday() {
const today = new Date();
const yyyy = today.getFullYear().toString();
const mm = (today.getMonth() + 1).toString().padStart(2, '0');
const dd = today.getDate().toString().padStart(2, '0');
document.getElementById('inputDate').value = `${yyyy}${mm}${dd}`;
updateResult();
}
function createButtons(containerId, items, onClickFunc) {
const container = document.getElementById(containerId);
items.forEach(item => {
const btn = document.createElement('button');
btn.textContent = item;
btn.className = 'btn-preset';
btn.onclick = () => onClickFunc(item);
container.appendChild(btn);
});
}
function setClient(val) {
document.getElementById('inputClient').value = val;
updateResult();
}
function setContent(val) {
document.getElementById('inputContent').value = val;
updateResult();
}
function updateResult() {
const date = document.getElementById('inputDate').value;
const client = document.getElementById('inputClient').value;
const amount = document.getElementById('inputAmount').value;
const content = document.getElementById('inputContent').value;
let result = date;
// ★並び順を変更しました: 日付_補足_内容_取引先
if (amount) result += `_${amount}`;
if (content) result += `_${content}`;
if (client) result += `_${client}`;
document.getElementById('resultOutput').textContent = result;
}
function copyToClipboard() {
const text = document.getElementById('resultOutput').textContent.trim();
if (!text) return;
navigator.clipboard.writeText(text).then(() => {
const btn = document.querySelector('.btn-copy');
const originalText = btn.textContent;
btn.textContent = "OK!";
btn.classList.add('copied');
setTimeout(() => {
btn.textContent = originalText;
btn.classList.remove('copied');
}, 1500);
});
}
function resetForm() {
setToday();
document.getElementById('inputClient').value = "";
document.getElementById('inputAmount').value = "";
document.getElementById('inputContent').value = "";
updateResult();
}
// すべての入力欄で変更を監視
document.getElementById('inputDate').addEventListener('input', updateResult);
document.getElementById('inputClient').addEventListener('input', updateResult);
document.getElementById('inputAmount').addEventListener('input', updateResult);
document.getElementById('inputContent').addEventListener('input', updateResult);
</script>
</body>
</html>ステップ2:メモ帳を開く
Windowsのスタートメニューから「メモ帳」を開きます。
そこに、さっきコピーしたコードをそのまま貼り付けてください。
ステップ3:保存する(ここが最重要!)
ここだけ注意してください!
保存するときに、ファイル名を「シンプルリネーム.html」にします。
そして、ファイルの種類を「すべてのファイル」に変えてください。

ステップ4:完成!
保存したファイルのアイコンが、普段使っているブラウザ(ChromeやEdge)のマークに変わっていれば成功です。

ダブルクリックしてみてください。あなた専用のツールが起動します!
自分の取引先に書き換えるには?
「A社とかB社じゃなくて、自分のクライアント名にしたい!」
もちろんできます。これも「メモ帳」で編集するだけです。
- 作ったファイルを右クリックします。
- 「プログラムから開く」→「メモ帳」を選びます。
- ファイルの下の方にある【設定エリア】という場所を探してください。
// ■「誰の?」のボタンリスト
const clients = [
“株式会社〇〇”,
“△△デザイン”,
“個人”,
“経理”
];
この “” の中身を、あなたのよく使う取引先や案件名に書き換えて、上書き保存するだけ。
これで、世界に一つだけの「あなた専用ツール」の完成です。
⚠️ メモ帳で開くと文字化けしている場合
もし開いた時に文字がぐちゃぐちゃになっていても、慌てないでください。 パソコンの表示がおかしいだけです。
- 文字化けしている中身をすべて消す(Ctrl + A で全選択して Delete)。
- 新しいメモ帳にブログのコードをもう一度コピーして、貼り付け直す。
- これで綺麗な日本語に戻ります!
まとめ:事務作業を秒で終わらせよう
たったこれだけの作業で、これからのファイル整理が劇的に楽になります。
私はこのツールのおかげで、「領収書、ちゃんと整理できてるかな…」という漠然とした不安が消えました。
フォルダを開いた時に、規則正しくファイルが並んでいるのを見るのは、精神的にもすごく気持ちがいいものです。
ぜひこのツールを使って、面倒な事務作業をサクッと終わらせて、美味しいコーヒーでも飲む時間を確保してくださいね。


コメント