AI導入の対象業務や確認ルールを変えた後、チャットだけで社内へ知らせていないでしょうか。
変更の影響範囲、正本、確認者、例外、手動の戻し先、更新日が揃わないまま案内すると、古い手順と新しい手順が同時に使われます。この記事では、GoogleスプレッドシートとGASで、変更を社内へ配る前の確認を記録する最小構成を作ります。
扱うのは通知の準備と記録です。GASからメールやチャットを自動送信したり、AIに承認させたりはしません。
作るもの
AI_CHANGE_NOTICES シートに、変更一件を次の6項目で登録します。
change_id,summary,scope,source_of_truth,reviewer,exception_route,rollback,updated_at,status
-
scope: 対象業務・対象者・対象外 -
source_of_truth: 最新の手順やFAQのURL・文書名 -
reviewer: 通知前に確認する担当者 -
exception_route: 境界・停止時に戻す先 -
rollback: 旧手順へ戻す条件と方法 -
updated_at: 正本を更新した日時
status は DRAFT、REVIEW、READY、HOLD の4値だけにします。READY は通知を送ってよいという意味ではなく、6項目を確認できた状態です。
変更通知で先に揃える6項目
| 項目 | 確認すること | 未確定なら |
|---|---|---|
| 影響範囲 | 誰の、どの業務が変わるか | HOLD |
| 入力情報 | 変更後に扱ってよい情報は何か | HOLD |
| 正本 | どの手順・FAQを最新版とするか | HOLD |
| 確認者 | 通常・境界・停止を誰が見るか | REVIEW |
| 例外 | 情報不足、権限不足、苦情などの戻し先 | HOLD |
| 戻し先 | 不具合時にどの手動手順へ戻すか | HOLD |
入力情報は「AIへ送ってよい情報」だけでなく、変更後に送らない情報も書きます。顧客固有の本文、認証情報、契約や料金に関わる判断を通知文へ貼り付けないでください。
GASで許可値と必須項目を固定する
const CHANGE_NOTICE_CONFIG = Object.freeze({
sheetName: 'AI_CHANGE_NOTICES',
statuses: ['DRAFT', 'REVIEW', 'READY', 'HOLD'],
required: [
'change_id', 'summary', 'scope', 'source_of_truth',
'reviewer', 'exception_route', 'rollback', 'updated_at',
],
});
function readChangeNotices_() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName(CHANGE_NOTICE_CONFIG.sheetName);
if (!sheet) throw new Error('AI_CHANGE_NOTICES sheet is missing');
const values = sheet.getDataRange().getValues();
if (values.length < 2) return [];
const headers = values[0].map(String);
return values.slice(1).map((row, index) => {
const item = { rowNumber: index + 2 };
headers.forEach((header, column) => { item[header] = row[column]; });
return item;
});
}
function validateChangeNotice_(item) {
CHANGE_NOTICE_CONFIG.required.forEach((key) => {
if (!String(item[key] || '').trim()) {
throw new Error(`${key} is required: ${item.change_id || 'unknown'}`);
}
});
const status = String(item.status || 'DRAFT').toUpperCase();
if (!CHANGE_NOTICE_CONFIG.statuses.includes(status)) {
throw new Error(`unsupported status: ${item.change_id}`);
}
if (status === 'READY' && !String(item.input_boundary || '').trim()) {
throw new Error(`input_boundary is required for READY: ${item.change_id}`);
}
return { ...item, status };
}
input_boundary はヘッダーへ追加する任意の列です。例として「顧客の個別情報は入力しない」「料金・返金は人間確認へ戻す」といった境界を記録します。正規表現や必須チェックは入力漏れを減らす補助であり、機密性や権限を証明するものではありません。
通知前に3状態を判定する
function classifyNotice_(item) {
const text = [item.scope, item.source_of_truth, item.reviewer,
item.exception_route, item.rollback, item.input_boundary]
.map((value) => String(value || '').trim());
if (text.some((value) => value === '')) return 'HOLD';
if (String(item.status).toUpperCase() === 'READY') return 'READY';
return 'REVIEW';
}
function validateAllChangeNotices() {
const items = readChangeNotices_();
const result = items.map((item) => {
try {
const valid = validateChangeNotice_(item);
return [valid.change_id, classifyNotice_(valid), 'OK'];
} catch (error) {
return [item.change_id || '', 'HOLD', error.message];
}
});
Logger.log(JSON.stringify(result));
return result;
}
通常の変更でも、通知文の配信自体は別の人間確認にします。境界や停止の変更を READY として扱う場合は、承認者と戻し先を正本側にも残してください。
通知文に入れる情報を分ける
社内通知は、次の順番にすると古い案内との混在を減らせます。
- 何が変わったか(変更前・変更後)
- いつから、誰に影響するか
- 最新の正本はどこか
- 通常時の進め方
- 例外・停止時に誰へ戻すか
- 旧手順を使ってよい期間と、使ってはいけない条件
通知へ貼るのは判断に必要な要約だけにし、顧客本文や内部の認証情報を転記しません。正本が更新されていない場合は通知を保留します。
公開・反映前チェックリスト
- 影響範囲と対象外が一文で分かる
- 送ってよい情報と送らない情報が分かれている
- 最新の正本と更新日がある
- 通常・境界・停止の確認者が決まっている
- 例外時の戻し先と手動復旧がある
- 旧手順を無効にする条件を決めた
- 通知文に顧客固有情報、認証情報、未確認の約束がない
-
READY判定後も人間が通知内容を確認する
まとめ
AI導入の変更を知らせるときは、通知の文章を先に磨くより、次の6項目を正本へ揃えます。
- 影響範囲
- 入力情報の境界
- 正本
- 確認者
- 例外時の戻し先
- 手動復旧と更新日
GASは入力漏れや許可値の揺れを検出する補助に使い、公開・通知・顧客への約束を自動承認させないことが重要です。Miraigentでは、AIを導入する前後に「何を変えたか」だけでなく、「古い判断へ戻らないための場所」を一緒に記録します。
