Media > AI活用ユースケース > 法務 > 秘密保持契約ごとに、実際に開示した資料と返却・破棄の状況を台帳にする

秘密保持契約ごとに、実際に開示した資料と返却・破棄の状況を台帳にする

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

契約台帳にある有効な秘密保持契約から相手先のドメインを読み、そのドメイン宛ての送信メールと共有リンクの発行を集めます。開示の事実と渡した資料をAIに取り出させ、開示台帳の行の案と、返却・破棄を求めるべき先の一覧にします。誰に何を渡したかを人が探す作業が減ります。

サマリー
利用ツール
ChatGPT/Claude/Gemini/Google Apps Script/Make/Power Automate
対象業界
IT・SaaS/医療/商社/教育/製造
対象部門
法務/知財
対象業務
内容確認・チェック/台帳・マスタ管理
主な課題
引き継ぎができていない/情報が見つからない/期限・対応漏れが起きる
AIで行う処理
抽出
主な効果
属人化解消/工数削減/検索時間短縮
導入難易度
★★☆☆☆
実装レベル
半自動化
費用感
SaaS追加(小)
人間の確認
必須
現在工数
12h/月
AI導入後
4h/月
想定削減
67%
年間削減
96h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 相手先から「契約が終わったので開示資料を破棄したい」と連絡が入るか、契約の終了日が近いことに気づく
  2. 契約台帳でその相手先の契約を探し、契約番号・目的・有効期間・返還義務の有無を確認する
  3. 契約を担当した部署に「この契約で何を渡しましたか」とメールで問い合わせる
  4. 担当者が自分の送信済みメールを検索し、添付と共有リンクを思い出しながら書き出して返信する
  5. 担当者が異動・退職していれば別の人に聞き直す。分からなければ「たぶんこれだけ」で確定する
  6. 集まった内容を開示台帳に手で書き写す
  7. 返却または破棄の依頼文を作って相手に送り、回答を待つ
導入後(After)
  1. 自動毎日決まった時刻にスクリプトが動き、契約台帳から有効な秘密保持契約と、その相手先ドメイン・契約番号を読む
  2. 自動前日分について、そのドメイン宛ての送信メール(件名・本文・添付ファイル名)と、発行された共有リンクを集める
  3. 自動社内転送や自動送信のメールを落とし、署名と引用履歴を取り除く
  4. 自動生成AIに渡し、開示の有無・相手先と受領者・開示日・対象資料・媒体などを取り出させる
  5. 自動取り出した結果を、契約の目的・有効期間と突き合わせる
  6. 自動開示台帳の行の案と、期限が来た契約の返却・破棄の一覧を書き出す
  7. 担当者が、拾われた開示の記録を確認する(引用と照らして、開示の事実があったかを見る)
  8. 担当者が、自動で拾えなかった経路の開示を補って記入する
  9. 担当者が、目的の範囲外の疑いが立った行について、範囲内か範囲外かを判断する
  10. 返却・破棄の依頼文を確認し、自分の名前で送る
各工程の詳しい説明を読む
  1. 相手先から「契約が終わったので開示資料を破棄したい」と連絡が入るか、契約の終了日が近いことに気づく
  2. 契約台帳でその相手先の契約を探し、契約番号・目的・有効期間・返還義務の有無を確認する
  3. 契約を担当した部署に「この契約で何を渡しましたか」とメールで問い合わせる
  4. 担当者が自分の送信済みメールを検索し、添付と共有リンクを思い出しながら書き出して返信する
  5. 担当者が異動・退職していれば別の人に聞き直す。分からなければ「たぶんこれだけ」で確定する
  6. 集まった内容を開示台帳に手で書き写す
  7. 返却または破棄の依頼文を作って相手に送り、回答を待つ

(a)契約は法務が持ち、資料は現場が渡す。 2番目と3番目の間に部門の壁があります。法務の情報は「契約を結んだ」ところで止まっており、そこから先は現場の記憶に問い合わせるしかありません。 この問い合わせと回答待ちが、1件あたりでいちばん長い時間になります。

(b)返却・破棄は、求められてから思い出す。 1番目を見てください。起点が相手からの連絡になっています。 自社の契約が終わったことを先に把握して動いた件は、ほとんどありません。相手が几帳面な会社なら連絡が来ますが、来なければ渡した資料は先方に残ったままになります。

