皆さんこんにちは。kintoneアプリエンジニアのtomiokaです。
先日、会計事務所のお客様から「決算と申告の期限管理をなんとかしたい」と相談がありました。
顧問先を120社ほど抱えていて、スタッフ8名で担当を分けているそうです。法人の決算月は3月に集中しがちとはいえ、実際には12か月にバラけていますよね。毎月何かしらの申告期限が来る状態で、Excelの一覧表で管理しているものの、年に数件は対応の遅れが出てしまうとのことでした。
年間で考えると、法人税・消費税だけでも約240件の申告処理があります。スタッフ1人あたり15社を担当している計算ですが、担当者が体調を崩したり繁忙期が重なったりすると、どうしても確認が抜けるタイミングが出てきます。
今回は、この会計事務所の決算期・申告期限の管理をkintoneで構築した事例を紹介します。
この記事の想定読者
この記事は、以下のような方に向けて書いています。
- 顧問先100〜200社規模の会計事務所・税理士法人で、決算・申告の進捗管理を担当されている方
- Excelや紙の台帳で期限管理をしているが、件数が増えて限界を感じている方
- kintoneの導入を検討しているが、会計事務所での活用イメージが湧かない方
Excelでの期限管理で何が起きていたか
お客様に現状を詳しく聞いてみると、いくつかの問題が見えてきました。
まず、Excelの一覧表に顧問先ごとの決算月と申告期限を記載しているのですが、「今月やるべき作業」を確認するにはフィルタをかけてソートする手順が必要です。朝の忙しい時間帯にこの作業を毎日やるのは現実的ではないですよね。
次に、進捗の共有が難しいという問題です。担当者がどこまで作業を進めているのか、事務所の所長が把握するにはスタッフに直接聞くしかありません。8名のスタッフに毎日「あの件どう?」と確認するのはさすがに非効率です。
さらに、決算の3か月前から準備を始めたいのに、その「3か月前」を意識するタイミングがないという課題がありました。気づいたら決算月が来ていて、そこから慌てて準備を始めるというパターンがほぼ必ずと言っていいほど発生します。
kintoneで構築した3つのアプリ
今回、以下の3つのアプリで構成しました。
| アプリ名 | 役割 | 概要 |
|---|---|---|
| 顧問先マスタ | マスタデータ管理 | 顧問先の基本情報・決算月・担当スタッフを管理 |
| 申告タスク | タスク管理 | 申告ごとの作業進捗・期限・ステータスを管理 |
| 対応履歴 | 履歴管理 | 顧問先とのやりとりや作業メモを時系列で記録 |
ポイントは、顧問先マスタと申告タスクを分けたことです。顧問先マスタは基本情報なので頻繁には更新しません。一方、申告タスクは年に何度も作成・更新されるので、別アプリにして管理しやすくしています。対応履歴は、電話やメールのやりとりを時系列で残す場所です。担当者が変わったときの引き継ぎにも活用できます。
フィールド構成
顧問先マスタアプリ
| フィールド名 | フィールドタイプ | 備考 |
|---|---|---|
| 会社名 | 文字列(1行) | 必須 |
| 代表者名 | 文字列(1行) | |
| 決算月 | ドロップダウン | 1〜12の選択肢 |
| 申告種別 | チェックボックス | 法人税、消費税、地方税など |
| 担当スタッフ | ユーザー選択 | 事務所のスタッフを選択 |
| 顧問契約開始日 | 日付 | |
| 備考 | 文字列(複数行) |
申告タスクアプリ
| フィールド名 | フィールドタイプ | 備考 |
|---|---|---|
| 顧問先名 | ルックアップ | 顧問先マスタから取得 |
| タスク種別 | ドロップダウン | 法人税申告、消費税申告、決算書作成など |
| 申告期限 | 日付 | 決算月+2か月の末日 |
| ステータス | ドロップダウン | 未着手、準備中、作業中、確認待ち、完了 |
| 担当スタッフ | ユーザー選択 | 顧問先マスタからコピー |
| 対応年度 | 文字列(1行) | 例: 2026年3月期 |
| メモ | 文字列(複数行) |
決算3か月前にタスクを自動生成するカスタマイズ
今回のカスタマイズの要は、「決算月の3か月前に申告タスクを自動で生成する」機能です。
仕組みはシンプルで、顧問先マスタの一覧画面に「申告タスク自動生成」ボタンを配置します。クリックすると、3か月後に決算を迎える顧問先を自動で抽出し、申告タスクアプリにレコードを一括作成します。月初に1回このボタンを押すだけで、3か月先の準備が始められる仕組みです。
以下が実際のコードです。顧問先マスタアプリの一覧画面で動作します。
(function() {
'use strict';
// 申告タスクアプリのアプリID(環境に合わせて変更)
var TASK_APP_ID = 200;
kintone.events.on('app.record.index.show', function(event) {
if (document.getElementById('btn-generate-tasks')) {
return event;
}
var btn = document.createElement('button');
btn.id = 'btn-generate-tasks';
btn.textContent = '申告タスク自動生成';
btn.style.cssText =
'padding: 8px 16px; background: #3498db; color: #fff;' +
'border: none; border-radius: 4px; cursor: pointer; font-size: 14px;';
btn.addEventListener('click', function() {
if (!confirm('3か月後に決算を迎える顧問先のタスクを生成しますか?')) {
return;
}
createTasks();
});
kintone.app.getHeaderMenuSpaceElement().appendChild(btn);
return event;
});
function createTasks() {
var today = new Date();
// 3か月後の月を計算(getMonthは0始まりなので+1して実月に変換)
var targetMonth = today.getMonth() + 1 + 3;
var targetYear = today.getFullYear();
if (targetMonth > 12) {
targetMonth = targetMonth - 12;
targetYear = targetYear + 1;
}
// 決算月が一致する顧問先を検索
var query = '決算月 in ("' + targetMonth + '")';
kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', {
app: kintone.app.getId(),
query: query
}).then(function(resp) {
if (resp.records.length === 0) {
alert(targetMonth + '月決算の顧問先はありません。');
return kintone.Promise.resolve(null);
}
// 申告タスクのレコードを組み立てる
var tasks = resp.records.map(function(rec) {
var deadline = calcDeadline(
parseInt(rec['決算月'].value, 10),
targetYear
);
return {
顧問先名: { value: rec['会社名'].value },
タスク種別: { value: '法人税・地方税申告' },
申告期限: { value: deadline },
ステータス: { value: '未着手' },
担当スタッフ: {
value: [{ code: rec['担当スタッフ'].value[0].code }]
}
};
});
// 申告タスクアプリに一括登録
return kintone.api(kintone.api.url('/k/v1/records.json', true), 'POST', {
app: TASK_APP_ID,
records: tasks
});
}).then(function(resp) {
if (resp && resp.ids) {
alert(resp.ids.length + '件のタスクを生成しました。');
location.reload();
}
}).catch(function(err) {
console.error(err);
alert('エラーが発生しました: ' + err.message);
});
}
// 申告期限を算出(決算月の2か月後の末日)
function calcDeadline(fiscalMonth, currentYear) {
var dlMonth = fiscalMonth + 2;
var dlYear = currentYear;
if (dlMonth > 12) {
dlMonth = dlMonth - 12;
dlYear = dlYear + 1;
}
// 翌月の0日を指定すると当月の末日が取れる
var lastDay = new Date(dlYear, dlMonth, 0).getDate();
var mm = ('0' + dlMonth).slice(-2);
var dd = ('0' + lastDay).slice(-2);
return dlYear + '-' + mm + '-' + dd;
}
})();コードのポイントを整理します。
today.getMonth() + 1 + 3で3か月後の月を計算しています。JavaScriptのgetMonth()は0始まりなので、まず+1して実際の月に変換し、さらに+3で3か月後を求めていますcalcDeadline関数では、決算月の2か月後の末日を申告期限として算出しています。法人税の申告期限は原則として事業年度終了日の翌日から2か月以内です- ユーザー選択フィールドは
[{ code: "ユーザーコード" }]の配列形式で値を指定します - ヘッダーメニューのスペース要素にボタンを配置することで、一覧画面の操作と自然に馴染みます
ハマりどころ
今回の構築で実際にハマったポイントを共有します。
ドロップダウンの値は文字列
決算月をドロップダウンで「1」「2」…「12」と設定していたのですが、kintoneのドロップダウンの値は文字列として保持されます。クエリで数値として比較しようとして結果が0件になり、、、、原因に気づくまで少し時間がかかりました。
クエリでは 決算月 in ("3") のように文字列として指定する必要があります。parseInt で変換するのはJavaScript側の計算処理のときだけです。
一括登録の上限は100件
REST APIの POST /k/v1/records.json は、1回のリクエストで最大100件までしか登録できません。顧問先120社のうち特定の月に集中しているケースだと、、、、100件を超える可能性があります。
今回は月ごとに分散していたので問題になりませんでしたが、3月決算の法人が多い事務所では100件を超えることもあり得ます。その場合は配列を100件ずつ分割してリクエストを複数回に分ける処理が必要です。
重複生成の防止
ボタンを月に2回押してしまうと、同じ顧問先に対してタスクが二重に生成されてしまいます。本番の運用では、申告タスクアプリ側に「同じ顧問先・同じ対応年度のタスクが既に存在するか」を事前にチェックする処理を入れるべきです。
今回は記事の見通しを優先してシンプルにしていますが、、、、実運用では重複チェックは必須なので、導入時には忘れずに追加してください。
導入してどうなったか
このアプリを導入してから約3か月が経った時点で、お客様から以下のフィードバックをいただきました。
- 申告期限の対応漏れがゼロになった。以前は年に3〜4件あった遅延がなくなった
- スタッフ全員の作業進捗が一覧で見えるようになり、所長が個別に確認する手間がなくなった
- 3か月前からタスクが立つことで「今月は多いから早めに動こう」という判断ができるようになった
- 新しいスタッフが入ったときも、kintoneの対応履歴を見れば過去の経緯がわかるので引き継ぎがスムーズになった
特に所長からは「毎月月初にボタンを1回押すだけで3か月先の仕事が見えるのが良い」という言葉をいただけました。シンプルな仕組みほど現場に定着しやすいと改めて感じた案件です。
まとめ
今回は、会計事務所の決算期・申告期限の管理をkintoneで構築した事例を紹介しました。
Excelでの期限管理は少人数・少件数のうちは機能しますが、顧問先が100社を超えてくると「見落とし」のリスクが無視できなくなります。今回の仕組みは、kintoneの標準機能とちょっとしたJavaScriptカスタマイズの組み合わせで実現できるものです。
改めてポイントを整理します。
- 顧問先マスタ・申告タスク・対応履歴の3アプリ構成で、マスタデータと業務データを分離する
- 決算月の3か月前にタスクを自動生成することで、準備の着手漏れを防ぐ
- ステータス管理で事務所全体の進捗を一覧から把握できるようにする
実際にこの仕組みを導入した事務所では、年に数件あった申告遅延がゼロになり、スタッフの負荷も平準化されました。会計事務所に限らず、「毎月決まったタイミングで発生する業務」の期限管理にはkintoneが向いています。
株式会社ファストコーディングでは、kintoneのカスタマイズや業務アプリの構築を承っています。「うちの事務所でもkintoneを使えるだろうか」「Excelからの移行を相談したい」といったご要望があれば、お問い合わせフォームからお気軽にご連絡ください。

