どうもcoto.です。
今年もやってきました年末。まだ少し早いか。
個人事業主にとって年末といえば、そろそろ確定申告用のいろいろしなきゃなーと思う時期。
今回は、青色申告65万用の複式簿記の記帳を少しラクにするGASです。
その都度コツコツ記帳できる方には無関係ですが…
いや、本当はできるできないでなくやらなきゃいけないんだけれども。
今回のコードでできること
決まった取引先から定期的な収入が入る取引について、
金額(手数料や源泉徴収があればそれも)を表に入力すると、
複式簿記形式で仕訳帳にまとめて記載される。
例えば、
A社から毎月15日納品、30日振込、報酬は毎月異なる依頼 を受けている、
といった場合ですね。
実行イメージ
あらかじめ用意した表に収入、手数料などを入力し、
ボタンを押すと別シートに作成した仕訳帳に記載される。
あらかじめ用意する表
スプレッドシートに、以下のような
収入関連シート:クライアント毎の収入表
仕訳帳シート :仕訳帳の枠組み を作成します。(図の金額は適当です)
(重要)仕訳帳シートのセルC2に申告する年分を入れておきます。(上の図の2020の部分)
コード
クライアントA:月末締め・翌月末払い・源泉徴収なし・振込手数料あり
このクライアントとの取引では、以下のような仕訳が考えられます。
勘定科目としては納品時に売掛金&売上として計上し、
翌月普通預金で売掛金回収、支払手数料が引かれている、という感じです。
/*項目早見表
収入関連それぞれの表
[0]=月 [1]=売上 [2]=源泉徴収 [3]=手数料 [4]=実振込額
*/
var Shunyu = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('収入関連'); //シート'収入関連'を取得
var Shiwake = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('仕訳帳'); //シート'仕訳帳'を取得
var TYear = Shiwake.getRange('C2'); //確定申告する年を取得
function clientA() {
let CliA = Shunyu.getRange('B8:F19').getValues(); //クライアントA 表のデータを取得
for(let i = 0; i <= 11; i++) {
if(CliA[i][1] != '' || CliA[i][1] != 0){
let rowShiwake = Shiwake.getLastRow(); //シート'仕訳帳'の最終行を取得
let setCell = Shiwake.getRange(rowShiwake + 1, 3, 4, 7); //シート'仕訳帳'の最終行の下4行を取得
//金額確定日(売掛金の日)を取得
var date = new Date(TYear +'/' + CliA[i][0] + '/01'); //「当月1日」を取得
date.setMonth(date.getMonth()+1); //1ヶ月後の日付にする
date.setDate(0); //前月末日付にする(つまりここまでで指定月の月末日を取得)
var day = Utilities.formatDate(date, 'JST', 'MM/dd');
//振込日を取得
var date2 = new Date(TYear +'/' + CliA[i][0] + '/01'); //「当月1日」を取得
date2.setMonth(date2.getMonth()+2); //2ヶ月後の日付にする
date2.setDate(0); //前月末日付にする(つまりここまでで指定月の翌月末日を取得)
var day2 = Utilities.formatDate(date2, 'JST', 'MM/dd');
var tenki = [['cli-A'+ ('00' + CliA[i][0]).slice(-2), day, '売掛金',CliA[i][1], '売上(収入)', CliA[i][1], '売上(クライアントA'+CliA[i][0]+'月分)'],
['cli-A'+ ('00' + CliA[i][0]).slice(-2), day2, '諸口', , '売掛金', CliA[i][1], '振込(クライアントA'+CliA[i][0]+'月分)'],
['cli-A'+ ('00' + CliA[i][0]).slice(-2), day2, '(普通預金)',CliA[i][4], , , '振込(クライアントA'+CliA[i][0]+'月分)'],
['cli-A'+ ('00' + CliA[i][0]).slice(-2), day2, '(支払手数料)',CliA[i][3], , , '振込手数料(クライアントA'+CliA[i][0]+'月分)']];
setCell.setValues(tenki);
}
}
}
このコードを実行すると、以下のようになります。
月末締めや月末払いでは、月によって末日が変わるので少々面倒ですね。
クライアントB:15日締め・25日払い・源泉徴収なし・振込手数料なし
このクライアントとの取引では、以下のような仕訳が考えられます。
手数料がないので2行で済みます。すっきり。
コードはこちら↓
var Shunyu = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('収入関連'); //シート'収入関連'を取得
var Shiwake = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('仕訳帳'); //シート'仕訳帳'を取得
var TYear = Shiwake.getRange('C2'); //確定申告する年を取得
function clientB() {
let CliB = Shunyu.getRange('H8:L19').getValues(); //クライアントB 表のデータを取得
for(let i = 0; i <= 11; i++) {
if(CliB[i][1] != '' || CliB[i][1] != 0){
let rowShiwake = Shiwake.getLastRow(); //シート'仕訳帳'の最終行を取得
let setCell = Shiwake.getRange(rowShiwake + 1, 3, 2, 7); //シート'仕訳帳'の最終行の下2行を取得
var date = new Date(TYear +'/' + CliB[i][0] + '/15'); //金額確定日(売掛金の日)を取得
var day = Utilities.formatDate(date, 'JST', 'MM/dd');
var date2 = new Date(TYear +'/' + CliB[i][0] + '/25'); //振込日を取得
var day2 = Utilities.formatDate(date, 'JST', 'MM/dd');
var tenki = [['cli-B'+ ('00' + CliB[i][0]).slice(-2), day, '売掛金', CliB[i][1], '売上(収入)', CliB[i][1], '売上(クライアントB'+CliB[i][0]+'月分)'],
['cli-B'+ ('00' + CliB[i][0]).slice(-2), day2, '普通預金', CliB[i][1], '売掛金', CliB[i][1], '振込(クライアントB'+CliB[i][0]+'月分)']];
setCell.setValues(tenki);
}
}
}
コードもクライアントAと比較して、15日、25日と毎月決まった日付になる分簡単です。
クライアントC:15日締め・翌々25日払い・源泉徴収あり・振込手数料あり
このクライアントの収入表と仕訳は以下のようになります。
手数料に加えて源泉徴収もあるので1取引分で5行です。
源泉徴収の勘定科目は仮払金にしています。
コードはこちら
var Shunyu = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('収入関連'); //シート'収入関連'を取得
var Shiwake = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('仕訳帳'); //シート'仕訳帳'を取得
var TYear = Shiwake.getRange('C2'); //確定申告する年を取得
function clientC() {
let CliC = Shunyu.getRange('B28:F39').getValues(); //クライアントC 表のデータを取得
for(let i = 0; i <= 11; i++) {
if(CliC[i][1] != '' || CliC[i][1] != 0){
let rowShiwake = Shiwake.getLastRow(); //シート'仕訳帳'の最終行を取得
let setCell = Shiwake.getRange(rowShiwake + 1, 3, 5, 7); //シート'仕訳帳'の最終行の下5行を取得
//金額確定日(売掛金の日)を取得
var date = new Date(TYear +'/' + CliC[i][0] + '/15');
var day = Utilities.formatDate(date, 'JST', 'MM/dd');
//振込日を取得
var date2 = new Date(TYear +'/' + CliC[i][0] + '/25'); //「今月1日」を取得
date2.setMonth(date2.getMonth()+2); //2ヶ月後の日付にする
var day2 = Utilities.formatDate(date2, 'JST', 'MM/dd');
var tenki = [['cli-C'+ ('00' + CliC[i][0]).slice(-2), day, '売掛金',CliC[i][1], '売上(収入)', CliC[i][1], '売上(クライアントC'+CliC[i][0]+'月分)'],
['cli-C'+ ('00' + CliC[i][0]).slice(-2), day2, '諸口', , '売掛金', CliC[i][1], '振込(クライアントC'+CliC[i][0]+'月分)'],
['cli-C'+ ('00' + CliC[i][0]).slice(-2), day2, '(普通預金)',CliC[i][4], , , '振込(クライアントC'+CliC[i][0]+'月分)'],
['cli-C'+ ('00' + CliC[i][0]).slice(-2), day2, '(仮払金)', CliC[i][2], , , '源泉所得税(クライアントC'+CliC[i][0]+'月分)'],
['cli-C'+ ('00' + CliC[i][0]).slice(-2), day2, '(支払手数料)',CliC[i][3], , , '振込手数料(クライアントC'+CliC[i][0]+'月分)']];
setCell.setValues(tenki);
}
}
}
少し解説と言い訳
●複数のクライアントと取引がある環境で真価を発揮すると思います。
(仕訳帳に全クライアント記帳後、日付、識別コードでソートしてください)
●収入関連シート内の表については、GASでどうにかするより通常の計算(SUM関数など)をした方が楽そうだったのでそうしています。
●完全に青色申告向けのみであれば、収入関連シート内の「計」の行や〇〇日払いなどは
必要ありませんが、ある方が後々わかりやすいと思います。
●絶対に毎月収入があることが確定していれば各コードのif文(↓のような)は必要ありませんが、
まぁわざわざ消すほど邪魔ではないかと。
if(CliA[i][1] != '' || CliA[i][1] != 0){
●上ではそれぞれに記述していますが、グローバル領域の
var Shunyu = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('収入関連'); //シート'収入関連'を取得
var Shiwake = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('仕訳帳'); //シート'仕訳帳'を取得
var TYear = Shiwake.getRange('C2'); //確定申告する年を取得
は1回でOKです。
●仕訳の方法に関してはプロではないので間違いがあるかも。
(あくまで副業レベルの個人事業主を想定しておりますので、取引規模が税務調査対象レベルの方はきちんとしたソフトor税理士さんにお願いしてください。)
●コーディングもプロではないのでなかなかにごちゃっとしてます。
今回のコードに向く人
- 個人事業主
- 青色申告で65万控除を受けたい
- 定期で同じ取引先から収入or支出がある
- 年間の取引回数が100回未満
- なるべく有料会計ソフトを使いたくない
御託
帳簿は本来、毎日記録するものですが、
副業としてやっているとつい先延ばしにしてしまいますよね。
私は気付くと3, 4ヶ月経ってます…
そして、間があくと帳簿の付け方を忘れてさらに時間がかかるという悪循環。
会計ソフトほど簡単でなくても、できるだけ自動化したいなーとGASを利用してみました。
今回のコードを応用すれば水道光熱費、通信料などの定期的な費用の仕訳も自動化できます。
で、仕訳帳のほうを後で並べ替えればきちんと時系列の帳簿ができますね。
もし同じようなお考えの人で、躓き中ならばぜひ。
コメント