(c)担当者が異動すると分からなくなる。 記録が個人の送信済みメールにしかないため、その人がいなくなった時点で、探す手段そのものが消えます。 引き継ぎ資料に「あの案件で図面を渡した」と書く人はいません。本人にとっては日常のメールの1通だからです。

(d)目的外の資料が混ざる。 4番目で担当者が書き出すのは「その案件で渡した資料」で、契約の目的の範囲かどうかは見ていません。 書き出す人がそれを問題として認識しないので、範囲外の資料も他と並んで記録されます。いちばん見つけたいものなのに、いちばん見つからない仕組みです。

  1. 【自動】 毎日決まった時刻にスクリプトが動き、契約台帳から有効な秘密保持契約と、その相手先ドメイン・契約番号を読む
  2. 【自動】 前日分について、そのドメイン宛ての送信メール(件名・本文・添付ファイル名)と、発行された共有リンクを集める
  3. 【自動】 社内転送や自動送信のメールを落とし、署名と引用履歴を取り除く
  4. 【自動】 生成AIに渡し、開示の有無・相手先と受領者・開示日・対象資料・媒体などを取り出させる
  5. 【自動】 取り出した結果を、契約の目的・有効期間と突き合わせる
  6. 【自動】 開示台帳の行の案と、期限が来た契約の返却・破棄の一覧を書き出す
  7. 【人】 担当者が、拾われた開示の記録を確認する(引用と照らして、開示の事実があったかを見る)
  8. 【人】 担当者が、自動で拾えなかった経路の開示を補って記入する
  9. 【人】 担当者が、目的の範囲外の疑いが立った行について、範囲内か範囲外かを判断する
  10. 【人】 返却・破棄の依頼文を確認し、自分の名前で送る

9番目が、この設計の分かれ目です。範囲外かどうかをAIに断定させません。 機械が出すのは「疑いがある」という印と、その根拠になった本文の引用だけです。目的の解釈は、契約書の文言と交渉の経緯を知っている人にしかできません。印を付けるところまでを自動にして、判断は法務に残します。

10番目を自動送信にしないことが、もう一つの分かれ目です。 返却・破棄の依頼は、相手先との関係の中で送る文書です。誤って拾った開示を根拠に依頼を送ってしまうと、取り消すことができません。

02今回想定するシステム構成

構成図
【トリガー】毎日決まった時刻(Apps Script の時刻主導トリガー)
   ▼
契約台帳(Google スプレッドシート)
   │  有効なNDAと、相手先ドメイン・契約番号・目的・有効期間を読む
   ▼
Google Apps Script
   ├──▶ Gmail ─── 相手先ドメイン宛ての送信メール
   │                (件名・本文・添付ファイル名。中身は開かない)
   └──▶ Google ドライブ ─── 発行された共有リンクと公開範囲
   ▼
Google Apps Script ── 社内転送・自動送信の除外/署名と引用履歴の除去
   ▼
Gemini API(構造化出力)── 開示の事実と対象資料をJSONで返す
   │                        各項目に value/evidence/confidence を付ける
   ▼
Google Apps Script ── 契約の目的・有効期間と突き合わせる
   ├──▶ 開示台帳の行の案
   └──▶ 期限が来た契約の、返却・破棄の一覧
   ▼
【法務・知財の担当者が確認して確定】
   ▼
開示台帳へ記録 ──▶ 返却・破棄の依頼の下書き(送信は人)
役割想定する製品代替候補
実行環境Google Apps ScriptPower Automate、Make
生成AIGemini API(開示の事実と対象資料の抽出)Claude API、OpenAI API

新しく足すのは、この2つだけです。 Gmail、Google ドライブ、スプレッドシートはすでにあるものを読み、専用のシステムは作りません。外部システムへの書き戻しは、台帳への行の追加だけです。

土台の1つが、Apps Script のインストール可能なトリガーです。 時刻主導のトリガーは、特定の時刻や繰り返しの間隔でスクリプトを実行させるもので、短いもので毎分、長いもので月に1回の頻度まで設定できます。 スクリプトからも作成でき、ScriptApp.newTrigger("myFunction").timeBased().everyHours(6).create(); の形で書きます。

時刻は厳密ではありません。 指定した時刻はわずかにランダム化され、午前9時のトリガーを作ると、9時から10時の間の時刻が選ばれ、その後は日ごとに同じ時刻が保たれます。

