税理士・社会保険労務士の事務所で、顧問先ごとの決算月と届出の状況から翌月の期限を洗い出し、顧問先ごとの案内メールの下書きを毎月作る
顧問先の一覧にある決算月や届出の状況から、翌月に来る税務と労務の期限を顧問先ごとに洗い出し、期限と用意してほしい資料を書いた案内メールの下書きを毎月作ります。担当者は下書きを確かめて送るだけになります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- 士業
- 対象部門
- 総務
- 対象業務
- 台帳・マスタ管理/書類作成
- 主な課題
- 人手が足りない/書類作成に時間がかかる/期限・対応漏れが起きる
- AIで行う処理
- 生成
- 主な効果
- 品質標準化/工数削減/機会損失防止
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 毎月20日ごろ、担当者が顧問先の一覧を開き、自分の受け持ちの顧問先を抜き出す
- 顧問先ごとに、決算月から翌月が申告の期限に当たるかを数える
- 源泉所得税の納期の特例の有無を見て、翌月が納付の月に当たるかを確かめる
- 36協定の有効期間の欄を見て、翌月に満了するかを確かめる
- 翌月のカレンダーを見て、期限が土日祝に当たらないかを確かめる
- 自分のひな形を開き、期限と用意してほしい資料を書き込んで、顧問先ごとにメールを書く
- 送ったことを顧問先の一覧の備考に書く
- 人業務管理の担当が、顧問先の一覧(決算月、従業員数、納期の特例、36協定の有効期間など)を最新に保つ
- 自動毎月18日の朝、Apps Script が顧問先ごとに翌月の期限を式で洗い出す
- 自動期限が土日祝に当たるものを、事務所の休日の表で翌日にずらす
- 自動従業員数と納期の特例の欄が合わない顧問先など、一覧の食い違いを担当者向けの確認事項に分ける
- 自動期限ごとに、顧問先に用意してほしい資料と事務所への送付の目安日を、期限の表から引く
- 自動顧問先ごとの期限と資料の一覧、前回の連絡の備考を OpenAI API に渡し、案内メールの件名と本文を作らせる
- 自動本文に書かれた期限の日付が、式で出した日付と一致するかを Apps Script が確かめる
- 自動一致したものを Gmail の下書きにし、確認の一覧のシートに並べる
- 人担当者が確認の一覧を見て、下書きを直して送る
- 人担当者が、一覧の食い違いを顧問先に確かめ、顧問先の一覧を直す
各工程の詳しい説明を読む
- 毎月20日ごろ、担当者が顧問先の一覧を開き、自分の受け持ちの顧問先を抜き出す
- 顧問先ごとに、決算月から翌月が申告の期限に当たるかを数える
- 源泉所得税の納期の特例の有無を見て、翌月が納付の月に当たるかを確かめる
- 36協定の有効期間の欄を見て、翌月に満了するかを確かめる
- 翌月のカレンダーを見て、期限が土日祝に当たらないかを確かめる
- 自分のひな形を開き、期限と用意してほしい資料を書き込んで、顧問先ごとにメールを書く
- 送ったことを顧問先の一覧の備考に書く
(a)数え間違いが起きる。 2番目の「決算月の2か月後」は簡単な計算ですが、150社を順に見ていくと、ずれて数える顧問先が出ます。 3番目の納期の特例は、7月と1月だけが納付の月で、特例を受けていない顧問先と取り違えると、毎月の納付の案内が抜けます。
(b)一覧の変化に気づかない。 従業員が増えて常時10人以上になった顧問先は、納期の特例の要件に当たらなくなります。一覧の従業員数は更新されていても、案内を書く担当者が特例の欄と見比べていなければ、届出が要ることに気づきません。
(c)書き方と送る時期がそろわない。 ある担当者は月の初めに、別の担当者は期限の10日前に送ります。同じ顧問先でも、担当が替わると案内の時期と書き方が変わり、顧問先が戸惑います。
(d)忙しい月に後回しになる。 3月決算の申告が重なる5月は、担当者が申告そのものに追われ、翌月の案内が月末にずれ込みます。 案内が遅れると、顧問先からの資料も遅れます。
- 【人】 業務管理の担当が、顧問先の一覧(決算月、従業員数、納期の特例、36協定の有効期間など)を最新に保つ
- 【自動】 毎月18日の朝、Apps Script が顧問先ごとに翌月の期限を式で洗い出す
- 【自動】 期限が土日祝に当たるものを、事務所の休日の表で翌日にずらす
- 【自動】 従業員数と納期の特例の欄が合わない顧問先など、一覧の食い違いを担当者向けの確認事項に分ける
- 【自動】 期限ごとに、顧問先に用意してほしい資料と事務所への送付の目安日を、期限の表から引く
- 【自動】 顧問先ごとの期限と資料の一覧、前回の連絡の備考を OpenAI API に渡し、案内メールの件名と本文を作らせる
- 【自動】 本文に書かれた期限の日付が、式で出した日付と一致するかを Apps Script が確かめる
- 【自動】 一致したものを Gmail の下書きにし、確認の一覧のシートに並べる
- 【人】 担当者が確認の一覧を見て、下書きを直して送る
- 【人】 担当者が、一覧の食い違いを顧問先に確かめ、顧問先の一覧を直す
7番目が、この設計の安全装置です。 AIが日付を書き写すときに1日ずらす、曜日を書き足して間違える、ということは起こりえます。本文の日付を式の日付と突き合わせ、合わないものは下書きにせずに担当者へ回します。
4番目は、AIではなく式で拾います。 従業員数が10人以上なのに納期の特例が「あり」になっている顧問先は、顧問先への案内ではなく、まず担当者が確かめることです。 案内のメールには書きません。
02今回想定するシステム構成
顧問先の一覧(Google スプレッドシート) 決算月/申告期限の延長の有無/従業員数/源泉所得税の納期の特例/ 36協定の有効期間/担当者/前回の連絡の備考 ▼【トリガー】毎月18日の朝 Google Apps Script ├── 翌月の期限を式で洗い出す(期限の表を引く) ├── 土日祝を翌日にずらす(事務所の休日の表) ├── 一覧の食い違いを確認事項に分ける └── 期限ごとの用意してほしい資料と送付の目安日を引く ▼ OpenAI API ── 顧問先ごとの案内メールの件名と本文を作る ▼ Google Apps Script ── 本文の日付と式の日付を突き合わせる ├── 一致 ──▶ Gmail の下書き+確認の一覧 └── 不一致 ─▶ 担当者へ(下書きにしない) ▼ 【担当者が確かめて送る】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make |
| 生成AI | OpenAI API(Responses API、構造化出力) | Claude API、Gemini API |
| 台帳 | Google スプレッドシート(顧問先の一覧・期限の表・休日の表・確認の一覧) | Microsoft 365 のブック |
| メール | Gmail(事務所の共有アドレスの下書き) | Outlook |
新しく作るのは、期限の表と休日の表の2枚です。 期限の表は「どの条件の顧問先に、どの月に、どの期限が来るか」を1行1規則で書いたもので、事務所の税理士と社会保険労務士が中身を決めます。 Apps Script はこの表を読んで当てはめるだけで、規則そのものはコードに書きません。 規則が変わったら表を直せば済むようにするためです。
期限の表の最初の規則は、公的な案内にあるものから入れます。 国税庁の手続の案内では、法人税等の確定申告書は原則として事業年度終了の日の翌日から2か月以内に提出し、期限の延長がある場合は延長後の期限、提出期限が土・日曜日・祝日等に当たる場合はその翌日が期限とされています。源泉所得税は原則として支払った月の翌月10日までに納め、給与の支給人員が常時10人未満で納期の特例を受けていれば、1月から6月分は7月10日、7月から12月分は翌年1月20日が納付期限とされています。
下書きは、事務所の共有アドレスの Gmail に作ります。 GmailApp.createDraft() は実行したアカウントのメールボックスに下書きを作るので、トリガーは共有アドレスのアカウントで作ります。 options の name で差出人の表示名を、replyTo で担当者のアドレスを指定できます。
03どうやって実装するのか
処理の起点を決める
毎月18日の朝に動かします。 ClockTriggerBuilder の onMonthDay(18) と atHour(7) で組みます。18日にしているのは、担当者が19日から下書きを確かめ、20日ごろに送れるようにするためです。 月の初めに送ると早すぎて顧問先が忘れ、月末だと資料の準備が間に合いません。
nearMinute() を指定しなければ分は任意に決まり、atHour() で指定した時刻のあたりで動きます。朝のうちに終わればよいので、ずれは問題になりません。
1回の実行は6分までです。 150社分の期限の洗い出しは数秒で終わりますが、OpenAI API を150回呼ぶと6分を超えることがあります。 そこで、期限の洗い出しと案内の作成を分け、案内は担当者ごとに分けた5回の実行で作ります。最初の実行が終わるたびに、after() で次の実行を予約します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 顧問先の一覧 | 顧問先名、法人か個人か、決算月、申告期限の延長の有無、従業員数、納期の特例の有無、36協定の有効期間の始まりと終わり、担当者、連絡先、前回の連絡の備考 | 顧問先の一覧のシート |
| 期限の表 | 規則の番号、当てはまる条件、期限の出し方、案内の文面に入れる名前、用意してほしい資料、事務所への送付の目安(期限の何日前か) | 期限の表のシート |
| 休日の表 | 土日以外の休日(祝日、年末年始) | 休日の表のシート |
| 前月の確認の一覧 | 前月に送った案内と、担当者の直し | 確認の一覧のシート |
質を決めるのは、前回の連絡の備考です。 「前回、賃金台帳の送付が期限の2日前だった」「経理の担当が替わった」「メールより電話を好む」といった、担当者の頭の中にあった顧問先ごとの事情を、ここに一言ずつ書いておきます。AIが顧問先ごとに書き分ける材料は、この欄しかありません。
期限の表の「当てはまる条件」は、顧問先の一覧の列の名前で書きます。 「決算月=翌月の2か月前」「納期の特例=あり かつ 翌月=7月」「36協定の有効期間の終わり=翌月中」のような書き方です。条件をコードではなく表で読むことで、事務所の税理士や社会保険労務士が自分で規則を足せます。
期限の表は、たとえば次のような行になります。
| 規則の番号 | 当てはまる条件 | 期限の出し方 | 用意してほしい資料 | 送付の目安 |
|---|---|---|---|---|
| CORP_TAX_RETURN | 法人 かつ 延長=なし かつ 決算月=翌月の2か月前 | 翌月の末日 | 決算月の通帳の写し、未払・未収の一覧、棚卸の表 | 期限の20日前 |
| WITHHOLDING_MONTHLY | 納期の特例=なし | 翌月の10日 | 当月の給与の支給の一覧 | 期限の5日前 |
| WITHHOLDING_SPECIAL | 納期の特例=あり かつ 翌月=7月または1月 | 7月10日/1月20日 | 半年分の給与の支給の一覧 | 期限の10日前 |
| AGREEMENT_36 | 36協定の代行=あり かつ 有効期間の終わり=翌月中 | 有効期間の終わりの日 | 時間外労働の実績、労働者の代表の選び方 | 期限の20日前 |
36協定の行の「期限」は、有効期間の終わりの日として置いています。 次の有効期間が始まるまでに届出を済ませる必要があるので、事務所の作業の締めとして終わりの日を使い、送付の目安を早めに取ります。 どこを期限として案内するかは、事務所の社会保険労務士が決めます。
データの取得方法を決める
すべて同じスプレッドシートの中にあるので、SpreadsheetApp で読むだけです。外から取ってくるデータはありません。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 顧問先の一覧の全行 | 顧問先の一覧のシート | 期限の洗い出しの対象 |
| 期限の表の全行 | 期限の表のシート | 当てはめる規則 |
| 翌月の土日以外の休日 | 休日の表のシート | 期限をずらすか |
| 前月の担当者の直し | 確認の一覧のシート | 文面の癖を直す材料 |
休日の表は、事務所で毎年12月に翌年分を入れます。 祝日はカレンダーから取ることもできますが、どの日を休日として扱うかを事務所の表で持つほうが、期限の根拠を後から説明できます。
OpenAI API は UrlFetchApp.fetch() で呼びます。 method を post、contentType を application/json、headers にAPIキー、muteHttpExceptions を true にして、失敗したときも応答の中身を読めるようにします。
AIへ渡す前に整形する
- 翌月の暦を作る … 翌月の日付ごとに、土日か、休日の表にあるかの印を付ける
- 期限を洗い出す … 顧問先ごとに、期限の表の規則を上から当てはめ、当たった規則と期限の日付を出す
- 期限を休日の翌日にずらす … 期限が土日・休日に当たるものを、次の平日に動かす。ずらしたかどうかを残す
- 送付の目安日を出す … 期限の何日前に資料を送ってほしいかを、期限の表から計算する。目安日も休日なら前の平日にする
- 一覧の食い違いを分ける … 従業員数が10人以上なのに納期の特例が「あり」、36協定の有効期間の終わりが空欄、決算月が空欄、などを確認事項にする
- 期限の無い顧問先を分ける … 翌月に当たる規則が1つも無い顧問先には案内を作らない
3番目と4番目で、ずらす向きが逆なことに注意してください。 期限は後ろへずらし、顧問先に頼む送付の目安日は前へずらします。目安日を後ろへずらすと、事務所の作業の日数が減ります。
5番目の食い違いは、AIに渡しません。 「特例の要件に当たらなくなったかもしれない」という話は、担当者が顧問先に確かめてからする話で、案内のメールで先に伝えることではありません。
AIに処理させる
させるのは、顧問先ごとに、式で出した期限と資料の一覧を、案内メールの件名と本文にすることだけです。
| させること | 中身 |
|---|---|
| 件名を作る | 「【○月の期限のご案内】」のように、翌月と顧問先が分かる件名 |
| 期限を並べる | 期限の名前、期限の日付、資料の送付の目安日を、日付の早い順に |
| 資料を書く | 用意してほしい資料を、期限ごとに箇条書きで |
| 顧問先ごとに一言添える | 前回の連絡の備考から、早めの送付のお願い、担当の交代のあいさつなど |
| 担当者への質問を分ける | 備考から読み取れない事情があれば、本文に書かずに担当者への質問にする |
| させないこと | 理由 |
|---|---|
| 期限の日付を決める・直す | 式で出す。AIが計算し直すと、式とずれた日付が本文に入る |
| 期限を足す・減らす | 期限の表が決める。AIが思いついた期限を書き足さない |
| 税額や手続の可否を書く | 事務所の判断で、担当者が個別に伝える |
| 一覧の食い違いを書く | 担当者が先に確かめる |
| 送る | 担当者が確かめてから送る |
1行目がいちばん大事な線引きです。 決算月を見て「申告の期限は○日ですね」とAIが自分で計算すると、延長の届出がある顧問先や、休日でずらした期限で外れます。期限の日付は渡したものを写すだけにし、その写し間違いも7番目で式と突き合わせます。
指示内容を固定する
あなたは税理士・社会保険労務士の合同事務所の担当者として、
顧問先に翌月の期限を案内するメールの下書きを作ります。
【すること】
- 渡された「期限の一覧」を、日付の早い順に並べて本文に書く
- 期限ごとに、用意してほしい資料と、事務所への送付の目安日を書く
- 「前回の連絡の備考」に書かれた事情があれば、本文の最後に一言添える
- 件名は「【{翌月}の期限のご案内】{顧問先名}様」とする
【厳守事項】
- 期限の日付と送付の目安日は、期限の一覧に書かれた文字列をそのまま写してください。
日付を計算し直したり、曜日を書き足したりしないでください。
- 期限の一覧に無い期限や手続を書き足さないでください。
- 税額、還付、手続をしなくてよいかどうかなど、判断を伴うことを書かないでください。
- 備考から読み取れない事情を推測で書かないでください。
確かめたいことがあれば、本文には書かずに questions_for_staff に入れてください。
- 敬語は丁寧に、ただし1通の本文は400字程度までにしてください。
- mentioned_items には、本文に書いた期限ごとに item_id と、本文に書いた日付の文字列を
そのまま入れてください。
【顧問先】{client_name}({client_type})
【担当者】{staff_name}
【期限の一覧】{deadline_items}
(item_id、期限の名前、期限の日付、休日でずらしたか、用意してほしい資料、送付の目安日)
【前回の連絡の備考】{notes}
「曜日を書き足さない」まで書くのは、AIが親切のつもりで曜日を足すからです。 日付は正しくても、曜日だけが外れた案内が顧問先に届きます。曜日が要るなら、式で出して期限の一覧に入れて渡します。
mentioned_items を返させるのは、7番目の突き合わせのためです。 本文から日付を正規表現で拾うより、AIに「どの期限をどの日付で書いたか」を別に申告させ、本文にその文字列があるかと、式の日付と一致するかの両方を確かめるほうが確実です。
出力形式を固定する
次の形のJSONで受け取ります。 Responses API の text.format に type: "json_schema"、strict: true で渡し、オブジェクトにはすべて additionalProperties: false を付け、すべての欄を required にします。
{
"client_id": "C-0412",
"subject": "【11月の期限のご案内】株式会社○○様",
"body": "",
"mentioned_items": [
{ "item_id": "CORP_TAX_RETURN", "date_text": "11月30日" },
{ "item_id": "WITHHOLDING_MONTHLY", "date_text": "11月10日" }
],
"questions_for_staff": []
}
JSONで受ける1つ目の理由は、日付の突き合わせを機械でできることです。 Apps Script は次の3つを確かめ、1つでも外れたら下書きにしません。
| 確かめること | 外れたとき |
|---|---|
期限の一覧の item_id が、mentioned_items にすべてあるか | 期限の書き漏れ。担当者へ |
mentioned_items の date_text が、式の日付と一致するか | 日付の写し間違い。担当者へ |
date_text の文字列が、body の中にそのままあるか | 申告と本文の食い違い。担当者へ |
2つ目の理由は、questions_for_staff を本文と分けられることです。 備考から読み取れない事情を本文に書かせると、推測が顧問先に届きます。質問は確認の一覧の別の列に出し、担当者が答えてから必要なら本文に足します。
断られた場合は、refusal が output_text の代わりに返るとされています。 応答が途中で切れた場合(incomplete)も含めて、JSONとして読めなかったものは下書きにせず、担当者へ回します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 顧問先の一覧・期限の表・休日の表 | SpreadsheetApp の読み取り | 期限の洗い出しの材料 |
| OpenAI API | UrlFetchApp.fetch() | 案内メールの件名と本文 |
| Gmail | GmailApp.createDraft() | 事務所の共有アドレスに下書きを作る |
| 確認の一覧のシート | 書き出し | 顧問先ごとの期限、下書きの状態、担当者への質問、一覧の食い違い |
顧問先の一覧には書き込みません。 送った記録は確認の一覧の側に残し、顧問先の一覧を直すのは業務管理の担当と担当者です。 食い違いを見つけても、一覧を自動で書き換えることはしません。
下書きの replyTo には担当者のアドレスを入れます。 顧問先が返信すると、共有アドレスではなく担当者に届きます。資料の送付の連絡が担当者に直接届くほうが、その後のやり取りが早く済みます。
人が確認する
- 確認の一覧で、担当者へ回されたものを先に見る … 日付の突き合わせで外れたもの、JSONとして読めなかったもの。手で書くか、作り直します
- 一覧の食い違いを見る … 納期の特例の要件、36協定の有効期間の空欄など。顧問先に確かめてから、顧問先の一覧を直します
- 担当者への質問に答える … 答えた内容を必要なら本文に足します
- 下書きを読んで送る … 期限の一覧と見比べ、顧問先ごとの一言が当たっているかを見ます
- 送った後に、前回の連絡の備考を更新する … 次の月の下書きの材料になります
5番目を省かないでください。 備考が更新されないと、毎月同じ一言が添えられた案内が届きます。 顧問先はそれで、事務所が自動で送っていることに気づきます。
担当が替わった月は、引き継いだ担当者が備考を先に読みます。 下書きに添えられた一言は前の担当者が残した備考から来ているので、新しい担当者が顧問先とまだ話していない内容が、本文に入っていることがあります。 その一言は、あいさつを兼ねて自分の言葉に直してから送ります。
目標は、1社4分です。 下書きを読み、期限の一覧と見比べて送るだけで済む状態にします。4分で終わらない担当者は、受け持ちの顧問先の備考が空か、一覧の食い違いが多いかのどちらかです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 決算月・特例の有無などが空欄 | 期限を出さず、一覧の食い違いとして担当者へ。案内を作らない |
| 申告期限の延長の届出がある | 期限の表の延長の規則で出す。延長の有無が空欄なら担当者へ |
| 当たる規則が1つも無い | 案内を作らない。確認の一覧には「翌月の期限なし」と書く |
| 日付の突き合わせで外れた | 下書きにせず、担当者へ |
| OpenAI API が応答しない・エラー | その顧問先は「未作成」とし、次の実行で作り直す |
| 断られた・途中で切れた | JSONとして読めないので下書きにせず、担当者へ |
| 実行が6分に近づく | 処理した顧問先の位置を残し、after() で続きを予約する |
| 連絡先のメールアドレスが空 | 下書きを作らず、本文だけを確認の一覧に書く。電話か郵送で伝える |
| 前月の案内がまだ送られていない | 前月分を先に送るよう、担当者に知らせる |
| 同じ月に二度実行された | 確認の一覧に同じ顧問先・同じ月の行があれば作らない。下書きが二重にできるのを防ぐ |
| 個人事業主に法人の規則が当たる | 期限の表の条件に「法人か個人か」を必ず入れる。当たったら規則の誤りとして業務管理の担当へ |
上の3行が、最初の数か月に多く出ます。 顧問先の一覧の空欄は、これまで担当者の頭の中で補われていたものです。案内の作成が止まることで、一覧の空欄が初めて見えるようになります。 埋めるたびに、翌月から止まる件数が減ります。
記録を残す
- 顧問先ごと・月ごとに、当てはまった規則の番号と期限の日付、休日でずらしたかどうか
- AIに渡した期限の一覧と、AIが返したJSONの全文
- 日付の突き合わせの結果(一致/外れた項目)
- 担当者が下書きを直したかどうかと、直した箇所の要約
- 送った日と、送った担当者
- 一覧の食い違いと、確かめた結果
1つ目で規則の番号を残すのは、期限の根拠を後から説明するためです。 顧問先から「なぜこの日なのか」と聞かれたときに、どの規則を当て、休日でずらしたのかを示せます。 期限の表の規則を直したときも、どの顧問先に影響したかを追えます。
4つ目は、プロンプトを直す材料です。 同じ直しが何度も出ていれば、指示か期限の表の書き方を変えます。
04実装レベルの3段階
本記事の想定は半自動化です。 1社12分が4分になります。期限の洗い出しと文面の作成が自動になり、担当者に残るのは、下書きを読んで送ることと、食い違いを確かめることです。 本格構成に進むには、資料の受け取りの記録が要ります。 どの顧問先からどの資料がいつ届いたかを、同じスプレッドシートに残す仕組みがあれば、送付の目安日を過ぎた資料だけを拾って催促の下書きを作れます。 ただし、催促はさらに顧問先との関係にひびくので、半自動化を半年回してからにしてください。
05工数削減シミュレーション
導入後 150件 × 4分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 顧問先が100社を超え、決算月がばらばらの法人を多く抱える税理士事務所・社会保険労務士事務所、または両方を置く合同事務所。顧問先の一覧を Google スプレッドシートで持ち、毎月の期限の案内を担当者がそれぞれ手で書いているため、書き方と送る時期が担当者ごとに違い、案内の漏れが年に何度か起きている場合。Google Workspace のメールを使っている場合。
- 顧問先が数十社で、期限の案内を所長が1人で回せている場合。顧問先の一覧に決算月や納期の特例の有無が入っておらず、期限を式で出せない場合(一覧の整備が先です)。期限の判断が顧問先ごとの個別の事情(延長の申請、特例の適用の可否)に大きく左右され、式で出した期限をそのまま案内できない顧問先が多い場合。
07最小構成で試す方法
- 受け持ちの顧問先から10社を選ぶ(決算月が翌月に当たる法人、納期の特例のある顧問先、36協定の更新が近い顧問先を入れる)
- その10社について、翌月の期限と用意してほしい資料を、担当者が手で一覧にする
- 手元のAIサービスの画面に、1社分の期限の一覧と前回の連絡の備考を貼り付ける
- 「この期限の一覧をもとに、顧問先への案内メールの下書きを作ってください。日付は書かれたとおりに写し、曜日を足さないでください。一覧に無い期限を書き足さないでください」と指示する
- 出てきた下書きを、担当者がふだん書いている案内と見比べる
この段階では、期限の洗い出しは人が行います。 確かめたいのは文面を任せられるかだけです。期限の式は、半自動化で Apps Script を書くときに、手で作った一覧と突き合わせて確かめます。
| 出てきた内容 | 判断 |
|---|---|
| ふだんの案内と同じくらい使える | Apps Script で期限の洗い出しと下書きの作成に進む |
| 日付を書き換えた・曜日を足した | 指示の書き方で直る。突き合わせの仕組みを必ず入れる |
| 一覧に無い期限を書き足した | 指示に「書き足さない」を強く書く。構成は有効 |
| 備考からの一言が的外れ | 備考の書き方を見直す。AIの問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIが日付を計算し直して書く | 日付は写すだけと指示し、mentioned_items と式の日付を突き合わせる |
| 曜日を足して間違える | 指示で禁じる。曜日が要るなら式で出して渡す |
| 一覧に無い期限を書き足す | 指示で禁じ、item_id の数と本文の期限の数を比べる |
| 期限を土日祝の前日にずらしてしまう | 期限は翌日へ、送付の目安日は前日へ。 向きを分けて書く |
| 納期の特例の顧問先に毎月の案内が出る | 期限の表の条件に「特例=なし」を入れる |
| 従業員数が増えた顧問先の特例に気づかない | 一覧の食い違いとして式で拾う |
| 150社分で6分を超えて止まる | 担当者ごとに分けて実行し、after() で続きを予約する |
| 下書きが担当者の個人のメールにできない | 共有アドレスで実行し、replyTo に担当者を入れる |
| 毎月同じ一言が添えられる | 送った後に備考を更新する |
| 期限の表の規則が古い | 法改正や様式の変更のたびに、事務所の資格者が表を見直す |
上の3行が、AIを使う部分の失敗のほとんどです。 どれも「書かれた日付と期限を正しく写したか」の問題で、指示だけでは防ぎきれないので、式で確かめる仕組みを入れます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧問先の名称、決算月、従業員数、届出の状況、担当者の備考です。税額や給与の額は扱いません。 備考には、顧問先の内部の事情(経理の担当の交代、資金繰りの話)が書かれることがあります。
- AIに渡すのは期限の一覧と備考だけにする … 顧問先の一覧の全体や、従業員数そのものは渡しません。備考には、案内の文面に要ることだけを書く運用にします
- APIのデータの扱いを確かめておく … OpenAI の公式の説明では、API に送ったデータは明示的に共有を選ばない限り学習に使われず、不正利用の監視の記録は最大30日保持されるとされています。Responses API は既定で応答を保存するので、
storeをfalseにして呼びます - 守秘義務の範囲を事務所で確かめる … 税理士・社会保険労務士には守秘義務があります。顧問先の情報を外部のAPIに渡すことについて、事務所の規程と顧問契約に照らして確かめてから使ってください
- 送るのは担当者 … 下書きまでで、自動で送りません。期限の案内の誤りは、顧問先の申告や届出の遅れに直結します
- 期限の表の中身は資格者が決める … この構成が保証するのは、表のとおりに期限が出ることだけです。表の規則が正しいかは、事務所の税理士と社会保険労務士が確かめます
誤りが起きた場合のリスクは、期限の案内が漏れることと、誤った日付を案内することの2つです。 前者は期限の表と顧問先の一覧の空欄から、後者はAIの写し間違いから起きます。前者は一覧の食い違いを式で拾い、後者は日付を式で突き合わせて抑えます。
10まず何から始めるか
1週目:期限の表を作る
事務所の税理士と社会保険労務士が、毎月の案内に載せている期限を1行1規則で書き出します。 法人税等の確定申告、源泉所得税の毎月の納付と納期の特例、36協定の更新から始め、資料と送付の目安も書きます。
2週目:顧問先の一覧の列をそろえる
決算月、申告期限の延長、従業員数、納期の特例、36協定の有効期間、前回の連絡の備考の列を足し、空欄を数えます。 空欄の多い顧問先から担当者が埋めます。
3週目:10社で文面を試す
手元のAIサービスで、10社分の案内の下書きを作ります。日付を書き換えていないか、期限を書き足していないかを最優先で見ます。
4週目:期限の洗い出しを Apps Script で作る
期限の表を読んで顧問先ごとの期限を出し、担当者が手で作った翌月の一覧と突き合わせます。 合わなければ、表か一覧のどちらかに直すところがあります。
2か月目: OpenAI API の下書きと日付の突き合わせを足し、Gmail の下書きにします。3か月目以降: 担当者の直しと一覧の食い違いを毎月数え、期限の表と指示を直します。担当者へ回される下書きが月に数件まで減った時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 法人税等の確定申告書の提出時期が、原則として事業年度終了の日の翌日から2か月以内であること。延長されている場合は延長後の期限であること。提出期限が土・日曜日・祝日等に当たる場合はその翌日が期限となること | 国税庁: 法人税等の申告(手続の案内) | 2026-10-08 |
| 源泉所得税が原則として支払った月の翌月10日までに納付すること。給与の支給人員が常時10人未満の源泉徴収義務者は納期の特例を受けられ、1月から6月分は7月10日、7月から12月分は翌年1月20日が納付期限となること。常時10人以上となった場合は届出書の提出が必要なこと。納付期限が休日や土曜日に当たる場合は休日明けの日が期限となること | 国税庁: No.2505 源泉所得税の納期の特例 | 2026-10-08 |
| 36協定には有効期間があり、毎年、管轄の労働基準監督署に届け出る必要があること | 福井労働局: 36協定の届出の時期です | 2026-10-08 |
ClockTriggerBuilder の onMonthDay()・atHour()・nearMinute()・after() | Google for Developers: ClockTriggerBuilder | 2026-10-08 |
GmailApp.createDraft(recipient, subject, body, options) が cc・bcc・name・replyTo・htmlBody などのオプションを取ること | Google for Developers: GmailApp | 2026-10-08 |
| 1回の実行が6分まで。Google Workspace でトリガーの合計実行時間が1日6時間、URL Fetch の呼び出しが1日10万回であること | Google for Developers: Quotas for Google Services | 2026-10-08 |
Responses API の構造化出力で text.format に json_schema・strict を指定すること。断った場合に refusal が返り、途中で切れた場合は incomplete となりうること | OpenAI for Developers: Structured model outputs | 2026-10-08 |
| API に送ったデータが、明示的に共有を選ばない限り学習に使われないこと。不正利用の監視の記録が最大30日保持されること。Responses API の応答が既定で保存されること | OpenAI for Developers: Data controls in the OpenAI platform | 2026-10-08 |
期限の表に入れる規則と、顧問先ごとの期限の判断は、事務所の税理士と社会保険労務士が決めてください。 本記事は国税庁・福井労働局・Google for Developers・OpenAI for Developers のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0936)についてのご相談はこちらから。
