スプレッドシートで所得税を計算するための自作関数(GAS)

## 概要
スプレッドシート上で簡単に所得税等を計算したかったのでGoogleAppsScriptで自作関数を作りました。

**2023-07-02時点**で私が確認した情報をもとにしています。
各種税率などは頻繁に改正されているようなので、あくまで参考情報としてご活用ください。

## 使い方
1. 適当なスプレッドシートを開きます。
1. スプレッドシート上段で、"拡張機能" > "Apps Script"を選択します。
    ![スクリーンショット 2023-07-02 16.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467657/7768c1bf-94f0-e7e7-46f2-da43069d00ba.png)

    このような画面が開きます。
    ![スクリーンショット 2023-07-02 16.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467657/467a5ea9-2f20-1de6-61c0-f1824c97aba9.png)

1. 適当にプロジェクトの名前をつけます
    ![スクリーンショット 2023-07-02 16.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467657/1163fe15-cd78-0e8a-8607-77e800f441fb.png)

1. 下に示すコード一覧の中から利用したい関数をコピペしてください。
    ![スクリーンショット 2023-07-02 16.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467657/a643d89b-0c79-b972-94eb-346c0f7100aa.png)

1. プロジェクトを保存してスプレッドシートに戻ってください。
1. スプレッドシート上で先程コピペした関数が使えるようになります。

    ![スクリーンショット 2023-07-02 17.01.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467657/91583a70-7704-fe91-f11b-386915122537.png)