インストール可能なトリガーは、認可を必要とするサービスを呼び出せます。 その代わり、常に作成した人のアカウントで動きます。 誰が起動したかに関係なく、作成者の権限でメールとドライブが読まれます。この点は第13章で扱います。

もう1つの土台が、Gemini API の構造化出力です。 レスポンス形式に MIME タイプ application/json とJSONスキーマを指定すると、返ってくるJSONをスキーマに従わせられます。formatdate を指定すれば、開示日を日付として受け取れ、終了日との差の計算にそのまま使えます。

03どうやって実装するのか

Step1

処理の起点を決める

毎日決まった時刻に動かし、拾うのは前日分に限ります。 当日分を追いかけると、送信直後のメールと後から追加された共有リンクが別の日にまたがり、同じ開示を2回拾います。

時刻主導トリガーは毎分から月1回までの頻度を取れますが、返却・破棄の依頼は契約の終了日を起点に動くもので、分単位の速さには意味がありません。日次で十分です。

function createDailyTrigger() {
  ScriptApp.newTrigger("collectDisclosures")
    .timeBased().atHour(3).everyDays(1).create();
}

指定した時刻ちょうどには動きません。 時刻はわずかにランダム化されるので、午前3時を指定すれば3時から4時の間のどこかで動きます。深夜を選ぶのは、その日の送信メールが出そろっているからです。

スクリプトの実行やAPIリクエストでは、トリガーは発火しません。 動作を確かめるときは対象の関数を直接実行します。失敗したときは自動でメールが通知され、調整できるのは通知の頻度だけです。 気づく手段が通知しかないので、宛先を法務の共有アドレスにしてください。

Step2

入力データを集める

データ中身取得元
契約の情報契約番号、相手先名、ドメイン、目的、有効期間、返還義務の有無契約台帳(スプレッドシート)
送信メール送信日時、送信者、宛先、件名、本文、添付ファイル名と拡張子Gmail
共有リンクファイル名、発行日、共有した相手、公開範囲、権限Google ドライブ
記録済みの開示台帳にある開示のメールIDとファイルID開示台帳(スプレッドシート)

この構成の質を決めるのは、契約台帳に「相手先ドメイン」の列があることです。 社名だけでは引けず、表記ゆれ、英語表記、グループ会社の混在が、そのまま取りこぼしになります。契約番号の列も同じくらい重要です。 同じ取引先と複数の契約を結んでいる場合はドメインだけでは区別できないので、件名の先頭に契約番号を書く運用を併せて始めてください。

添付ファイルは、名前と拡張子だけを取ります。中身は開きません。 「A部品_試作評価_v3.xlsx」というファイル名から分かることまでが、この構成の範囲です。理由は第13章に書きます。

Step3

データの取得方法を決める

すべて Apps Script の中で完結し、外部にデータを持ち出す経路は生成AIへの呼び出し1本だけです。

取得するもの方法絞り込み
有効な契約の一覧スプレッドシートの読み取り終了日が未来、または返還義務が残るもの
相手先ドメイン宛ての送信メールGmail の検索(to: と日付の範囲)前日分の送信済みだけ
発行された共有リンクドライブの共有設定を読む①のドメインが共有先のもの
記録済みの開示開示台帳の読み取りメールIDとファイルIDの一覧

②はドメインごとに検索を分けてください。 まとめて引くと、どのメールがどの契約に属するのかを後から付け直すことになります。

③は②より取りこぼしやすい経路です。共有リンクは、発行しただけでは相手にメールが飛ばないことがあります。 チャットでリンクを送った場合、Gmail には何も残りません。ドライブ側の共有設定を直接読むのは、この経路を拾うためです。

④は重複を防ぐためです。同じメールを翌日も拾うと、台帳に同じ開示が2行並びます。

Step4

AIへ渡す前に整形する

  1. 有効な契約の絞り込み … 終了日が過ぎていても、返還義務が残る契約は含めます
  2. ドメインの正規化 … サブドメインを吸収し、フリーメールは除外します
  3. 社内メールの除外 … 自社ドメイン宛てと、自動送信の通知を落とします
  4. 署名と引用履歴の除去 … 返信の引用部分を落とします
  5. 添付情報の取り出し … 名前、拡張子、サイズだけを取ります。中身は読みません
  6. 公開範囲の判定 … 「リンクを知っている全員」か「指定したユーザーのみ」かを見ます
  7. 記録済み分の除外 … すでに台帳にある開示を落とします
  8. 件数の上限 … 1回の呼び出しに載せる開示を10件程度に区切ります

