更新の時期が来る定期契約を毎月洗い出して、案内と条件変更の説明文を作る
契約台帳を入力に、更新の時期が来た契約を毎月抜き出し、その契約の利用実績と条件変更を踏まえた更新案内の下書きを作ります。担当者の作業は、一件ずつ文面を書くことから、出てきた下書きを読んで直すことに変わります。
- 利用ツール
- ChatGPT/Claude/Gemini/Google Apps Script/Make/Power Automate
- 対象業界
- IT・SaaS/不動産/介護/保険/建設
- 対象部門
- カスタマーサポート/営業
- 対象業務
- 台帳・マスタ管理/書類作成
- 主な課題
- 人手が足りない/営業フォローが追いつかない/期限・対応漏れが起きる
- AIで行う処理
- 生成
- 主な効果
- 対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- SaaS追加(小)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 月初に、担当者がそれぞれ契約台帳を開く
- 更新日で並べ替え、2か月以内に更新日が来る契約を目で拾う
- 自分の担当分を抜き出す
- 契約条件(期間、金額、自動更新か申込更新か、予告期間)を確認する
- 保守の管理システムを開き、その契約の出動履歴と対応内容を調べる
- 過去のメールを検索して、前回どう案内したか、途中で何か揉めていないかを見る
- 価格改定の対象なら、社内の説明文を探して該当部分を引く
- 案内のメールを書く(挨拶、契約の特定、更新後の条件、改定の説明、手続きと期限)
- 上長または担当営業に確認してもらい、送信する
- 送信したことを台帳に記録する(記録されないことも多い)
- 自動毎月1日、時刻主導トリガーでスクリプトが動く
- 自動契約台帳から、更新日が2か月以内の行を抽出する
- 自動各契約の条件(期間、金額、自動更新か申込更新か、予告期間)を読む
- 自動保守の管理システムから、その契約の出動回数・対応内容・稼働率を取る
- 自動前回の案内の履歴と、価格改定の対象かどうかを突き合わせる
- 自動価格改定の有無で分岐し、該当する説明文の型を選ぶ
- 自動契約ごとに案内文の下書きを作る(件名と本文、使った数値の一覧つき)
- 自動担当者の Gmail の下書きとして保存する
- 人担当者が下書きを読み、数値の出どころを確かめて直す
- 人担当者が送信する
- 自動送信した記録を台帳に書き戻す
各工程の詳しい説明を読む
- 月初に、担当者がそれぞれ契約台帳を開く
- 更新日で並べ替え、2か月以内に更新日が来る契約を目で拾う
- 自分の担当分を抜き出す
- 契約条件(期間、金額、自動更新か申込更新か、予告期間)を確認する
- 保守の管理システムを開き、その契約の出動履歴と対応内容を調べる
- 過去のメールを検索して、前回どう案内したか、途中で何か揉めていないかを見る
- 価格改定の対象なら、社内の説明文を探して該当部分を引く
- 案内のメールを書く(挨拶、契約の特定、更新後の条件、改定の説明、手続きと期限)
- 上長または担当営業に確認してもらい、送信する
- 送信したことを台帳に記録する(記録されないことも多い)
問題は4つあります。
(a)連絡が遅れると、選べなくなる。 解約の申し出に予告期間がある契約では、その期間を過ぎた時点で今期の更新が確定します。月初の洗い出しが1回抜けるだけで、その月の契約は全部その状態になります。
(b)値上げの説明が定型文だと解約される。 価格改定の案内は、社内の説明文をそのまま貼って送られがちです。理由が一般論なので、顧客には金額の変化しか残りません。 実際にどれだけ使ったかを添えるには保守の管理システムを開いて数える必要があり、120件分となると誰もやりません。
(c)一件ずつ書くと終わらない。 1件26分で月120件、4名で分けても月52.0時間です。月初の1週間がこれで埋まり、新規の商談が動いている月は更新の連絡が後ろに送られます。
(d)「今月の分」が誰の手元にあるか分からない。 各自が台帳を見て自分の分を拾う方式なので、拾い漏れたことに本人も周囲も気づきません。「今月120件のうち何件が連絡済みか」を答えられる人がいない状態です。
- 【自動】 毎月1日、時刻主導トリガーでスクリプトが動く
- 【自動】 契約台帳から、更新日が2か月以内の行を抽出する
- 【自動】 各契約の条件(期間、金額、自動更新か申込更新か、予告期間)を読む
- 【自動】 保守の管理システムから、その契約の出動回数・対応内容・稼働率を取る
- 【自動】 前回の案内の履歴と、価格改定の対象かどうかを突き合わせる
- 【自動】 価格改定の有無で分岐し、該当する説明文の型を選ぶ
- 【自動】 契約ごとに案内文の下書きを作る(件名と本文、使った数値の一覧つき)
- 【自動】 担当者の Gmail の下書きとして保存する
- 【人】 担当者が下書きを読み、数値の出どころを確かめて直す
- 【人】 担当者が送信する
- 【自動】 送信した記録を台帳に書き戻す
自動化されるのは「拾う」「集める」「選ぶ」「書く」の4つで、残るのは「確認」と「送信」です。
9番目と10番目を自動化しないことが、この設計の中心です。 更新の案内は相手との関係に直接ひびく連絡で、文面が一言ずれただけで値上げの通告に読めます。 送信は必ず人が行います。
同時に、11番目が(d)の問題を解きます。 下書きを作った時点で「今月の対象は120件」が確定し、送信の記録が台帳に戻ることで「何件が連絡済みか」が誰にでも見えます。
02今回想定するシステム構成
契約台帳(Google スプレッドシート) │ ▼【トリガー】毎月1日の時刻主導トリガー │ 更新日が2か月以内の行を抽出 │ ├──▶ 契約条件の読み取り(期間・金額・更新方式・予告期間) │ ├──▶ 保守の管理システムから利用実績を取得 │ ├──▶ 前回の案内の履歴を参照 │ ▼ 価格改定の有無で分岐 │ ├──▶ 改定なし ──▶ 更新案内の下書き │ └──▶ 改定あり ──▶ 更新案内 + 改定の説明の下書き │ ▼ Gmail の下書きとして保存 │ ▼ 【担当者が読んで直す】 │ ▼ 担当者が送信 ──▶ 送信した記録を台帳に書き戻す
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make |
| 生成AI | Gemini API(案内文と条件変更の説明の下書き) | Claude API、OpenAI API |
契約台帳は Google スプレッドシート、連絡先は Gmail、保守の実績は別の管理システムから取ります。これらはすでに業務で使っているもので、この構成で足すのは実行環境と生成AIの2つだけです。
この構成の土台は、Apps Script のインストール可能なトリガーと、Gmail の下書き作成です。
インストール可能なトリガーは、シンプルトリガーと考え方は似ていますが、承認が必要なサービスを呼び出せる点が違います。 対応するイベントの種類も多く、時刻主導トリガーが使えます。プログラムから制御でき、シンプルトリガーと違って読み取り専用モードでは実行されません。 トリガーは、それを作ったユーザーのアカウントで実行されます。
時刻主導トリガーは、毎分から月1回までの頻度で作れます。 この構成では月1回、毎月1日に動かします。ただし実行の時刻は若干ランダム化されることがあるので、「毎月1日の朝9時ちょうど」を前提にした設計にはしないでください。
もう一方の土台が、Gmail の下書き作成です。createDraft(recipient, subject, body) は下書き(GmailDraft)を返します。 引数は受信者(コンマ区切りのメールアドレス)、件名、本文で、オプションを加えた形も同じく下書きを返します。sendEmail が実際にメールを送信するのに対し、createDraft は下書きを作るだけです。
この構成では createDraft を使い、sendEmail を使いません。 更新案内は相手との関係に直接ひびく連絡なので、送信のボタンは人が押します。 機械が作るのは下書きまでにします。
下書きのサイズには、ヘッダーを含み添付ファイルを除く形で制限があります。また1日あたりの割り当ての上限があり、具体的な数値は別の案内(quotas)にまとめられています。120件を1日でまとめて作るなら、分割実行を前提に組んでください。
03どうやって実装するのか
処理の起点を決める
毎月1日の時刻主導トリガーを起点にします。 月初に対象を確定させ、その月の連絡をまとめて始める形です。
トリガーはプログラムから作れます。ScriptApp.newTrigger がトリガービルダーを返し、そこに条件をつないで create() します。
ScriptApp.newTrigger("myFunction").timeBased().everyHours(6).create();
ScriptApp.newTrigger("myFunction").forSpreadsheet(ss).onOpen().create();
時刻主導トリガーは毎分から月1回までの頻度を指定できるので、月単位の頻度を同じ形で組み立てます。 前述のとおり実行時刻は若干ランダム化されることがあるため、「1日の何時に動いたか」を前提にした処理を書かないでください。
トリガーが失敗したときは、失敗を知らせるメールが届きます。 送信元は [email protected] で、メールにはトリガーを無効にするリンクと、スクリプトを編集して不具合を直すためのリンクが含まれます。トリガーがアクティブな間は、この通知の頻度を調整できます。
ただし、気づく仕組みを通知メールだけに頼らないでください。 月1回しか動かない処理は、1回止まると1か月分の連絡が丸ごと抜けます。下書きが0件だった月を検知する処理を、別に入れてください。
インストール可能なトリガーには承認が必要です。 スプレッドシート、Gmail、外部への通信を使うため、設定した人のアカウントで承認を済ませておきます。承認した人のアカウントで実行されるので、退職や異動で止まります。 個人ではなく、運用用のアカウントで設定してください。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 契約の基本情報 | 契約番号、顧客名、担当者、対象機器、台数 | 契約台帳(スプレッドシート) |
| 契約条件 | 契約期間、更新日、金額、自動更新か申込更新か、予告期間 | 契約台帳 |
| 更新後の条件 | 新しい期間、新しい金額、改定の有無と改定額 | 契約台帳と価格表 |
| 利用実績 | 保守の出動回数、対応した内容、稼働率 | 保守の管理システム |
| 前回の案内の履歴 | 前回いつ、どの条件で案内し、どう返答されたか | 台帳の履歴列 |
| 改定の説明の型 | 全社で決めた価格改定の背景の説明文(数種類) | 社内の説明文の型 |
| 送信先 | 宛先のメールアドレス、宛名、敬称 | 契約台帳 |
この構成の質を決めるのは、契約台帳の列の整備です。 更新日と金額だけでは足りず、予告期間、更新方式、前回の案内日を列として持つことが前提になります。
改定の説明の型も、先に用意する必要があります。 「原材料費の上昇」「保守体制の拡充」「サービス範囲の変更」のように、全社で認めた説明を数種類そろえ、どの契約にどれを当てるかを決めておきます。 ここをAIに書かせると、会社として言っていない理由が文面に出ます。
データの取得方法を決める
契約台帳: Apps Script からスプレッドシートを直接読み、更新日が当月1日から2か月後までの範囲にある行を抽出します。「2か月以内」にするのは、予告期間の長い契約に間に合わせるためです。 予告期間が60日の契約があるなら、それより早く連絡を始める必要があります。
利用実績: 保守の管理システムに契約番号で照会します。APIがあればそこから、無ければ月次のCSV出力を取り込んで突き合わせます。後者でかまいません。 月1回しか動かない処理なので、リアルタイム性は不要です。
前回の案内の履歴: 台帳の履歴列から読みます。Gmail を検索して過去のやり取りを探す方式にはしません。 検索条件が担当者ごとに違い、結果が安定しないためです。送信の記録を台帳に書き戻しておけば、翌年は履歴列だけで足ります。
価格表と説明文の型: スプレッドシートの別シートに置きます。担当者が中身を見て直せることが重要なので、スクリプトの中に書き込まないでください。
AIへ渡す前に整形する
- 対象の絞り込み … 更新日が2か月以内でも、すでに解約の申し出を受けている契約、今期で終了が決まっている契約は台帳の状態列で除きます
- 予告期間からの逆算 … 更新日から予告期間を引いた日を「連絡の期限」として計算します。この日を過ぎている契約は、下書きの先頭に警告を付けて上に出します
- 改定の判定 … 価格表と現在の金額を突き合わせ、改定の有無と改定額、改定率を機械で計算します。この計算はAIにさせません
- 利用実績の集計 … 出動回数と対応内容を契約期間に合わせて集計します。期間の切り方で数が変わるので、ここも機械で計算します
- 担当者の割り当て … 台帳の担当者列から、下書きを入れるアカウントを決めます。空欄の契約はカスタマーサポートの共通アカウントに寄せます
- 要注意の印 … 直近に苦情の記録がある契約、改定率が一定以上の契約に印を付けます。下書きを作る前に付け、確認の順番を決めるのに使います
AIに処理させる
AIにさせるのは、そろえた材料を案内文の日本語にすることだけです。 数を数えることも、金額を計算することも、更新の可否を判断することもさせません。
案内文に入れる要素と、その出どころは次のとおりです。
| 要素 | 中身 | 出どころ |
|---|---|---|
| 契約の特定 | 契約番号、対象機器、期間 | 台帳 |
| 更新後の条件 | 期間、金額、改定の有無と改定額 | 台帳と価格表 |
| 使ってもらえた事実 | 保守の出動回数、対応した内容、稼働率 | 保守の管理システム |
| 改定の理由 | 価格改定の背景(全社で決めた説明文から選ぶ) | 社内の説明文の型 |
| 手続きと期限 | いつまでに何をすればよいか | 契約条項 |
3行目の「使ってもらえた事実」を入れることが、この構成の中心です。 同じ改定率でも、「この1年で8回お伺いし、うち3回は当日中に復旧しました」が添えてあるかどうかで受け取られ方が変わります。値上げの案内を、取引の振り返りに変えるのがねらいです。
ただし、この数値をAIに作らせてはいけません。 システムから取った値をそのまま渡し、プロンプトで「渡した数値以外の数を書かない」と縛ります。 ここが崩れると、顧客に誤った実績を送る仕組みになります。
AIに任せるのは次の範囲です。
| 処理 | 内容 |
|---|---|
| 文面の組み立て | 渡した要素を、読みやすい順番と言い回しでつなぐ |
| 相手に合わせた調子 | 契約の規模と付き合いの長さに合わせて、丁寧さの度合いを変える |
| 改定の説明の当てはめ | 選ばれた説明文の型を、その契約の状況に合わせて文章にする |
| 件名の作成 | 契約と用件が一目で分かる件名にする |
| 要注意の申し送り | 人が先に読むべき理由を書き出す |
指示内容を固定する
あなたは保守契約の更新案内を作る担当者を支援する立場です。
渡す契約情報と利用実績をもとに、更新案内のメールの下書きを作ってください。
このメールは担当者が読んで直したうえで、担当者自身が送信します。
【厳守事項】
- 渡した数値以外の数を、本文に書かないでください。
出動回数、稼働率、金額、改定額、期間は、渡した値をそのまま使ってください。
四捨五入も、単位の変換も、概算への言い換えもしないでください。
- 渡した情報に記載がない項目は、不明として扱ってください。
「おそらくこうだろう」という補いをしないでください。
文面に必要だが情報が足りない場合は、本文に書かず
needs_human_attention の理由に「〇〇の情報が不足」と書いてください。
- 価格改定の理由は、渡した説明文の型に書かれている内容だけを使ってください。
型にない理由(他社の動向、今後の見通しなど)を足さないでください。
- 更新するかどうか、解約されそうかどうかの判断を書かないでください。
「ぜひご継続ください」のような要請も入れないでください。
- 解約の手続きや期限について、渡した契約条項に書かれていない条件を書かないでください。
- 本文で使った数値は、すべて facts_used に
「項目名・使った値・出どころ」の形で列挙してください。
本文に出てくる数値と facts_used の数が一致しない状態にしないでください。
- 謝罪、値引きの示唆、次回の条件の約束を書かないでください。
【契約情報】
{contract}
【更新後の条件と改定の有無】
{renewal_terms}
【利用実績(保守の管理システムの値)】
{usage_facts}
【価格改定の説明文の型】
{price_change_template}
【前回の案内の履歴】
{previous_notice}
【要注意の印】
{attention_flags}
「渡した数値以外の数を書かない」が、いちばん効く制約です。 実績の数字は顧客が自分で分かっていることなので、ずれると即座に信用を失います。 「8回」が「10回程度」と言い換えられるだけで、案内の意味が反転します。
「更新するかどうかの判断を書かない」も必要です。 「ぜひご継続ください」のような要請が入ると、条件の連絡が営業の働きかけに変わります。継続のお願いをするかどうかは、担当者が顧客との関係を見て決めることです。
出力形式を固定する
{
"contract_id": "",
"renewal_type": "same_terms | price_change | terms_change | non_renewal_candidate",
"subject": "",
"body": "",
"facts_used": [
{ "item": "", "value": "", "source": "" }
],
"needs_human_attention": { "flag": false, "reason": "" }
}
文面をそのまま返させず、構造化した形にする理由は2つあります。
1つ目は、確認を速くするためです。 facts_used に「本文で使った数値と、その出どころ」を列挙させると、担当者は本文を読みながら、その数字が台帳のどの値かを1秒で照合できます。 本文だけを渡されると、数字ごとに元のシステムを開くことになり、確認の時間が元の8分に戻ります。
2つ目は、下書きを仕分けるためです。 renewal_type があると、改定ありの契約だけを先に確認する順番が付けられます。needs_human_attention が真の下書きは、上長が先に読む運用にできます。
renewal_type の non_renewal_candidate は、「更新しない見込み」とAIが判断した印ではありません。 台帳の状態と要注意の印から機械で付けた値で、担当者が先に目を通すべき契約を上に出すためのものです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 契約台帳(スプレッドシート) | Apps Script の標準機能 | 対象の抽出、送信記録の書き戻し |
| 保守の管理システム | APIまたはCSVの取り込み | 利用実績の取得 |
| 生成AIサービス | API | 案内文と改定の説明の下書き作成 |
| Gmail | createDraft | 担当者の下書きとして保存 |
| 価格表・説明文の型 | スプレッドシートの参照 | 改定額と説明文の取得 |
Gmail への書き出しは createDraft までです。 sendEmail は使いません。下書きに入れておけば、担当者は普段どおりの画面で直して送れます。 専用の確認画面を作らずに済むのが、この方式の利点です。
書き戻しは台帳への送信記録だけにします。 基幹システムや会計システムへの反映はこの構成の範囲外で、更新が確定したあとの処理はこれまでどおりの手順で行います。
人が確認する
全件、人が確認します。確認せずに送る設計にしません。
確認の順番を、次のように決めます。
- 連絡の期限を過ぎている契約(予告期間からの逆算で判定したもの)
needs_human_attentionが真の契約renewal_typeがprice_changeの契約- それ以外
確認の作業は3つです。
facts_usedの数値が、台帳とシステムの値と合っているかを見る(本文の数字を1つずつ追わない)- 改定の説明が、会社として言ってよい内容になっているかを見る
- その顧客との関係を踏まえて、言い回しを直す
3つ目は機械にできません。前回揉めた顧客、担当者が代わったばかりの顧客では、同じ文面が違う意味になります。 ここに時間を使えるようにするのが、この構成の目的です。
確認にかかる時間の目標は、1件8分(確認5分+修正3分)です。 それ以上かかるなら、facts_used の粒度が粗いか、説明文の型が足りていません。
例外に対処する
| 起きること | 対応 |
|---|---|
| トリガーが動かなかった | 失敗の通知メールが届く。加えて、下書きが0件の月を検知して担当者に知らせる処理を別に入れる |
| 保守の管理システムから実績が取れない | 実績なしとして、その要素を含めない下書きを作る。空欄を埋めるために推測の数を書かせない |
| 契約台帳に更新日が入っていない | 抽出の対象外になるため、更新日が空欄の行を毎月一覧にして担当者に知らせる |
| 予告期間の列が空欄 | 既定値を当てず、要注意として印を付ける。契約条項の確認を人に促す |
| 連絡の期限をすでに過ぎている | 下書きの先頭に警告を入れ、確認の一番上に出す。上長に別途通知する |
| 価格表に該当する機種がない | 改定額を計算できないので、改定なしの文面にせず下書きを作らずに担当者へ知らせる |
| 改定率が大きい | needs_human_attention を真にし、上長が先に読む運用にする |
| 直近に苦情の記録がある | 同上。定型の案内を先に送らない |
| 宛先のメールアドレスが古い | 下書きは作るが、担当者に宛先の確認を促す印を付ける |
| 同じ契約の下書きが二重にできた | 台帳に「下書き作成日」の列を持ち、当月に作成済みの契約を除外する |
| 件数が多く、割り当ての上限に触れる | 分割実行を前提に組む。 担当者ごと、更新日の週ごとに分けて動かす |
| AIの応答が JSON として読めない | 再実行し、それでも読めなければその契約を未処理として残す。壊れた文面を下書きにしない |
facts_used に無い数値が本文にある | 機械で突き合わせて検知し、その下書きを要確認として上に出す |
最後の行は仕組みで持ってください。 本文の数値を機械で拾い、facts_used の値と照合するだけの処理です。プロンプトの制約は必ずすり抜けるので、出力の側でも見ます。
記録を残す
- 抽出した対象契約の一覧(何件を対象にしたか、除外した契約とその理由)
- AIに渡した材料(契約情報、利用実績、説明文の型)
- AIが返した下書きと
facts_used - 人が直した箇所と、直した内容
- 送信した日時、宛先、送信した担当者
- 顧客からの返答(更新、条件の相談、解約の申し出)と、その日付
4つ目を残すと、この構成の弱点が見えます。 同じ種類の直しが毎月繰り返されているなら、プロンプトか説明文の型を直せます。「毎回、冒頭の挨拶を書き直している」なら、型のほうが業務に合っていません。
6つ目は、翌年のための記録です。 更新の結果を台帳に戻しておくと、次の年は「前回は条件の相談があった」という前提から案内を始められます。
04実装レベルの3段階
最小構成だけでも、26分が18分程度になります。 案内文を書く10分が短くなるためです。ただし材料を集める8分は残るので、120件をこなす負担はあまり変わりません。 半自動化で18分から9分程度になります。 材料集めが消え、下書きが担当者の Gmail に入った状態から始められるためです。この段階の効果がいちばん大きく、本記事が想定するのもここです。 本格構成では工数はそれほど変わりませんが、(d)の「今月の分が誰の手元にあるか分からない」が解けます。 月120件の規模では、この可視化の価値が工数削減と並びます。
05工数削減シミュレーション
導入後 120件 × 9分 ÷ 60 = 18 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 期間の決まった契約を数百件抱え、毎月100件前後の更新連絡が発生する企業。契約ごとに更新後の条件が違い、案内の文面を一件ずつ書き分けている場合。契約台帳がスプレッドシートにあり、Google Workspace を全社で使っていて、更新の連絡を営業とカスタマーサポートで分担している場合。
- 契約がすべて同一条件で、定型文の一斉送信で足りる場合。更新の連絡を基幹システムが自動で出していて、文面を書き分ける必要がない場合。契約台帳が無く、契約書のPDFしか手元にない場合。この場合は先に台帳を作る工程が必要で、本記事の構成はその後の話になります。
07最小構成で試す方法
- 今月更新が来る契約を、台帳から10件だけ手で抜き出す
- そのうち価格改定の対象を3件含める
- 保守の管理システムから、その10件の出動回数と対応内容を書き出す
- AIの画面に、契約条件・利用実績・改定の説明文の型を貼り付ける
- 「この情報から更新案内のメールの下書きを作ってください。渡した数値以外の数を書かないでください。使った数値は出どころとともに一覧にしてください」と指示する
- 出てきた下書きを、自分が書いた案内文と比べる
この10件は必ずやってください。 台帳の列が足りているかがここで分かります。多くの場合、予告期間か更新方式のどちらかが無く、そこで一度止まります。 それが分かることが、この段階の成果です。
判断の目安は次のとおりです。
| 下書きの状態 | 判断 |
|---|---|
| 手を入れずに送れる文面が半分以上 | 自動化する価値が大きい。トリガーと下書き保存まで作る |
| 内容は合っているが言い回しを直している | 説明文の型と例文を足す。構成そのものは有効 |
| 数値が合っていない、渡していない数が出る | プロンプトの制約を強め、出力の側でも突き合わせる |
| 材料がそろわない(実績が取れない) | 台帳と管理システムの整備が先。 AIの問題ではない |
4行目が出ることは珍しくありません。 これは失敗ではなく、必要な準備が何かが分かったということです。 台帳の列を整えるだけで、AIを入れる前に(d)の問題は小さくなります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 台帳に予告期間の列が無い | 既定値を当てず、契約条項から埋める。空欄のまま動かすと、連絡の期限を計算できない |
| 更新方式(自動更新か申込更新か)が分からない | 文面が変わるので必ず列として持つ。自動更新の契約ほど、連絡の遅れが取り返しにくい |
| 渡していない数値が本文に出る | プロンプトで縛り、出力の側でも facts_used と突き合わせて検知する |
| 改定の理由をAIが勝手に足す | 説明文の型に書かれた内容だけを使うよう縛る。型を先に用意する |
| 実績が取れない契約で下書きが薄くなる | 実績の要素を含めない文面にする。推測で埋めさせない |
| 下書きが二重にできる | 台帳に「下書き作成日」の列を持ち、当月作成済みを除外する |
| 割り当ての上限に触れる | 分割実行を前提に組む。 担当者ごと、更新日の週ごとに分ける |
| トリガーが止まったことに気づかない | 失敗の通知メールに加え、下書きが0件の月を検知する処理を別に入れる |
| 設定した人の異動でトリガーが止まる | 個人ではなく運用用のアカウントで承認する |
| 実行時刻が思ったとおりでない | 時刻主導トリガーの実行時刻は若干ランダム化される。時刻を前提にした処理を書かない |
| 担当者が下書きをそのまま送る | 確認の手順を決め、facts_used の照合を必須にする |
| 送信の記録が台帳に戻らない | 書き戻しを自動化する。手で記録する運用は必ず抜ける |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客名、契約番号、契約金額、保守の出動履歴、担当者の連絡先。取引条件と顧客の設備の稼働状況が含まれます。
- 送信は必ず人が行う …
createDraftで止める設計にします。更新案内は相手との関係に直接ひびく連絡で、条件の通知でもあります。 機械が送った文面が誤っていた場合、それが会社の意思表示として扱われます - 金額をAIに計算させない … 更新後の金額、改定額、改定率は台帳と価格表の値を機械で計算し、その結果をそのまま文面に差し込みます。 AIに計算させると、桁や単位が変わっても文章として自然に見え、確認で見落とされます
- 外部AIへ渡す範囲を決める … 顧客の利用実績は取引情報にあたります。契約番号と社名を伏せ、数値と条件だけを渡す設計にできます。 宛名と契約番号は下書きを組み立てる段階で機械が差し込むので、外部へ出るのは「どこの誰か分からない契約の条件と実績」だけになります
- 「更新しない見込み」の判断をAIにさせない …
non_renewal_candidateは台帳の状態と要注意の印から機械で付ける印であり、AIの推定ではありません。担当者に見せる材料までにとどめます - アクセス権限と学習利用 … 契約台帳には全社の取引条件が載るため、閲覧範囲を担当部門に限定し、下書きは担当者本人のアカウントにだけ入れます。入力を学習に使わないことが契約で保証されるサービスを選んでください
- ログの保持 … 送信した案内の内容と日時は、契約に関する記録として残す期間を決めます。認識の食い違いが起きたときに、何を送ったかを示せる必要があります
誤りが起きた場合のリスクは、誤った実績や金額を顧客に送ることです。 これは文章の品質の問題ではなく、数値をAIに触らせない設計と facts_used による照合を、運用に組み込めているかの問題です。
10まず何から始めるか
1週目:台帳の列を点検する
契約台帳に、更新日、予告期間、更新方式、現在の金額、担当者の5つが列としてあるかを見ます。無い列があれば、そこを埋める計画を立てます。 この段階でAIはまだ使いません。
2週目:10件で試す
今月更新が来る契約を10件(うち価格改定が3件)選び、材料を手で集めてAIに渡します。出てきた下書きを自分が書いた案内文と比べ、数値が正しいかを最優先で見ます。
3週目:改定の説明文の型を作る
価格改定の背景として、全社で言ってよい説明を数種類そろえます。「どの契約にどれを当てるか」の基準まで決めてください。 ここが決まっていないと、AIに書かせた瞬間に会社として言っていない理由が出ます。
4週目:トリガーと下書き保存を組む
毎月1日の時刻主導トリガーで台帳から抽出し、createDraft で担当者の下書きに入れるところまで作ります。運用用のアカウントで承認してください。 最初の月は担当者1名分から始めます。
2か月目: 4名全員に広げ、26分が何分になるかを実測します。人が直した箇所を必ず記録してください。 同じ種類の直しが繰り返されるなら、プロンプトか説明文の型で直せます。
3か月目以降: 送信記録の書き戻しと、未連絡の一覧を足します。「今月の対象のうち何件が連絡済みか」が見えた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
createDraft(recipient, subject, body) が下書き(GmailDraft)を返すこと。オプションを加えた createDraft(recipient, subject, body, options) も GmailDraft を返すこと。引数が受信者(コンマ区切りのメールアドレス)、件名、本文であること。下書きのサイズに、ヘッダーを含み添付ファイルを除く形で制限があること。sendEmail が実際にメールを送信するのに対し、createDraft は下書きを作ること。1日あたりの送信数・下書き作成数の具体的な制限値はこのページには記載がなく、割り当ての制限は別ページ(quotas)に案内されていること | Google Apps Script リファレンス: Class GmailApp | 2026-09-22 |
インストール可能なトリガーが、シンプルトリガーと考え方は似ているが、承認が必要なサービスを呼び出せること。対応するイベントの種類が多く、時刻主導トリガーが使えること。プログラムから制御でき、シンプルトリガーと違って読み取り専用モードでは実行されないこと。トリガーを作成したユーザーのアカウントで実行されること。ScriptApp.newTrigger がトリガービルダーを返し、timeBased().everyHours(6).create() のようにつないで作成できること。時刻主導トリガーが毎分から月1回までの頻度で実行できること。実行の時刻が若干ランダム化される場合があること。トリガーが失敗した場合に [email protected] から通知メールが届き、トリガーを無効にするリンクとスクリプトを編集するリンクが含まれること。トリガーがアクティブな間は、この通知の頻度を調整できること | Google Apps Script ガイド: Installable Triggers | 2026-09-22 |
1スクリプトあたりのトリガー数の上限と、1日あたりの下書き作成数の上限は、上記のページに具体的な数値の記載がないため本記事では触れていません。件数の多い運用を組む場合は、割り当てに関する公式の案内を実装前に確認してください。
契約の更新に関する予告期間や通知義務は、契約書の条項と、業種によっては関係法令の定めによります。この部分は自社の法務部門への確認が必要です。 本記事は契約上の通知義務の充足についての判断を代替するものではありません。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0161)についてのご相談はこちらから。
