財務部が各銀行の口座の残高の報告をスプレッドシートに集め、Apps Script で残高の偏りと支払の予定から資金の振替の案を作る
各銀行の口座の残高と口座別の支払の予定をスプレッドシートに集め、Apps Script で10営業日の残高の見込みと振替の案を作ります。AIはその案が口座ごとの取り決めに合うかを判定し、財務の担当は根拠付きの案を見て決めるだけにします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Power Automate/Python
- 対象業界
- 商社/小売/建設/製造
- 対象部門
- 経理/財務
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- 判断に時間がかかる/属人化している/確認ミスが多い
- AIで行う処理
- 判定
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 各行のインターネットバンキングに入り、口座の残高を表に書き写す
- 支払の予定の表から、10営業日のうちに引き落とされる・振り込む支払を口座ごとに拾う
- 口座ごとに、残高から支払を引いた見込みを計算する
- 口座のメモを見ながら、最低限置いておく額と、置きすぎている額を決める
- どの口座からどの口座へいくら移すかを決め、振替の依頼書を作る
- 財務部長が依頼書を見て承認する
- 別の担当がインターネットバンキングで振替を実行する
- 人財務の担当が、火曜と金曜の朝に各行のインターネットバンキングから残高のCSVを書き出し、ドライブの取り込みのフォルダに置く
- 自動時間主導のトリガーで Apps Script が動き、銀行ごとの形式でCSVを読み、口座の残高の表に書き込む
- 自動支払の予定の表から、10営業日の口座別の入出金を集め、日ごとの残高の見込みを出す
- 自動口座ごとの最低残高と上限の目安から、不足と余りを規則で計算し、振替の案を作る
- 自動振替の案、口座ごとの取り決めの文面、支払の予定の備考を Gemini API に渡し、案ごとの判定を JSON で受け取る
- 自動判定と根拠を振替の案の表に書き、財務の担当に知らせる
- 人財務の担当が、`conflict` と `needs_info` の案を確かめ、額を直すか、案を外す
- 人財務部長が案を承認する
- 人別の担当がインターネットバンキングで振替を実行し、実行した記録を表に付ける
各工程の詳しい説明を読む
- 各行のインターネットバンキングに入り、口座の残高を表に書き写す
- 支払の予定の表から、10営業日のうちに引き落とされる・振り込む支払を口座ごとに拾う
- 口座ごとに、残高から支払を引いた見込みを計算する
- 口座のメモを見ながら、最低限置いておく額と、置きすぎている額を決める
- どの口座からどの口座へいくら移すかを決め、振替の依頼書を作る
- 財務部長が依頼書を見て承認する
- 別の担当がインターネットバンキングで振替を実行する
(a)集めるだけで朝が終わる。 8行のインターネットバンキングに順に入り、15本の残高を写すだけで30分以上かかります。写し間違いは、計算の段で気づかなければそのまま振替の額に入ります。
(b)判断が担当者の頭の中にある。 「返済口座には返済額の1割増しを置く」「この銀行は月末に残高が減ると担当者から連絡が来る」といった取り決めは、一部は口座のメモにあり、一部は担当者の記憶にしかありません。 担当者が休むと、もう1人は前回の依頼書をまねて額を決めます。
(c)引落の口座の不足を見落とす。 税金と社会保険料の引落は月末に集中し、支払の予定の表の備考に「金額未確定」と書かれたままのことがあります。見込みの計算から漏れると、引落の日に残高が足りません。
(d)置きすぎを放っておく。 入金口座に資金がたまっても、不足が無ければ誰も動かしません。利息のつく普通預金に1行あたりの残高が偏ると、預金保険で保護される範囲を超えた額が1つの銀行に置かれたままになります。 社内で目安を決めていても、毎回の判断でそこまで見る時間がありません。
- 【人】 財務の担当が、火曜と金曜の朝に各行のインターネットバンキングから残高のCSVを書き出し、ドライブの取り込みのフォルダに置く
- 【自動】 時間主導のトリガーで Apps Script が動き、銀行ごとの形式でCSVを読み、口座の残高の表に書き込む
- 【自動】 支払の予定の表から、10営業日の口座別の入出金を集め、日ごとの残高の見込みを出す
- 【自動】 口座ごとの最低残高と上限の目安から、不足と余りを規則で計算し、振替の案を作る
- 【自動】 振替の案、口座ごとの取り決めの文面、支払の予定の備考を Gemini API に渡し、案ごとの判定を JSON で受け取る
- 【自動】 判定と根拠を振替の案の表に書き、財務の担当に知らせる
- 【人】 財務の担当が、
conflictとneeds_infoの案を確かめ、額を直すか、案を外す - 【人】 財務部長が案を承認する
- 【人】 別の担当がインターネットバンキングで振替を実行し、実行した記録を表に付ける
1番目を人の手で行うのは、この構成が銀行の接続を持たないからです。 各行の法人向けのインターネットバンキングの書き出しの形式は銀行ごとに違い、銀行とつなぐ仕組みは環境に応じた個別実装になります。 CSVの置き場を1つにするだけで、写し間違いの多くは無くなります。
7番目で人が見るのは、AIが「取り決めと食い違う」「情報が足りない」と判定した案だけです。 ok の案は、承認の前に一覧で流し見ます。
02今回想定するシステム構成
各行のインターネットバンキング(残高のCSVを書き出す) ▼【人】ドライブの取り込みのフォルダに置く ▼【トリガー】時間主導(火曜・金曜の朝) Google Apps Script ├──▶ 銀行ごとの形式の表で CSV を読み、口座の残高の表へ ├──▶ 支払の予定の表から、10営業日の口座別の入出金を集める ├──▶ 口座の設定の表(最低残高・上限の目安・役割)で不足と余りを計算 ├──▶ 規則で振替の案を作る(同じ銀行の中を優先、額は万円単位) ▼ Gemini API(Interactions API、構造化出力、store=false) │ 案ごとに ok / conflict / needs_info と根拠の文 ▼ 振替の案の表(案・判定・根拠)── 財務の担当へ通知 ▼ 【人】確認 → 財務部長の承認 → 別の担当が振替を実行
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Python、Power Automate |
| 生成AI | Gemini API(Interactions API、構造化出力) | Claude API、OpenAI API |
| 保管 | Google スプレッドシート(口座の残高・支払の予定・口座の設定・取り決め・振替の案) | - |
| 取込 | Google ドライブ(残高のCSVの取り込みのフォルダ) | - |
| 通知 | Gmail またはチャット | - |
最初の準備作業は、口座の設定の表と取り決めの表を作ることです。 設定の表は数値の規則(最低残高、上限の目安、口座の役割、利息のつく預金か、決済用預金か)を、取り決めの表は数値にしきれない文面(銀行との約束、借入の条件、担当者のメモ)を持ちます。数値は規則に、文面はAIに、と表の段階で分けておきます。
判定の部品は Gemini API の Interactions API です。 公式のページでは、構造化出力は /v1beta/interactions に response_format を渡し、mime_type を application/json にしてスキーマを指定するとされています。
保存の設定は最初に決めます。 公式のページでは、Interactions API は既定ですべての Interaction を保存し(store=true)、有料の層で55日、無料の層で1日保持するとされ、store=false で保存しない使い方を選べるとされています。口座の残高と取引の予定を渡すので、store=false を付けて呼びます。
03どうやって実装するのか
処理の起点を決める
火曜と金曜の朝の時間主導のトリガーで動かします。 公式のページでは、時間主導のトリガーは指定した時間帯の中で実行の時刻が選ばれ、9時に設定すると9時から10時のあいだのどこかで動くとされています。財務の担当がCSVを置くのが8時半ごろなので、トリガーは9時台に置き、10時に案がそろう流れにします。
CSVが置かれていなければ、処理を進めません。 15本のうち1本でも残高が取り込めていなければ、その日の見込みは作らず、足りない口座を財務の担当に知らせて終わります。 一部の口座だけで案を作ると、足りない口座の分を見ないまま振替の額が決まります。
手動でもう一度動かせるようにしておきます。 CSVを置き直したときや、急ぎの支払が入ったときは、財務の担当がスプレッドシートのメニューから同じ処理を呼びます。インストール型トリガーは作った人のアカウントで動くと公式のページにあるので、財務部の共有のアカウントで作ります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 口座の残高 | 銀行、支店、口座の種類、口座番号の下4桁、残高、基準の日時 | 各行のCSV(取り込みのフォルダ) |
| 支払の予定 | 予定日、口座、入出金の別、金額、確定か未確定か、備考 | 支払の予定の表(経理と財務が更新) |
| 口座の設定 | 口座の役割、最低残高、上限の目安、利息のつく預金か、振替の手数料の区分 | 口座の設定の表 |
| 取り決め | 口座ごと・銀行ごとの文面(銀行との約束、借入の条件、担当者のメモ)と、書いた人と日付 | 取り決めの表 |
判定の質を決めるのは、取り決めの表です。 「返済口座」「月末注意」のような短いメモでは、AIも人も判断できません。「借入の返済口座。返済日の前営業日の終わりに、返済額の110%以上を置く(借入の契約の条件ではなく社内の取り決め)」のように、何を、いつまでに、なぜ、を1行に書きます。 書いた人と日付を付けておくと、古い取り決めを見分けられます。
支払の予定の「確定か未確定か」の列は、この構成のために足します。 税金や社会保険料のように金額が後から決まるものは、前回の実績で仮の額を入れ、未確定の印を付けておきます。 AIはこの印と備考を見て、案の判定に反映します。
データの取得方法を決める
| 取るもの | どこから | どう取るか |
|---|---|---|
| 残高のCSV | ドライブの取り込みのフォルダ | フォルダの中のファイルを読み、文字コードを変換して Utilities.parseCsv で2次元の配列にする |
| CSVの列の意味 | 銀行ごとの形式の表 | 銀行ごとに、残高の列・口座番号の列・基準の日時の列を引く |
| 支払の予定 | 支払の予定の表 | 今日から10営業日の行を、口座ごとに集める |
| 口座の設定・取り決め | 口座の設定の表・取り決めの表 | 口座ごとに1行と、該当する文面をすべて |
CSVの形式は銀行ごとに違います。 見出しの行の数、残高の列の位置、日付の書き方、文字コードが違うので、銀行ごとの形式の表に「何行目から」「何列目が残高」「日付の形」を書き、スクリプトはその表に従って読みます。 公式のページでは、Utilities.parseCsv は CSV の文字列を2次元の配列にし、区切りの文字も指定できるとされています。
基準の日時を必ず取ります。 前日の夜に書き出したCSVを朝に置き忘れたまま使うと、夜間の引落の前の残高で見込みを作ることになります。 基準の日時が当日の朝より前なら、その口座は取り込まずに知らせます。
AIへ渡す前に整形する
- 口座の突き合わせ … CSVの口座番号の下4桁と銀行・支店で、口座の設定の表の口座に結び付けます。結び付かない行は取り込みません
- 残高の検算 … 前回の残高と今回の残高の差が、前回からの支払の予定の合計と大きく違えば、印を付けます
- 営業日の計算 … 社内の休日の表を使い、10営業日の日付の列を作ります。支払の予定日が休日なら、規則で前の営業日か後の営業日に寄せ、どちらに寄せたかを記録します
- 見込みの計算 … 口座ごとに、日ごとの残高の見込みを出します
- 不足と余りの計算 … 見込みの最も低い日の残高と最低残高、最も高い日の残高と上限の目安を比べます
- 振替の案の作成 … 余りのある口座から不足のある口座へ、同じ銀行の中の振替を優先し、額は万円単位で切り上げて案を作ります
6番目までをすべて規則で行うのが、この設計の要です。 額と日付は計算で決まり、AIに渡すのは「計算が終わった案」です。 AIの判定がどう出ても、案の額そのものは変わりません。
6番目の振替の案は、次の順の規則で作ります。
| 順 | 規則 |
|---|---|
| 1 | 見込みの最も低い日に最低残高を割る口座を、不足の額の大きい順に並べる |
| 2 | 同じ銀行の中に、上限の目安を超える余りのある口座があれば、そこから移す |
| 3 | 同じ銀行に無ければ、余りの最も大きい口座から移す |
| 4 | 振替の元の口座が、振替のあとも10営業日のあいだ最低残高を割らないことを確かめる |
| 5 | 振替の予定日は、不足の日の前営業日にする |
2番目で同じ銀行の中を優先するのは、手数料と実行の手間が少ないからです。 どの組み合わせで手数料がかかるかは、口座の設定の表の手数料の区分で持ちます。
3番目の休日の寄せ方は、支払の種類ごとに決めておきます。 引落は銀行の規則で後ろの営業日になることが多い一方、振込は前の営業日に前倒しする運用の会社が多いので、寄せ方を種類の列で持ちます。迷う種類は前に寄せて、不足を早めに見るようにします。
AIに処理させる
させるのは、規則が作った振替の案の1本ずつについて、口座ごとの取り決めと支払の予定の備考に照らして、採れるかどうかを判定し、根拠の文を書き出すことだけです。
| 判定 | 意味 | 例 |
|---|---|---|
ok | 取り決めと備考に食い違いが無い | 入金口座から支払の口座へ、両方の最低残高を守った振替 |
conflict | 取り決めの文面と食い違う | 月末に残高を保つと伝えてある銀行から、月末の前日に資金を抜く案 |
needs_info | 判定に要る情報が足りない | 振替の先の口座の引落に「金額未確定」の備考がある |
判定の対象には、案に含まれない口座も入れます。 規則で不足も余りも無いと出た口座でも、取り決めの文面に「今月は増資の払込に使う」とあれば、その口座は動かしてはいけないかもしれません。 案に出ていない口座について、取り決めから気をつけることがあれば account_notes に書かせます。
| させないこと | 理由 |
|---|---|
| 振替の額を変える・計算する | 額は規則で決める。AIの算数で額が変わると検算できない |
| 新しい振替の案を作る | 案は規則で作る。AIは判定と根拠まで |
| 取り決めの解釈を広げる | 書かれていないことを「おそらく」で補わない |
| 銀行や借入の契約の条件を推測する | 契約の中身は取り決めの表に書かれた範囲だけ |
| 承認・実行の可否を決める | 承認は財務部長、実行は別の担当 |
1行目がいちばん起きやすい失敗です。 案と取り決めが食い違うと、モデルは「120万円ではなく80万円にすれば取り決めに合います」と額を直そうとします。額を直すのは財務の担当で、AIには食い違いの事実と根拠だけを書かせます。
指示内容を固定する
あなたは財務部で、資金の振替の案を口座ごとの取り決めに照らして
点検する担当です。渡された「振替の案」「口座ごとの見込み」
「取り決め」「支払の予定の備考」だけを根拠にしてください。
【判定すること】
1. proposals:振替の案の1本ずつについて、verdict を
ok / conflict / needs_info のいずれかにする。
- ok:取り決めと備考に食い違いが無い
- conflict:取り決めの文面と食い違う
- needs_info:判定に要る情報が足りない(金額未確定、日付の不明など)
2. reason:判定の理由を2文以内で書く。
3. evidence:根拠にした取り決めの番号と文面、または備考の文を、そのまま写す。
4. account_notes:案に含まれない口座でも、取り決めから気をつけることがあれば書く。
【厳守事項】
- 振替の額を変えたり、別の額を提案したりしないでください。
- 新しい振替の案を作らないでください。
- 取り決めに書かれていないことを、推測で補わないでください。
- 銀行との契約や借入の契約の中身を推測しないでください。
取り決めの表に書かれた範囲だけを根拠にしてください。
- 取り決めの書いた日付が古く、いまの支払の予定と合わないと思われる場合は、
needs_info にし、reason にその旨を書いてください。
- 承認してよい、実行してよいとは書かないでください。
【基準日】{as_of}
【振替の案】{proposals}
【口座ごとの見込み(10営業日)】{forecast}
【取り決め】{rules_text}
【支払の予定の備考(未確定の印付き)】{payment_notes}
「額を変えない」を最初の厳守事項にしているのは、前の表の1行目のためです。 何も言わなければ、モデルは食い違いを見つけると親切に額を直します。直された額は誰も検算していない数字です。
取り決めの日付が古い場合を needs_info にするのは、担当者が替わって取り決めが残ったままのことがあるからです。 3年前の担当者のメモに従って資金を動かすより、いまの担当が取り決めを書き直すほうが先です。
指示は、Interactions API の system_instruction に置きます。 公式のページでは、system_instruction はその Interaction だけに効くとされているので、呼ぶたびに同じ指示を渡します。 取り決めや備考は入力の側に置き、指示と分けます。
出力形式を固定する
次の形のJSONで受け取ります。
{
"as_of": "2026-11-03",
"proposals": [
{
"proposal_id": "P-01",
"verdict": "ok | conflict | needs_info",
"reason": "",
"evidence": [
{ "source": "rule | payment_note", "ref": "R-07", "quote": "" }
]
}
],
"account_notes": [
{ "account_id": "", "note": "", "ref": "" }
]
}
1つ目の理由は、規則の層と判定の層を分けられることです。 振替の案の表には、規則が書いた額・振替の元・振替の先の列と、AIが書いた verdict・reason・evidence の列が並びます。AIの出力に額の欄が無いので、AIが額を変える余地がありません。
2つ目の理由は、スキーマで判定の値を縛れることです。 verdict を enum にしておけば、3つ以外の値は返りません。公式のページでは、enum・required・minItems・maxItems が使える一方、minLength・maxLength はエラーにならずに外されるとされています。reason の長さはスキーマで縛れないので、受け取ったあとに Apps Script で字数を数え、長すぎれば確認の印を付けます。
3つ目は、evidence の ref で取り決めの表に戻れることです。 財務の担当は、conflict の案を見たときに取り決めの番号から原文を開き、AIの読み方が正しいかを数秒で確かめられます。
振替の案の表は、次の形に並べます。
| 列 | 出どころ |
|---|---|
| 案の番号、振替の元、振替の先、額、予定日 | 規則(Apps Script) |
| 振替の元・先の見込みの最低額と最低残高 | 規則(Apps Script) |
| 判定、理由、根拠 | Gemini API |
| 担当の確認、直した額、部長の承認、実行の記録 | 人 |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| ドライブの取り込みのフォルダ | DriveApp | 残高のCSVを読む。読んだファイルは日付のフォルダへ移す |
| スプレッドシートの各表 | SpreadsheetApp | 残高・支払の予定・設定・取り決めを読み、案と判定を書く |
| Gemini API | UrlFetchApp で Interactions API を呼ぶ | 案ごとの判定と根拠 |
| 通知 | メールまたはチャット | 案がそろったこと、CSVが足りない口座 |
Gemini API の呼び出しは、muteHttpExceptions を有効にして、応答の番号を見ます。 公式のページでは、muteHttpExceptions を有効にすると失敗の応答でも例外を投げないとされています。エラーのときは案を判定なしで表に書き、「判定なし」の印を付けて知らせます。 判定が無くても、規則の案は財務の担当が従来どおり確かめられます。
インターネットバンキングにも会計の仕組みにも書き込みません。 この構成が書くのはスプレッドシートの案の表だけで、振替の実行と会計への計上は人の手で、従来の手順のまま行います。
人が確認する
財務の担当が見るのは、conflict と needs_info の案と、account_notes です。 ok の案は一覧で流し見ます。
- CSVの取り込みの漏れを先に見る … 足りない口座があれば、その日の案は出ていません
conflictの根拠を開く … 取り決めの原文を読み、AIの読み方が正しければ額を直すか案を外します。正しくなければ、取り決めの文面を直す候補として記録しますneeds_infoの情報を埋める … 未確定の支払の額を経理に確かめ、支払の予定の表を直して、もう一度処理を呼びますaccount_notesを読む … 案に出ていない口座の注意を見て、必要なら手で案を足します- 財務部長に承認を依頼する … 直した額と理由を表に残したまま依頼します
2番目でAIの判定に従って額を直すときも、直すのは人です。 直した額は表の「直した額」の列に書き、規則が出した額を上書きしません。 後から、規則の額とAIの判定と人の判断を並べて振り返れるようにします。
例外に対処する
| 起きること | 対応 |
|---|---|
| 一部の口座のCSVが無い | その日の案を作らず、足りない口座を知らせる |
| CSVの基準の日時が古い | その口座を取り込まず知らせる |
| CSVの形式が変わった | 銀行ごとの形式の表と合わなければ取り込まず知らせる。推測で列を読まない |
| 残高の検算で大きな差が出る | 印を付けて案は作る。財務の担当が明細を確かめる |
| 余りのある口座が無く、不足が埋まらない | 不足の口座と額だけを出し、借入の枠や定期預金の扱いは財務の担当が決める |
| Gemini API が応答しない・エラー | 案を「判定なし」で表に書き、知らせる |
| 応答がスキーマに合わない | 1回だけ呼び直し、だめなら「判定なし」にする |
| 実行の時間に間に合わない | 実行の締めの時刻を表に持ち、その時刻を過ぎた案に印を付ける |
1行目で一部の口座だけで案を作らないのは、第7章のトリガーのとおりです。 足りない1口座が、ちょうど不足の口座だったときに、その日の判断がまるごと外れます。
公式のページでは、スクリプトの1回の実行は6分までとされています。 15口座と10営業日の計算に、1回の API の呼び出しを足すだけなので、この時間に収まります。口座が増えて時間がかかるようになったら、残高の取り込みと案の作成を別の実行に分けます。
記録を残す
- 取り込んだCSVのファイルと、取り込んだ日時・基準の日時
- 日ごとの残高の見込みと、計算に使った口座の設定の表の版
- 規則が作った振替の案と、AIに渡した内容・返した JSON の全文
- 財務の担当が額を直した記録 … どの案を、いくらからいくらに、なぜ
- 財務部長の承認の日時と、実行した担当・実行の日時
- 取り決めの表を直した記録(誰が、いつ、どの文面を)
4つ目と6つ目は、取り決めを育てる材料になります。 同じ口座で同じ直しが続くなら、その口座の最低残高の数値か、取り決めの文面が実態に合っていません。 数値なら設定の表を、文面なら取り決めの表を直します。
04実装レベルの3段階
本記事の想定は半自動化で、1件15分が6分になります。 残るのは、CSVの書き出しと置き場への保存、conflict と needs_info の確認、承認の依頼です。 本格構成の銀行とのデータの接続は、銀行ごとの提供の形に応じた個別実装になります。 半自動化で CSV の書き出しが手間の中心だと分かってから、取引の多い銀行から順につなぐのが順当です。
05工数削減シミュレーション
導入後 120件 × 6分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 取引のある銀行が5行以上あり、売上の入金口座・支払の引落口座・借入の返済口座・給与の口座が銀行ごとに分かれている製造業・商社など。週に1〜2回、財務の担当が各行の残高を集めて表にまとめ、どの口座からどの口座へいくら移すかを決めている場合。銀行との約束や借入の条件など、口座ごとの取り決めが担当者の頭の中やメモにある場合。Google Workspace を使える場合。
- 取引銀行が1〜2行で、口座間の振替がほとんど無い場合。グループの資金を一括で管理するキャッシュマネジメントの仕組みで、口座間の資金の集中と配分がすでに自動で行われている場合。振替の実行そのものを自動にしたい場合は、この構成では扱いません(案と判定までです)。
07最小構成で試す方法
- 過去2か月分の振替の依頼書から、16回分を選ぶ(うち数回は、担当者が規則と違う判断をした回を入れる)
- その回の残高と支払の予定を再現し、口座の設定の表と取り決めの表を作る
- 規則で振替の案を作り、当時の依頼書と並べる
- Gemini の画面に、案・取り決め・備考を貼り、「案ごとに、取り決めと食い違うか、情報が足りないかを判定し、根拠の文を写してください。額を変えないでください」と指示する
- 判定を、当時の担当者が規則と違う判断をした理由と突き合わせる
16回は必ずやってください。 スクリプトを組む前に、「担当者の判断の理由が、取り決めの表に書けるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
担当者が額を変えた回で conflict が出た | スクリプトの組み立てに進む |
| 額を直した案を書いた | 指示の書き方で直る。構成は有効 |
| 担当者の判断の理由が、取り決めのどこにも書かれていない | 取り決めの表が先。 AIの問題ではない |
3行目が出ることは珍しくありません。 失敗ではなく、判断が担当者の頭の中にあったことが確かめられたということです。 当時の担当者に理由を聞き、取り決めの表に1行ずつ足してから、同じ16回でもう一度試します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIが額を直した案を書く | 出力のスキーマに額の欄を置かず、指示に明記する |
| 一部の口座だけで案を作る | CSVが1本でも欠けたら、その日の案を作らない |
| 古いCSVで見込みを作る | 基準の日時を取り、当日の朝より前なら取り込まない |
| CSVの列の位置が変わる | 銀行ごとの形式の表と合わなければ止める。推測で読まない |
| 未確定の支払が見込みから漏れる | 仮の額と未確定の印を入れ、needs_info に回す |
| 休日の支払の寄せ方を間違える | 支払の種類ごとに前寄せか後ろ寄せかを持つ |
store を既定のまま呼ぶ | store=false を付ける。既定では保存される |
maxLength で長さを縛ったつもりになる | エラーにならずに外されるので、受け取ったあとに数える |
| 取り決めが古いまま残る | 書いた人と日付を持ち、古いものは needs_info に回す |
| 承認した人が実行もする | 案を作る人、承認する人、実行する人を分ける |
上の2行が、この構成の失敗のほとんどです。 どちらも、資金を動かす数字が、検算されないまま案に入るところから起きます。額は規則、判定はAI、決定は人、という分け方を守れるかで、運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 口座の残高、口座番号の下4桁、取引銀行、支払の予定(相手先と金額)、借入の返済の予定、銀行との取り決めです。会社の資金の状態そのものです。
- API に保存させない … 公式のページのとおり、Interactions API は既定で保存します。
store=falseを付け、呼び出しの設定をコードの先頭で固定します - AIに渡す範囲を絞る … 口座番号は渡さず、口座の識別子(「A行 入金口座」など)で渡します。支払の予定の相手先の名前も、判定に要らなければ渡しません
- APIのキーをシートに置かない … スクリプトのプロパティに置き、スプレッドシートの共有から切り離します
- 職務を分ける … 案を作る人、承認する人、実行する人を別にし、インターネットバンキングの振替の権限を案の作成者に持たせません
- 預金の置き方の目安は社内で決める … 預金保険機構のページでは、当座預金や利息のつかない普通預金などの決済用預金は全額保護され、利息のつく普通預金や定期預金などの一般預金等は1金融機関ごとに合算して元本1,000万円までと利息等が保護されるとされています。上限の目安をどう置くかは、この仕組みを踏まえて社内で決め、AIに決めさせません
- スプレッドシートの共有を絞る … 閲覧と編集は財務部に限り、取り決めの表の編集は財務部長と担当に限ります
誤りが起きた場合のリスクは、引落の口座の残高が足りなくなることと、検算されていない額で資金を動かすことの2つです。 前者は未確定の支払を needs_info に回す規則とCSVの欠けで止める規則で、後者は額を規則だけで決める設計で守ります。
10まず何から始めるか
1週目:口座の設定の表と取り決めの表を作る
15本の口座の役割、最低残高、上限の目安を設定の表に書きます。担当者に聞き取り、頭の中にある取り決めを1行ずつ文面にします。 書いた人と日付を付けます。
2週目:16回分で試す
過去の振替の依頼書から16回分を選び、規則の案とAIの判定を作って、当時の判断と並べます。担当者が規則と違う判断をした回に、conflict が出るかを最優先で見ます。
3週目:CSVの取り込みを作る
銀行ごとの形式の表を作り、取り込みのフォルダのCSVを残高の表に書き込むところまでを Apps Script で組みます。この時点では、手で写した残高と取り込んだ残高を並べ、全口座で一致するかを確かめます。
4週目:見込みと案と判定をつなぐ
支払の予定の集計、見込みの計算、規則の案、Gemini API の判定までをつなぎます。財務の担当は従来どおり依頼書を作り、案の表と比べます。
2か月目: 案の表を振替の依頼書として使い始め、財務部長の承認を表の上で行います。3か月目以降: 1件15分が何分になったかを実測します。担当者が休んだ回でも、もう1人が同じ根拠で案を承認に回せた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導のトリガーが指定した時間帯の中で実行の時刻が決まること。インストール型トリガーが作成者のアカウントで動くこと | Google: Installable Triggers | 2026-10-27 |
| スクリプトの1回の実行が6分までであること | Google: Quotas for Google Services | 2026-10-27 |
Utilities.parseCsv が CSV の文字列を2次元の配列にし、区切りの文字を指定できること | Google: Class Utilities | 2026-10-27 |
UrlFetchApp.fetch の method・contentType・headers・payload と、muteHttpExceptions で失敗の応答でも例外を投げないこと | Google: Class UrlFetchApp | 2026-10-27 |
構造化出力が /v1beta/interactions の response_format(mime_type を application/json、スキーマ)で指定されること。enum・minItems・maxItems などが使え、minLength・maxLength はエラーにならずに外されること | Google AI for Developers: Structured output | 2026-10-27 |
Interactions API が既定で保存し(store=true)、有料の層で55日・無料の層で1日保持すること。store=false を選べること。system_instruction がその Interaction だけに効くこと | Google AI for Developers: Interactions | 2026-10-27 |
| 決済用預金(当座預金・利息のつかない普通預金など)が全額保護され、一般預金等は1金融機関ごとに合算して元本1,000万円までと利息等が保護されること | 預金保険機構: 保護の範囲 | 2026-10-27 |
預金の置き方の目安や口座ごとの最低残高は、自社の資金管理の規程と財務部長の判断で決めてください。 本記事は公開仕様と公的機関のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2061)についてのご相談はこちらから。