4番目が効きます。 秘密保持契約の相手とのやり取りは、同じスレッドが伸びていきます。引用を残したまま渡すと、最初の1通で渡した図面の名前が、その後の20通すべてで「開示があった」と読まれます。

8番目はスキーマの制限と関係しています。 構造化出力では大きく深くネストされたスキーマが拒否されることがあり、 1件ごとに8項目、各項目が3つの値を持つ以上、配列はすぐ大きくなります。

Step5

AIに処理させる

させるのは、メールと共有リンクの情報から次の8項目を取り出すことだけです。

項目中身
開示の有無受け渡しが実際にあったか。予定・依頼だけの文面は開示ではない
相手先と受領者相手先の社名と、資料を受け取った個人
開示日渡した日。formatdate を指定して日付で受け取る
対象資料の名称と種類添付ファイル名または本文中の呼び名と、図面・見積などの種類
開示の目的本文から読み取れる範囲での、渡した理由
契約の目的との整合範囲内か、範囲外の疑いか、判断できないか
媒体添付・共有リンク・持ち出しのどれか
共有リンクの公開範囲誰が開けるリンクだったか

各項目に valueevidenceconfidence の3つを持たせます。 evidence は本文からの引用、confidenceexplicit(本文にそう書いてある)、inferred(前後から読み取った)、not_stated(書かれていない)です。

inferrednot_stated は必ず人が読みます。 この区別が無いと、機械の推測が本文の事実と同じ重さで台帳に並びます。台帳は後から根拠に使われるものなので、推測と事実が混ざると、無いよりたちが悪くなります。

させないこと理由
目的の範囲外だと断定する契約の解釈は法務が行う。 出すのは疑いの印と引用だけ
開示の事実を補う本文に無い受領者や資料名を埋めさせない
添付ファイルの中身を読む渡さない設計にする(第13章)
返却・破棄の依頼文を送る下書きまで。送信は人
拾えなかったものを「開示なし」と書く拾えない経路がある(第12章)

1行目がこの章の要です。 「目的の範囲外の疑い」は out_of_scope_suspected というフラグにして、根拠になる引用を必ず付けさせます。法務が読むべき行に印を付けるためのもので、判定結果ではありません。 「A部品の共同検討」の契約でB製品の資料が渡っていても、交渉の過程で対象が広がっていたなら範囲内で、その経緯は本文に書かれていません。

Step6

指示内容を固定する

あなたは、秘密保持契約にもとづく開示の記録を作る担当者です。
渡された送信メールと共有リンクの情報から、開示の事実を項目ごとに取り出してください。

【判断の基準】
- 「開示があった」とするのは、添付が付いているか、共有リンクを発行したかの
  いずれかがある場合だけです。「来週お送りします」だけの文面は開示ではなく、
  disclosure_occurred を false にしてください。
- 資料の名称は、添付ファイル名か本文にある呼び方をそのまま写してください。

【記載がない項目の扱い】
- 本文に書かれていない項目は value を空文字にし、
  confidence を not_stated にしてください。推測で埋めないでください。
- 前後の文脈から読み取った場合は confidence を inferred にし、
  evidence にその根拠になった一文を引用してください。
- 本文にそのまま書かれている場合だけ confidence を explicit にしてください。
- 受領者が特定できないときは「不明」とし、
  宛先のアドレスから会社名や役職を推測しないでください。

【契約の目的との整合】
- 範囲外だと断定しないでください。判断するのは法務です。
- 疑いがある場合は out_of_scope_suspected を true にし、reason に
  「契約の目的は〜だが、渡した資料は〜である」の形で理由を書いてください。
- 判断がつかない場合も true にしてください。

【厳守事項】
- 日付は YYYY-MM-DD の形式で書き、本文に日付が無い場合は
  メールの送信日を使って confidence を inferred にしてください。
- evidence は本文からそのまま引用し、要約しないでください。
- 渡された情報に無い資料名・相手先名・日付を書かないでください。
- 添付ファイルの中身について書かないでください。

