【プログラミングで学ぶ節税術】ふるさと納税の控除上限額計算ツールを自作して年間10万円得する思考法を身につけよう!
アフィリエイト開示

こんにちは!子供の頃からコードを書き、今ではプログラミングの楽しさを伝えることに情熱を燃やしている技術教育者です。業務システムからゲーム開発まで、様々な現場を経験してきましたが、一番大切にしているのは「技術を使って、身の回りの問題を解決する面白さ」を伝えることです。
今回は、多くの人が関心を持つ「ふるさと納税」をテーマに、プログラミングの世界に足を踏み入れてみましょう。ただ節税するだけでなく、その仕組みを計算するツールを自分で作ることで、プログラミングの基本的な考え方から、チーム開発でも通用する実践的なスキルまで、一気に学ぶことができます。この記事を読み終える頃には、あなたも「問題をコードで解決する」楽しさを実感し、自分だけのツールを作り上げる力を手に入れているはずです。
はじめに
この記事では、ふるさと納税の「控除上限額」を計算するシンプルなWebアプリケーションを、HTMLとJavaScriptを使ってゼロから開発します。このプロセスを通じて、あなたは以下のことを学び、成長できます。
- プログラミングの三本柱:変数、条件分岐、関数といった、あらゆるプログラムの基礎となる概念を、具体的な計算ツールを作りながら体感的に理解できます。
- 問題解決のプロセス:「控除額を計算したい」という目的を、どのようにプログラムに落とし込むか、その思考プロセスを学べます。
- 動くものを作る達成感:自分の書いたコードがブラウザ上で実際に動作し、便利なツールとして機能する。この「小さな成功体験」は、学習を続ける上で最高のモチベーションになります。
最終的には、ただ動くだけでなく、他の人が見ても分かりやすく、後から機能追加もしやすい「保守性の高いコード」を書くための第一歩を踏み出します。さあ、一緒にものづくりの冒険を始めましょう!
前提知識の確認
プログラミングが初めての方でも安心して進められるように、まずは必要な知識と、今はまだ知らなくても良いことを整理しておきましょう。
必要な基礎知識
- 基本的なPC操作:ファイルの作成や保存、フォルダの管理、テキストエディタ(メモ帳など)での文字入力ができれば十分です。
- Webブラウザの操作:普段インターネットを見ているように、Google ChromeやFirefoxなどのブラウザが使えれば問題ありません。
プログラミングの経験は一切問いません。この記事があなたの「はじめの一歩」になることを目指しています。
事前に理解しておきたい概念
- ふるさと納税の基本:自治体に寄付をすると、自己負担額2,000円を除いた全額が、翌年の所得税や住民税から控除(差し引かれる)される制度です。ただし、控除される金額には「上限額」があり、これは年収や家族構成によって変わります。今回作るのは、この「上限額」の目安を計算するツールです。
- 変数とは:数値や文字などのデータを入れておくための「箱」のようなものです。例えば、
userIncome
という名前の箱に年収のデータを入れ、計算で使います。
「分からなくても大丈夫」な部分
- 正確な税金の計算ロジック:実際の税金計算は非常に複雑です。今回は、その仕組みを理解しやすくするために、少し簡略化した計算モデルを使います。税務の専門家になるのが目的ではありません。
- サーバーやデータベースの知識:今回は、ユーザーのPC(ブラウザ)上だけで完結するプログラムを作るので、サーバーサイドの難しい知識は不要です。
環境構築:最初の一歩
本格的な開発を始める前に、コードを書くための道具を揃えましょう。ここでは、多くのプロが愛用しているツールを、初心者向けに分かりやすく解説します。
開発環境の準備(初心者向け解説)
プログラミングをするには、コードを書くための「テキストエディタ」と、それを実行する環境(今回は「Webブラウザ」)が必要です。料理で言えば、レシピを書くノートと、調理をするキッチンですね。
今回は、世界中の開発者に使われている高機能なテキストエディタ「Visual Studio Code(VS Code)」を使います。無料で使え、便利な機能がたくさん詰まっているので、最初のツールとして最適です。
必要なツールとインストール方法
-
Visual Studio Code (VS Code)のインストール 公式サイトにアクセスし、お使いのPC(Windows, Mac)に合ったインストーラーをダウンロードして、画面の指示に従ってインストールしてください。特別な設定は不要です。
-
作業用フォルダの作成 デスクトップなど、分かりやすい場所に「furusato-tax-app」といった名前のフォルダを新規作成します。これから作るファイルは、すべてこのフォルダの中に保存します。
-
VS Codeでフォルダを開く インストールしたVS Codeを起動し、「ファイル」メニューから「フォルダを開く」を選択し、先ほど作成した「furusato-tax-app」フォルダを選びます。これで準備完了です。

