生成AIの導入効果を「一件あたり何分短くなったか」だけで報告すると、確認担当者へ移った作業を見落とします。下書きの確認、例外からの復旧、元の手順へ戻る時間も、業務の費用対効果に含める必要があります。
この記事では、GoogleスプレッドシートとGASで、AI導入前の基準時間と導入後のAI処理時間・人間確認時間・例外復旧時間を記録し、少数の実績から継続判断を作る最小構成を実装します。AI APIの呼び出し、顧客への自動送信、続行・停止の最終決定は扱いません。
作るもの
AI_EFFECT_LOG シートの1行目を次の列にします。
case_id,work_name,measured_at,baseline_minutes,ai_minutes,review_minutes,exception_minutes,exception_flag,decision,reason,next_review_at
decision は次の3値だけにします。
CONTINUE // 通常ケースで効果があり、確認負荷も許容できる
ADJUST // 効果はあるが、例外・確認条件・入力を直す
STOP // 影響が大きい、復旧できない、確認者がいない
CONTINUE を自動で付けるのではなく、GASは集計と候補の提示までを担当します。業務責任者が記録を読み、理由と次回確認日を確定します。
4つの時間を分けて記録する
基準時間を baseline_minutes に置き、導入後の時間を三つに分けます。
| 項目 | 意味 | 記録上の注意 |
|---|---|---|
| 基準時間 | AIを使わない時の一件の目安 | 過去の平均なら測定期間を残す |
| AI処理時間 | 分類・下書きなどに要した時間 | APIの待ち時間だけに限定しない |
| 確認時間 | 人が読み、直し、根拠を確認した時間 | 未計測を0にしない |
| 例外復旧時間 | 停止後に元手順や別担当へ戻す時間 | 例外がなければ0、未計測は空欄以外の状態で残す |
例として10件を次のように記録します。
基準時間: 12分
通常8件: AI 3分 + 確認 4分
例外2件: AI 3分 + 確認 4分 + 復旧 10分
AI導入後の合計は90分、平均は9分です。見かけの短縮は3分ですが、例外を除いて計算したり、確認時間を落としたりすると、実際より良く見えます。件数が少ない間は「効果が証明された」と書かず、「次に確認する条件が見えた」と扱います。
設定をコードの外へ出す
業務ごとに許容する確認負荷は異なるため、基準を設定値として変更できるようにします。
const EFFECT_CONFIG = Object.freeze({
sheetName: 'AI_EFFECT_LOG',
minSamples: 10,
maxAverageMinutes: 10,
maxExceptionRate: 0.2,
decisionColumn: 'decision',
allowedDecisions: ['CONTINUE', 'ADJUST', 'STOP'],
});
maxAverageMinutes と maxExceptionRate は性能保証ではなく、レビューを始める境界です。契約・料金・返金・苦情・個人情報に関係する業務は、数値がよくても自動継続の対象にしません。
ヘッダー名で安全に読み込む
列番号を直接使うと、シートへ列を追加した時に別の項目を書き換える恐れがあります。ヘッダー名から行をオブジェクトにします。
function readEffectLog_() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName(EFFECT_CONFIG.sheetName);
if (!sheet) throw new Error(`${EFFECT_CONFIG.sheetName} sheet is missing`);
const values = sheet.getDataRange().getValues();
if (values.length === 0) return { sheet, headers: [], rows: [] };
const headers = values[0].map(String);
const rows = values.slice(1).map((valuesInRow, index) => {
const row = { _rowNumber: index + 2 };
headers.forEach((header, column) => {
row[header] = valuesInRow[column];
});
return row;
});
return { sheet, headers, rows };
}
効果を集計する
未計測の時間を勝手に0として扱わないため、数値の妥当性を確認してから集計します。
function summarizeEffect() {
const { rows } = readEffectLog_();
const measured = rows.filter((row) =>
Number.isFinite(Number(row.baseline_minutes)) &&
Number.isFinite(Number(row.ai_minutes)) &&
Number.isFinite(Number(row.review_minutes)) &&
Number.isFinite(Number(row.exception_minutes))
);
if (measured.length < EFFECT_CONFIG.minSamples) {
return {
status: 'INSUFFICIENT_SAMPLE',
sampleCount: measured.length,
required: EFFECT_CONFIG.minSamples,
};
}
const total = measured.reduce((sum, row) => sum +
Number(row.ai_minutes) +
Number(row.review_minutes) +
Number(row.exception_minutes), 0);
const baseline = measured.reduce((sum, row) =>
sum + Number(row.baseline_minutes), 0);
const exceptions = measured.filter((row) => row.exception_flag === true ||
String(row.exception_flag).toUpperCase() === 'TRUE').length;
const averageMinutes = total / measured.length;
const exceptionRate = exceptions / measured.length;
return {
status: 'READY_FOR_REVIEW',
sampleCount: measured.length,
baselineAverageMinutes: baseline / measured.length,
actualAverageMinutes: averageMinutes,
savedAverageMinutes: baseline / measured.length - averageMinutes,
exceptionRate,
suggestedDecision: exceptionRate > EFFECT_CONFIG.maxExceptionRate
? 'ADJUST'
: averageMinutes <= EFFECT_CONFIG.maxAverageMinutes
? 'CONTINUE'
: 'ADJUST',
};
}
実運用では、同じ業務でも通常・境界・停止ケースを混ぜて記録し、入力条件も残します。例外率が高い時にサンプルから例外を外して再集計するのは、改善ではなく指標の隠蔽になり得ます。
判断ログへ戻す
集計結果をそのまま承認欄へ書き込まず、次の項目を人が確認します。
- どの業務と入力条件を測ったか
- 基準時間はいつの手順を基準にしたか
- 確認時間に根拠確認や差し戻しを含めたか
- 例外時に元の手順へ戻れたか
- 次に直す場所はフォーム、FAQ、CRM、承認ルールのどこか
- 次回レビュー日と責任者は誰か
suggestedDecision はあくまで候補です。STOP は、重大な影響、復旧不能、確認者不在などの理由を優先して人が記録します。
運用チェックリスト
- 基準時間とAI導入後の時間を同じ業務単位で測っている
- AI処理・人間確認・例外復旧を別の列にしている
- 未計測を0として平均に入れていない
- 通常・境界・停止ケースを混ぜている
- 少ない件数の結果を性能保証として説明していない
- 集計結果は人の継続・修正・停止判断へ戻している
- 顧客本文、氏名、メールアドレス、認証情報をログへ複製していない
費用対効果は、AIが何件処理したかだけでは決まりません。減った時間の隣に、確認する人の時間、例外から戻る時間、見直しのための時間を置くことで、次に続ける条件を説明できます。Miraigentでは、AIへ任せる範囲を広げる前に、確認できる量と止める条件を業務ログへ固定します。