【契約の情報】{contract}
【送信メール】{mail}
【共有リンク】{drive_links}

「記載がない項目の扱い」を3つに分けているのは、空欄を嫌う性質があるためです。 何も言わないと、宛先のアドレスから会社名を組み立て、本文に無い資料の種類を書き、送信日を開示日として断定します。どれももっともらしく、後から間違いだと気づけません。

「範囲外だと断定しない」と「判断がつかない場合も true」は対で書きます。 断定を禁じただけだと、疑わしい行に印が付かなくなります。多めに付けさせて人が外すほうが、絞って見落とすより安全です。

Step7

出力形式を固定する

レスポンス形式に MIME タイプ application/json と、次のJSONスキーマを指定します。

{
  "type": "object",
  "properties": {
    "contract_no": { "type": "string" },
    "mail_id": { "type": "string" },
    "disclosure_occurred": { "type": "boolean" },
    "disclosure_date": { "type": "string", "format": "date" },
    "recipient_company": {
      "type": "object",
      "properties": {
        "value": { "type": "string" },
        "evidence": { "type": "string" },
        "confidence": { "type": "string", "enum": ["explicit", "inferred", "not_stated"] }
      },
      "required": ["value", "evidence", "confidence"]
    },
    "documents": {
      "type": "array", "minItems": 0, "maxItems": 20,
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "doc_type": { "type": "string", "enum": ["図面", "仕様書", "見積", "評価データ", "その他"] },
          "medium": { "type": "string", "enum": ["添付", "共有リンク", "持ち出し", "不明"] },
          "link_visibility": { "type": ["string", "null"] },
          "evidence": { "type": "string" },
          "confidence": { "type": "string", "enum": ["explicit", "inferred", "not_stated"] }
        },
        "required": ["name", "doc_type", "medium", "evidence", "confidence"],
        "additionalProperties": false
      }
    },
    "out_of_scope_suspected": { "type": "boolean" },
    "out_of_scope_reason": { "type": "string" }
  },
  "required": ["contract_no", "mail_id", "disclosure_occurred",
               "documents", "out_of_scope_suspected"],
  "additionalProperties": false
}

受領者と開示の目的も、recipient_company と同じ形で並べます。

構造化する理由の1つ目は、日付をそのまま計算に使えることです。 disclosure_dateformatdate を指定するので、返ってくるのは日付として解釈できる文字列です。開示日と契約の終了日の差を取れば、返却・破棄を求めるべき先の一覧が機械で作れます。 自由文だと「9月中旬」を解釈する処理が要ります。

2つ目は、confidenceenum で固定できることです。 構造化出力は文字列に対して enum で取りうる値を列挙でき、分類を行わせる用途に使えます。3つの値しか返らないと決まっていれば、「確からしい」「たぶん」といった表記ゆれを後段で受けずに済みます。

3つ目は、additionalPropertiesfalse にすると、スキーマに無い項目が増えないことです。 「範囲外である」と断定する欄を作らなければ、そこに断定は書かれません。

link_visibility は、添付だけの開示では値がありません。型の配列に null を含めて {"type": ["string", "null"]} と書きます。 空文字で代用すると、「公開範囲が取れなかった」のか「共有リンクではない」のかが区別できません。

なお、すべてのJSONスキーマの機能が使えるわけではなく、大きく深くネストされたスキーマは拒否されることがあります。

Step8

システムへ連携する

つなぎ先方式内容
契約台帳スプレッドシートの読み取り有効な契約、相手先ドメイン、契約番号、目的、有効期間
GmailApps Script からの検索送信メールの件名・本文・添付ファイル名
Google ドライブ共有設定の読み取り共有リンクの発行、共有先、公開範囲
Gemini API構造化出力を指定した呼び出し開示の事実と対象資料をJSONで返す
開示台帳スプレッドシートへの行の追加確定した開示の記録
返却・破棄の一覧スプレッドシートへの行の追加期限が来た契約と、渡した資料

書き込みは下2つだけで、契約台帳・Gmail・ドライブへの書き戻しはありません。元のデータを壊す経路が無いことが、難易度を下げています。

Step9

人が確認する