環境構築でつまずきやすいポイント
環境構築は、最初にして最大の壁になりがちです。焦らずいきましょう。
- 「何から手をつけていいか分からない」:まずはVS Codeをインストールし、作業用フォルダを作る、ただそれだけでOKです。小さな一歩が大切です。
- 英語の画面に戸惑う:VS Codeは、拡張機能で日本語化できます。左側の四角いアイコン(拡張機能)をクリックし、「Japanese Language Pack for Visual Studio Code」と検索してインストールすると、再起動後に日本語表示になります。
基本概念の理解
コードを書き始める前に、プログラムがどのような考え方で動いているのか、その心臓部を覗いてみましょう。
核となる考え方
私たちの作る計算ツールは、非常にシンプルな「入力 → 処理 → 出力」という流れで動きます。これは、あらゆるシステムの基本モデルです。
- 入力 (Input):ユーザーが年収や家族構成を画面から入力します。
- 処理 (Process):プログラムが、入力されたデータを使って、決められた計算式に基づき控除上限額を計算します。
- 出力 (Output):計算結果を画面に分かりやすく表示します。
この流れを意識することが、プログラム設計の第一歩です。
身近な例での説明
プログラミングの概念は、日常の行動に例えると分かりやすいです。
- 変数:料理で使う「ボウル」のようなものです。「年収」というラベルを貼ったボウルに、ユーザーが入力した数値を入れるイメージです。後で計算するときに、そのボウルから数値を取り出して使います。
- 関数:一連の作業をまとめた「レシピ」です。「上限額を計算する」というレシピを作っておけば、ボタンが押されるたびに、そのレシピ通りに調理(計算)してくれます。何度も同じ手順を書く必要がなく、レシピ名を見るだけで何をしているか分かります。
「なぜそうなるのか」の理解
なぜ「変数」や「関数」を使うのでしょうか?それは、コードを読みやすく、間違いにくく、再利用しやすくするためです。例えば、年収を直接計算式に書き込むのではなく userIncome
という変数に入れることで、後からコードを見返したときに「ああ、ここは年収を使っているんだな」と一目で分かります。これが、自分だけでなくチームの仲間にとっても分かりやすい、良いコードに繋がるのです。
実践編:手を動かして学ぶ