### 注意
元々用意されている関数(SUM()など）と違って、関数のレコメンドは出てきません。

![スクリーンショット 2023-07-02 17.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467657/7d9c450d-74dd-9e19-0904-62d58f816249.png)

![スクリーンショット 2023-07-02 17.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467657/c6f17e0d-e37b-5569-0750-679dffeef148.png)


## コード一覧
**入出力はすべて年額です。**

### 課税所得から住民税を計算
```javascript
// 課税所得から所得税を計算
// 課税所得は所得税と住民税で変わってくるためbasicDeductionDifferenceで調整
function calculateResidentTax(taxableIncome){
  // 住民税率
  var residentTaxRate = 0.10;

  // 均等割額
  var equalDivision = 5000;

  // 住民税と所得税の基礎控除の差
  var basicDeductionDifference = 50000;

  var residentTax = (taxableIncome + basicDeductionDifference)*residentTaxRate + equalDivision;

  return residentTax;

}
```

### 課税所得から所得税を計算
```javascript
// 課税所得（円）から所得税（円）を計算
// 入力：課税所得
// 出力：所得税額
function calculateIncomeTax(taxableIncome) {
  // 課税所得金額に対する税率と控除額のテーブル(2023年度時点)
  // https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/2260.htm
  var taxTable = [
    { range: [0, 1950000], rate: 0.05, deduction: 0 },
    { range: [1950000, 3300000], rate: 0.1, deduction: 97500 },
    { range: [3300000, 6950000], rate: 0.2, deduction: 427500 },
    { range: [6950000, 9000000], rate: 0.23, deduction: 636000 },
    { range: [9000000, 18000000], rate: 0.33, deduction: 1536000 },
    { range: [18000000, 40000000], rate: 0.4, deduction: 2796000 },
    { range: [40000000, Infinity], rate: 0.45, deduction: 4796000 },
  ];

  var incomeTax = 0;

  // 課税所得金額に対する税率と控除額を適用して所得税を計算
  for (var i = 0; i < taxTable.length; i++) {
    var taxRange = taxTable[i].range;
    var taxRate = taxTable[i].rate;
    var taxDeduction = taxTable[i].deduction;

    if (taxableIncome >= taxRange[0] && taxableIncome <= taxRange[1]) {
      incomeTax = (taxableIncome * taxRate) - taxDeduction;
      break;
    }
  }

  return incomeTax;
}
```

### 給与収入から課税所得金額を計算
```javascript
// 給与収入から課税所得金額を計算する関数
// 入力 : 給与収入（年）、社会保険料（年）、生命保険料（年）、地震保険料（年）
// 出力 : 課税所得金額
function calculateTaxableIncome(annualIncome, socialInsurancePremium, lifeInsurancePremium, earthquakeInsurancePremium, numberOfDependents) {
  // 給与所得
  var employmentIncome = annualIncome - calculateSalaryDeduction(annualIncome);

  // 所得控除
  var incomeDeduction = calculateIncomeDeduction(socialInsurancePremium, lifeInsurancePremium, earthquakeInsurancePremium, numberOfDependents);

  // 課税所得
  var taxableIncome = employmentIncome - incomeDeduction

  return taxableIncome;
}
```

### 給与収入から給与所得控除額を計算
```javascript

// 給与所得控除を計算する関数
// 入力：給与収入
// 出力：給与所得控除額
function calculateSalaryDeduction(salaryIncome) {
  // 所得控除額の上限と階層別の所得控除額(2023年度時点)
  // https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/1410.htm
  const deductionTable = [
    { range: [0, 1625000],        rate: 0.0, const_deduction: 550000},
    { range: [1625000, 1800000],  rate: 0.4, const_deduction: -100000},
    { range: [1800000, 3600000],  rate: 0.3, const_deduction: 80000},
    { range: [3600000, 6600000],  rate: 0.2, const_deduction: 440000},
    { range: [6600000, 8500000],  rate: 0.1, const_deduction: 1100000},
    { range: [8500000, Infinity], rate: 0.0, const_deduction: 1950000 }
  ];
  
  let salaryDeduction = 0;
  
  // 給与所得控除額の計算
  for (var i = 0; i < deductionTable.length; i++) {
    var deductionRange = deductionTable[i].range;
    var deductionRate = deductionTable[i].rate;
    var deductionConstDeduction = deductionTable[i].const_deduction;

    if (salaryIncome >= deductionRange[0] && salaryIncome <= deductionRange[1]) {
      salaryDeduction = (salaryIncome * deductionRate) + deductionConstDeduction;
      break;
    }
  }
  return salaryDeduction;
}
```

### 各種条件から所得控除額を計算
**社会保険料控除、生命保険控除、地震保険控除、扶養控除のみを考慮に入れています。**
その他にも所得控除の項目がありますが、私は直近で関係なかったため実装しませんでした。
```javascript
// 各種保険料、扶養家族人数から所得控除額（年額)を計算
// 入力はすべて年額
function calculateIncomeDeduction(socialInsuarncePremium, lifeInsurancePremium, earthquakeInsurancePremium, numberOfDependents) {
  // 基礎控除(合計所得が2400万円以下と仮定)
  var baseDeduction = 480000;

  // 社会保険料控除
  var socialInsuarnceDeduction =  socialInsuarncePremium;

  // 生命保険料控除
  var lifeInsuranceDeduction = calculateLifeInsuranceDeduction(lifeInsurancePremium);

  // 地震保険料控除
  var earthquakeInsuranceDeduction = calculateEarthquakeInsuranceDeduction(earthquakeInsurancePremium);

  // 配偶者控除

  // 扶養控除（一般）
  var dependentDeductionBase = 380000;
  var dependentDeduction = dependentDeductionBase * numberOfDependents;
  

  // 所得控除
  var incomeDeduction = 
  baseDeduction + socialInsuarnceDeduction + lifeInsuranceDeduction + earthquakeInsuranceDeduction + dependentDeduction;

  return incomeDeduction;
}
```

### 給与収入から社会保険料を計算
```javascript
// 給与収入から社会保険料（年額）を計算
// 社会保険料 = 健康保険料 + 介護保険料 + 厚生年金保険料 + 雇用保険料
// 入力 : 給与収入（年額）, 年齢(介護保険料の有無に関わる)
// 出力 : 社会保険料（年額）
function calculateSocialInsurancePremium(annualIncome, age) {
  // 健康保険料の計算 https://www.kyoukaikenpo.or.jp/~/media/Files/shared/hokenryouritu/r4/ippan/r40223aichi.pdf

  // 標準報酬月額（給与収入を12で割る形で概算
  var standardSalary = annualIncome/12;

  // 健康保険料（月額）の計算
  var healthInsuranceRate = 0.0993;
  var healthInsurancePremium = standardSalary * healthInsuranceRate / 2 ; // 労使折半
  
  // 厚生年金保険料(月額）の計算 健康保険料pdf参照
  var pensionInsuranceRate = 0.1830;
  var pensionInsurancePremium = standardSalary * pensionInsuranceRate / 2 ; // 労使折半

  // 雇用保険料（月額）の計算 https://www.mhlw.go.jp/content/001050206.pdf
  var employmentInsuranceRate = 0.006;
  var employmentInsurancePremium = standardSalary * employmentInsuranceRate;

  // 介護保険料（月額）の計算
  var careInsuranceRate = 0.0164;
  var careInsurancePremium = 0;
  if (age >= 40) {
    var careInsurancePremium = standardSalary * careInsuranceRate;
  }

  // 社会保険料（月額）
  var socialInsurancePremium = healthInsurancePremium + pensionInsurancePremium + employmentInsurancePremium + careInsurancePremium

  // 社会保険料（年額）
  var socialInsuarncePremiumYear = socialInsurancePremium * 12;

  return socialInsuarncePremiumYear;
}
```

### 生命保険料から生命保険料控除額を計算
```javascript
// 生命保険料控除を計算
function calculateLifeInsuranceDeduction(lifeInsurancePremium){
  // 生命保険料控除
  var lifeInsuranceDeduction = 0;
  if (lifeInsurancePremium < 20000){
    lifeInsuranceDeduction = lifeInsurancePremium;
  } else if (lifeInsurancePremium >= 20000 && lifeInsurancePremium < 40000) {
    lifeInsuranceDeduction = lifeInsurancePremium*0.5 + 10000;
  } else if (lifeInsurancePremium >= 40000 && lifeInsurancePremium < 80000) {
    lifeInsuranceDeduction = lifeInsurancePremium*0.25 + 20000;
  } else {
    lifeInsuranceDeduction = 40000;
  }

  return lifeInsuranceDeduction;
}
```

### 地震保険料から地震保険料控除を計算
```javascript
// 地震保険料控除を計算
function calculateEarthquakeInsuranceDeduction(earthquakeInsurancePremium){
  // 地震保険料控除 
  // https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/1145.htm
  var earthquakeInsuranceDeduction = 0;
  if (earthquakeInsurancePremium < 50000){
    earthquakeInsuranceDeduction = earthquakeInsurancePremium;
  } else {
    earthquakeInsuranceDeduction = 50000;
  }

  return earthquakeInsuranceDeduction;
}
```

## 参考にさせていただいた記事・サイト
https://qiita.com/merarli/items/3a7c65b08974afea1174

https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/1400.htm

https://www.nta.go.jp/publication/pamph/koho/kurashi/html/01_1.htm

https://www.kyoukaikenpo.or.jp/g7/cat330/sb3150/r05/r5ryougakuhyou3gatukara/