全件、人が確認します。確認せずに台帳へ記録する設計にしません。

  1. 開示の事実を確かめるevidence の引用を読み、実際に資料が渡ったかを見ます。confidenceinferred または not_stated の項目は必ず開きます
  2. 目的の範囲外の疑いを判断するout_of_scope_suspectedtrue の行について範囲内か範囲外かを決め、結果と理由を台帳に残します
  3. 拾えなかった開示を補う … 印刷物や対面で渡したものは拾えません。「人が足した分」として区別できる形で記入します

2番目が、この構成の中心の作業です。 機械は印を多めに付け、人が外します。外すときの根拠は契約書の文言と交渉の経緯で、どちらもメール本文には書かれていません。

確認の目標は1件5分、補足の記入が3分です。 それ以上かかるなら evidence が長すぎるか、印の付き方が粗すぎます。

Step10

例外に対処する

起きること対応
契約台帳に相手先ドメインが無い未設定の契約として一覧に出す。 黙って飛ばさない
同じ相手先に複数の有効な契約がある契約番号で振り分ける。番号が無ければ候補を複数出し、人が選ぶ
本文が引用だらけで判定できないconfidencenot_stated にして要確認に回す
添付が無く共有リンクも無いdisclosure_occurredfalse にし、記録は残して理由を書く
応答がスキーマに合わない件数を減らして再実行する。部分的に書き込まない
トリガーが失敗した法務の共有アドレスで通知を受け、翌日にまとめて処理する
同じ開示が2回拾われたメールIDとファイルIDで突合して落とす
期限が来た契約に開示の記録が1件も無い「開示なし」と書かない。「自動では拾えなかった」と書く

最後の行を軽く見ないでください。 記録が無いことと開示が無かったことは別です。「開示なし」と書かれた瞬間、それは調べ終わったという意味になります。

Step11

記録を残す

  • 拾った送信メールのID、件名、送信日時、宛先ドメイン、添付ファイル名
  • 共有リンクのファイルID、発行日、共有先、公開範囲
  • 生成AIに渡した内容と、返ってきたJSONの全文
  • 担当者が out_of_scope_suspected を外した行と、外した理由
  • 「自動で拾った分」と「人が足した分」の区別
  • 返却・破棄の依頼を送った日、宛先、相手からの回答と回答日

4つ目がたまると、どういう資料が目的の範囲を出やすいのかが分かります。5つ目が無いと、台帳がどこまで網羅しているのかを誰も言えなくなります。

04実装レベルの3段階

最小構成:契約1件分のメールを手で集めてAIに貼り付け、開示の項目を取り出させる / 開示の記録の書き出し
半自動化:上記+日次トリガーで送信メールと共有リンクを自動で集め、台帳の行の案を出す / 開示の収集、項目の抽出、行の案、返却・破棄の一覧
本格構成:上記+返却・破棄の依頼の下書きの自動生成と、回答の突合 / 上記+依頼の起票と回答の管理

最小構成でも24分が15分程度にはなりますが、契約1件ずつ手で集める作業が残るため、月30件には広げられません。 効果が出るのは半自動化からです。日次で自動的に集まることで、初めて「求められる前に把握している」状態になります。これが本記事の想定です。 本格構成に進んでも、返却・破棄の依頼の送信そのものは自動にしません。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
2 名
月間件数
30 件
1件あたり現在時間
24 分
1件あたり導入後時間
8 分
現在  30件 × 24分 ÷ 60 = 12 時間/月
導入後 30件 × 8分 ÷ 60 = 4 時間/月
月間削減時間
8h
削減率
67%
年間削減時間
96h
年間金額換算(時間単価4,500円)
43万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 共同開発や外注、販売代理の検討で秘密保持契約を結ぶことが月に十数件以上あり、契約は法務が管理しているものの、実際に資料を渡すのは技術や営業の担当者で、何をいつ渡したかが個人のメールにしか残っていない企業。契約台帳に相手先のドメインと契約番号の列を足せる場合。メールと資料の共有を Google Workspace で行っている場合。
向いていない
  1. 秘密保持契約が年に数件で、渡す資料も限られており、担当者が記憶の範囲で追える場合。資料の受け渡しをすべて専用のデータルームで行っており、誰が何を閲覧したかの記録がそちらに残っている場合。契約の管理そのものがまだ無く、有効な契約の一覧が作れない場合は、先に契約台帳の整備が必要です。