いよいよ、実際にコードを書いてツールを作っていきます。VS Codeでファイルを作成しながら、一歩ずつ進めましょう。
ステップ1: 基本的な実装
まずは、画面の骨格(HTML)と、計算の心臓部(JavaScript)のファイルを用意します。
1. index.html
の作成
VS Codeの左側のエクスプローラーで、「furusato-tax-app」フォルダ内に新しいファイルを作成し、index.html
という名前を付けます。そして、以下のコードを貼り付けてください。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ふるさと納税 控除上限額シミュレーター</title>
</head>
<body>
<h1>ふるさと納税 控除上限額シミュレーター</h1>
<div>
<label for="income">給与収入(年収):</label>
<input type="number" id="income" placeholder="例: 5000000"> 円
</div>
<div>
<label for="family-structure">家族構成:</label>
<select id="family-structure">
<option value="single">独身または共働き</option>
<option value="married">配偶者(専業主婦/主夫)</option>
<option value="married-child">共働き + 子1人(高校生)</option>
</select>
</div>
<button id="calculate-button">計算する</button>
<h2>あなたの控除上限額の目安は...</h2>
<p><span id="result-amount">0</span> 円</p>
<script src="script.js"></script>
</body>
</html>
解説:
これはWebページの設計図です。input
で年収を入力する欄を、select
で家族構成を選ぶ欄を、button
で計算ボタンを、そしてspan
(id=result-amount
)で結果を表示する場所をそれぞれ用意しています。最後の<script src="script.js"></script>
で、これから作るJavaScriptファイルを読み込んでいます。
2. script.js
の作成
同様に、script.js
という名前のファイルを作成し、以下のコードを貼り付けます。
// まずは、HTMLの要素をJavaScriptで操作できるように取得します。
const incomeInput = document.getElementById('income');
const familySelect = document.getElementById('family-structure');
const calculateButton = document.getElementById('calculate-button');
const resultAmount = document.getElementById('result-amount');
// 「計算する」ボタンがクリックされたときの処理を定義します。
calculateButton.addEventListener('click', () => {
// 現時点では、コンソールにメッセージを表示するだけです。
console.log('ボタンがクリックされました!');
});
解説:
document.getElementById(...)
は、HTMLファイルに書かれた特定のIDを持つ要素を、JavaScriptの世界に持ってくるための魔法の呪文です。addEventListener
は、「ボタンがクリックされたら、この処理を実行してね」という命令を登録しています。
index.html
ファイルを右クリックして「Open with Live Server」(VS Codeの拡張機能)で開くか、直接ブラウザで開いてみてください。そして、ブラウザの「開発者ツール」(F12キーや右クリック→検証で開けます)の「Console」タブを見ながらボタンを押すと、「ボタンがクリックされました!」と表示されるはずです。これが、最初の成功体験です!
ステップ2: 機能の拡張
次に入力された値を使って、実際に計算を行い、画面に結果を表示させましょう。
script.js
を以下のように書き換えます。
const incomeInput = document.getElementById('income');
const familySelect = document.getElementById('family-structure');
const calculateButton = document.getElementById('calculate-button');
const resultAmount = document.getElementById('result-amount');
calculateButton.addEventListener('click', () => {
// 1. 入力値を取得する
// inputの入力値は文字列なので、Number()で数値に変換します。
const income = Number(incomeInput.value);
const familyType = familySelect.value;
// 2. 簡単な計算ロジック(これはあくまで簡易的なモデルです)
let limitAmount = 0; // 計算結果を入れる変数を用意
if (income > 1500000) { // 最低限の年収がある場合のみ計算
// 住民税所得割額を簡易的に年収の6%と仮定します
const residentTax = income * 0.06;
// ふるさと納税の計算式を簡略化したもの
limitAmount = (residentTax * 0.2) / (0.9 - 0.05 * 1.021) + 2000;
}
// 3. 計算結果を画面に表示する
// Math.floor()で小数点以下を切り捨てます。
resultAmount.textContent = Math.floor(limitAmount);
});
解説:
incomeInput.value
で入力欄のテキストを取得し、Number()
で数値に変換しています。これを忘れると、正しく計算できません。if (income > 1500000)
という条件分岐で、一定以上の年収がある場合だけ計算するようにしています。- 計算した結果(
limitAmount
)を、resultAmount.textContent
に代入することで、HTMLの<span id="result-amount">
の部分のテキストを書き換えています。
ブラウザを更新して、年収に「5000000」と入力してボタンを押してみてください。計算結果が表示されるはずです!
ステップ3: 実用的な応用
現状では、家族構成を変えても計算結果は変わりません。if...else if...else
構文を使って、選択された家族構成に応じて控除額が変わるようにしましょう。
script.js
のaddEventListener
の中身を、以下のように変更します。
// ... (上部の定数定義は同じ) ...
calculateButton.addEventListener('click', () => {
const income = Number(incomeInput.value);
const familyType = familySelect.value;
// 入力値が0以下の場合は計算しない
if (income <= 0) {
resultAmount.textContent = 0;
return; // ここで処理を終了
}
// 基本控除額を計算する(簡易モデル)
let baseLimit = (income * 0.06 * 0.2) / (0.9 - 0.05 * 1.021) + 2000;
// 家族構成に応じた調整
let finalLimit = 0;
if (familyType === 'single') {
finalLimit = baseLimit;
} else if (familyType === 'married') {
// 配偶者控除を考慮し、少し上限額が下がると仮定
finalLimit = baseLimit * 0.9;
} else if (familyType === 'married-child') {
// 扶養控除を考慮し、さらに上限額が下がると仮定
finalLimit = baseLimit * 0.8;
}
resultAmount.textContent = Math.floor(finalLimit);
});
解説:
- 最初に
if (income <= 0)
というチェック(バリデーション)を入れ、不正な入力値の場合は処理を中断するようにしました。 if...else if
を使って、familyType
の値('single'
など)に応じて、最終的な計算結果finalLimit
を調整しています。これで、家族構成を選ぶと結果が変わる、より実用的なツールになりました。
ステップ4: チーム開発を意識した改善
今のコードは動きますが、計算ロジックがボタンクリックの処理の中に全部書かれていて、少し読みにくいです。これを「関数」として切り出し、コードを整理しましょう。
script.js
全体を以下のように書き換えます。
const incomeInput = document.getElementById('income');
const familySelect = document.getElementById('family-structure');
const calculateButton = document.getElementById('calculate-button');
const resultAmount = document.getElementById('result-amount');
// 自己負担額のような、固定の数値を定数として定義する
const SELF_CONTRIBUTION = 2000;
/**
* 控除上限額を計算する関数
* @param {number} income - 年収
* @param {string} familyType - 家族構成 ('single', 'married', etc.)
* @returns {number} - 計算された控除上限額
*/
function calculateLimit(income, familyType) {
if (income <= 0) {
return 0;
}
// 実際の計算は非常に複雑なため、ここでは簡易的なシミュレーションを行います
const residentTaxRate = 0.06; // 住民税所得割額の仮定レート
const incomeTaxRate = 0.05; // 所得税率の仮定レート
let baseLimit = (income * residentTaxRate * 0.2) / (0.9 - incomeTaxRate * 1.021) + SELF_CONTRIBUTION;
let finalLimit = 0;
if (familyType === 'single') {
finalLimit = baseLimit;
} else if (familyType === 'married') {
finalLimit = baseLimit * 0.9; // 簡易的な調整
} else if (familyType === 'married-child') {
finalLimit = baseLimit * 0.8; // 簡易的な調整
}
return Math.floor(finalLimit);
}
// メインの処理
function updateDisplay() {
const income = Number(incomeInput.value);
const familyType = familySelect.value;
const limit = calculateLimit(income, familyType);
resultAmount.textContent = limit;
}
// イベントリスナーの登録
calculateButton.addEventListener('click', updateDisplay);
改善点:
- 関数化:計算ロジックを
calculateLimit
という独立した関数にまとめました。これにより、ボタンクリックの処理(updateDisplay
)は「値を取得して、計算を依頼し、結果を表示する」という役割に集中でき、コードの見通しが格段に良くなりました。 - 命名規則:変数名や関数名を「何をするものか」が分かるように、より具体的にしました(例:
limit
->finalLimit
)。 - 定数:自己負担額
2000
のような、意味を持つ固定の数値をSELF_CONTRIBUTION
という名前の定数にしました。これを「マジックナンバーを避ける」と言い、コードの可読性と保守性を高める重要なテクニックです。 - コメント:関数の役割を説明するコメント(JSDoc形式)を追加しました。チームの他のメンバーが、この関数を使い方をすぐに理解できます。
実際の開発現場での活用
あなたが今書いたコードには、プロの現場で使われている考え方が詰まっています。
業務での使用例
「入力→処理→出力」のモデルは、あらゆるシステムで使われています。
- ECサイト:商品の価格と数量、送料を入力し、合計金額を計算して表示する。
- 金融システム:借入額や金利、返済期間を入力し、毎月の返済額をシミュレーションする。
- 業務システム:売上データを入力し、グラフやレポートとして出力する。
今回学んだ考え方は、様々な分野で応用できる普遍的なスキルなのです。
チーム開発でのベストプラクティス
チームで開発を進める上では、全員が気持ちよく作業できるルールが必要です。
- 分かりやすい命名:
calculateLimit
のような名前は、他の人が見ても何をする関数か一目瞭然です。func1
のような名前は避けましょう。 - 関数の責務を単一に:
calculateLimit
関数は計算に専念し、画面表示は行いません。このように役割を分けることで、修正が容易になります。 - バージョン管理:実際の開発では、Gitのようなツールでコードの変更履歴を管理し、誰がいつ何を修正したか追跡できるようにします。
保守性を意識した書き方
書いたコードは、半年後、一年後の自分や他の人が修正することになります。そのときに「読み解くのが大変…」とならないように書くのが「保守性」です。
- マジックナンバーを定数に:先ほど
SELF_CONTRIBUTION
を定義したように、数字に直接意味を持たせるのではなく、名前のついた定数にすることで、後から「この2000って何だっけ?」と悩むことがなくなり、変更も一箇所で済みます。 - DRY (Don’t Repeat Yourself)の原則:同じようなコードを何度も書かないようにしましょう。もし同じ計算を複数箇所で行う必要があれば、それらを一つの関数にまとめることで、修正漏れを防ぎ、コードを簡潔に保てます。
よくあるつまずきポイントと解決策
プログラミング学習にエラーはつきものです。エラーを敵ではなく、成長のヒントと捉えましょう。
初心者が陥りやすい問題
- 数値と文字列の混同:
incomeInput.value
で取得した値は、見た目が数字でも「文字列」です。Number()
で数値に変換しないまま足し算(+
)をすると、"500" + "100"
が"500100"
のように文字連結になってしまい、意図しない結果になります。 - IDのタイポ(打ち間違い):HTMLの
id="income"
と、JavaScriptのgetElementById('incom')
のように、一文字でも違うと要素を取得できず、エラー(null
参照エラー)になります。注意深く確認しましょう。
エラーメッセージの読み方
開発者ツールのコンソールに表示されるエラーメッセージは、最高のデバッグツールです。「Uncaught TypeError: Cannot read properties of null
」と表示されたら、「null
(存在しないもの)のプロパティを読もうとしてるよ」という意味です。これは、getElementById
で要素が見つからなかった(IDの指定ミスなど)場合によく発生します。
デバッグの基本的な考え方
プログラムがうまく動かないときは、console.log()
を使いましょう。怪しい箇所の前後で変数の値を出力し、意図した値が入っているか確認するのが、デバッグの基本です。
// ...
const income = Number(incomeInput.value);
console.log('入力された年収:', income); // ここで値を確認!
const limit = calculateLimit(income, familyType);
console.log('計算結果:', limit); // ここでも確認!
resultAmount.textContent = limit;
継続的な学習のために
このツール作成は、あなたのプログラミング学習の旅の始まりに過ぎません。
次に学ぶべきこと
- CSSでのデザイン:今のツールは骨格だけです。CSSを学ぶことで、見た目を美しく、使いやすくデザインできます。
- より正確なロジック:実際の控除額計算はもっと複雑です。総務省のサイトなどを参考に、より詳細な条件分岐(社会保険料控除、所得税率の段階的変更など)を実装してみるのも良い挑戦です。
- フレームワークの活用:ReactやVue.jsといったJavaScriptフレームワークを学ぶと、より複雑で大規模なアプリケーションを効率的に開発できるようになります。
おすすめの学習リソース
- 公式ドキュメント:JavaScriptのことで迷ったら、まずはMDN Web Docs(Mozilla Developer Network)を参照するのが王道です。正確で信頼性の高い情報が網羅されています。
- 実際に動かす:オンラインのコーディング学習サイトや技術書も良いですが、最も大切なのは「自分で何か作ってみる」ことです。このツールに新しい機能を追加したり、全く別の「お小遣い計算アプリ」などを作ってみましょう。
コミュニティとの関わり方
一人で学習していると、必ず壁にぶつかります。そんなときは、オンラインのプログラミングコミュニティや勉強会に参加してみましょう。自分のコードを他の人に見てもらったり、人の質問に答えることで、新たな発見や学びがあります。
まとめ:成長のための次のステップ
今回は、「ふるさと納税」という身近なテーマを通じて、プログラミングの基礎から、チーム開発でも通用する実践的な考え方までを駆け足で学びました。あなたが今、手元に作ったこの小さなツールは、紛れもなくあなたの力で問題を解決した証です。
プログラミングのスキルは、スポーツや楽器と同じで、継続的な実践によってのみ上達します。今日作ったツールをベースに、「デザインをかっこよくしてみよう」「もっと細かい条件で計算できるようにしてみよう」と、自分なりに改造を加えてみてください。その試行錯誤のプロセスこそが、あなたを本物の開発者に成長させてくれます。
「作りたい」という情熱を大切に、これからも楽しみながら学習を続けていきましょう!
関連商品・おすすめアイテム

網戸 オーダー 1mm単位サイズ指定OK! どのメーカーの窓にも取付可能! 1,859円〜 オーダー網戸__amido
販売店: DIYSHOP RESTA リスタ 楽天市場店

【松阪牛】やわ旨しっとりの松阪牛のすき焼き・しゃぶしゃぶ・切り落としの3点セットです!!三重が誇る名産品超赤字特価!!イベント・贈り物にも♪母の日 父の日 誕生日祝い 還暦祝い 結婚祝い 快気祝い
販売店: 料亭離宮 和久庵

ロール網戸 オーダー 1mm単位サイズ指定 簡単網戸 どのメーカーの窓にも取付可能 7,601円〜__roll_amido
販売店: DIYSHOP RESTA リスタ 楽天市場店