07最小構成で試す方法

  1. すでに終了した秘密保持契約を3件選ぶ(うち1件は、相手から破棄の連絡が来て対応した契約)
  2. その契約を担当した人に、当時渡した資料を書き出してもらう(これが答え合わせの基準になる)
  3. 同じ契約について、相手先ドメイン宛ての送信メールを手で検索し、件名・本文・添付ファイル名を書き出す
  4. AIの画面に、契約の目的・有効期間と、書き出したメールを貼り付ける
  5. 「いつ誰に何を渡したかを項目ごとに取り出してください。本文に書かれていない項目は『不明』としてください。契約の目的の範囲外の疑いがあるものには印を付け、断定はしないでください」と指示する
  6. 出てきた内容を、2番目で書き出してもらった一覧と比べる

2番目を先にやってください。 基準が無いと、出てきた内容がもっともらしいかどうかしか見られません。

出てきた内容判断
記憶と同じ資料がそろっているスキーマとスクリプトの作り込みに進む
挙がっていない資料が出てきた良い兆候。 記憶から落ちていた開示が拾えている
挙がった資料が出てこない印刷物・対面なら仕組みの限界、メールにあるのに拾えないなら検索の問題
範囲外の疑いが1件も付かない判断の基準を直す。印は多めに付くのが正しい

3行目が出たときは、原因を分けて考えてください。 メールに残っているのに拾えなかったのなら直せますが、メールを通っていないのなら、この構成では拾えません。 その区別が第12章につながります。

08実装時につまずきやすいポイント

まず、この構成で拾えない経路を一覧にしてください。

経路拾えるか
Gmail の添付拾える
Google ドライブの共有リンク拾える
チャットで送った共有リンクドライブ側の共有設定から拾える
USBメモリでの受け渡し拾えない
印刷して手渡した資料拾えない
対面やWeb会議での画面共有拾えない
相手指定のデータルームへのアップロード拾えない
個人のフリーメール宛ての送信拾えない(ドメインで引けない)

拾えない経路は、運用で補います。 開示のたびに台帳へ1行足す決まりを併せて作ってください。自動で拾える分があることで、人が足すべき分が「例外」として意識されます。 すべて手で書いていた頃より、むしろ抜けにくくなります。

問題対策
相手先が複数のNDAを持っていて区別できない件名の先頭に契約番号を入れる運用を併用する。 番号が無い分は候補を複数出し、人が選ぶ
契約台帳にドメインの列が無い先に列を足す。埋まっていない契約は、未設定として一覧に出す
グループ会社のドメインが違うドメイン列を複数値にする。表記ゆれは正規化で吸収する
引用履歴で同じ開示が何度も拾われる前処理で引用部分を落とす。メールIDで台帳と突合する
拾えなかったものが「開示なし」と読まれる台帳に「自動で拾った分」と「人が足した分」の列を持たせる
目的の範囲外の疑いが付きすぎる/付かない判断の基準を直す。印の数ではなく、見落としの有無で調整する
スキーマが拒否される大きく深いスキーマは拒否されることがある。 1回の件数を減らす
トリガーの時刻がずれる時刻はわずかにランダム化される仕様。 分単位の前提を置かない
手動テストでトリガーが動かないスクリプトの実行やAPIリクエストでは発火しない。 関数を直接実行する

上から2番目までが、ほとんどの取りこぼしの原因です。 抽出の精度より先に、契約台帳の列を整えてください。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 従業員の送信メールの件名と本文、添付ファイル名、共有リンクの発行記録、相手先の社名と担当者名、契約の目的と有効期間。従業員のメール本文を読む仕組みであることが、いちばん重い論点です。

  1. この仕組み自体が、秘密情報の在りかを1か所に集めることになる … 開示台帳は「どの資料が、どの社外の相手に渡っているか」の一覧です。これが漏れると、狙うべき資料と渡し先が同時に分かります。 閲覧範囲を法務・知財に限り、誰がいつ開いたかの記録を残してください
  2. メール本文を外部AIへ渡す範囲を決める … 渡すのは件名・本文・添付ファイル名までに限り、添付ファイルの中身は渡しません。 これはこの構成の要です。開示の事実と資料の名前を取り出すだけなら、ファイル名で足ります。中身を渡すと、秘密情報そのものを外部へ送ることになります
  3. 従業員のメールを見る仕組みであることを社内に公表する … 目的(開示の記録)、範囲(契約台帳にある相手先ドメイン宛ての送信メールだけ)、保存期間の3つを示してください。対象をそのドメインに絞ることが、公表できる範囲に収める条件です。 全社のメールを読む設計にしないでください
  4. トリガーは作成者のアカウントで動く個人のアカウントで作ると、その人の権限でメールとドライブが読まれ続けます。 異動や退職で止まり、誰も気づきません。管理用のアカウントで作成してください
  5. 返却・破棄の依頼は人が送る … 自動送信にしません。誤って拾った開示を根拠に依頼を送ると、取り消せません。 相手に「そちらが把握していない開示がある」と伝えることにもなります
  6. 目的の範囲外の疑いの扱いを決める … 範囲外の疑いが立った開示は、従業員の行為を問う材料にもなりえます。 誰が見るのかを先に決めてください。仕組みを作ってから決めると、最初の1件で揉めます

誤りが起きた場合のリスクは、拾い漏れと拾いすぎの2つです。 拾い漏れは台帳の網羅性を損ない、拾いすぎは従業員の通常の業務連絡を記録に残します。 対象を契約台帳のドメインに限ることが、両方への対処です。

10まず何から始めるか

1週目:契約台帳に列を足す

相手先ドメインと契約番号の列を作り、現在有効な契約について埋めます。 全部は埋まりません。埋まらなかった契約の数が、この構成でカバーできない範囲の出発点です。

2週目:終了済みの契約3件で試す

すでに終了した契約を3件選び、当時渡した資料を担当者に書き出してもらいます。同じ契約のメールを手で集めてAIに貼り付け、担当者の記憶と比べます。 記憶から落ちていた開示が出るかを見てください。

3週目:拾えない経路を洗い出す

第12章の一覧を自社の実態に合わせて作り直します。「この1年で、メール以外の経路で資料を渡したことがあるか」を技術部門と営業部門に聞いてください。

4週目:日次のトリガーを1つのドメインで動かす

契約が1件だけの相手先を選び、そのドメインだけを対象に日次のスクリプトを動かします。管理用のアカウントで作ることを忘れないでください。1週間、拾われた行を毎日読みます。

2か月目: 対象ドメインを有効な契約すべてに広げ、out_of_scope_suspected の付き方を見ながら判断の基準を調整します。印が多すぎても減らしません。見落としが出ていないかだけを見ます。3か月目以降: 有効期間が終わった契約について返却・破棄の一覧を出し、相手から言われる前に自社から依頼を出す運用に切り替えます。 そこまで回れば完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-09-23/最終更新:2026-09-23
確認した内容情報源確認日
時刻主導トリガーが、特定の時刻または繰り返しの間隔でスクリプトを実行させるもので、最短で毎分、最長で月に1回の頻度まで設定できること。ScriptApp.newTrigger("myFunction").timeBased().everyHours(6).create();.onWeekDay(...).atHour(9).create(); の形でスクリプトから作成できること。指定した時刻がわずかにランダム化され、午前9時の繰り返しでは9時から10時の間の時刻が選ばれ、以後は日ごとに同じ時刻が保たれること。認可を必要とするサービスを呼び出せ、常に作成した人のアカウントで実行されること。スクリプトの実行やAPIリクエストでは発火しないこと。失敗時に自動でメール通知が送られ、稼働中は通知の頻度だけを調整できること。クォータ制限を受けることGoogle Apps Script: Installable triggers2026-09-23
構造化出力が、レスポンス形式に MIME タイプ application/json とJSONスキーマを指定して行うものであること。サポートされる型が stringnumberintegerbooleanobjectarraynull であり、null{"type": ["string", "null"]} のように型の配列に含める形で表すこと。オブジェクトで propertiesrequiredadditionalProperties、文字列で enum(分類用に可能な文字列セットを列挙する)と formatdate-timedatetime などの構文指定)、数値で enumminimummaximum、配列で itemsminItemsmaxItems が使えること。すべてのJSONスキーマ機能がサポートされるわけではなく、大きい、または深くネストされたスキーマは拒否されることがあることGemini API: Structured output2026-09-23

返還義務や秘密情報の定義は契約ごとに文言が異なるため、どの資料が対象になるかは自社の契約書と法務部門への確認が必要です。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-0183)についてのご相談はこちらから。

AI活用について相談する
目次