毎月のパルスサーベイの自由記述をテーマと感情で分類し、部署ごとの要点にまとめて人事と管理職へ返す
毎月のパルスサーベイで集まる自由記述を、決めておいたテーマと感情の区分で1件ずつ分類し、部署ごとの件数と要点にまとめます。管理職には部署の要約を、人事には要対応の記述の一覧を分けて返します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate/Python
- 対象業界
- IT・SaaS/人材/小売/製造
- 対象部門
- 人事
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- データ分析に時間がかかる/人手が足りない/属人化している
- AIで行う処理
- 分類
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- フォームの回答期間が終わったら、回答のスプレッドシートから自由記述の列を部署ごとに並べ替える
- 担当2名で部署を分け、自由記述を1件ずつ読む
- 1件ごとに、テーマと「前向き/不満/要望/その他」を隣の列に手で書く
- ハラスメントや体調の話が書かれていれば、別のシートに写して人事の責任者に知らせる
- 部署ごとにテーマの件数を数え、目立つ声を数件選ぶ
- 管理職ごとに、部署の要点を文章にしてメールで送る
- 全社の傾向を人事の責任者向けにまとめる
- 自動フォームの回答期間が終わった翌朝、スクリプトが回答のシートから自由記述を取り出す
- 自動氏名・社員番号・メールアドレスらしい文字列を伏せ字にし、部署の回答数を数える
- 自動自由記述を20件ずつまとめて Gemini API に送り、テーマ・感情・要対応の印を付けさせる
- 自動返ってきた区分が決めた値の中にあるかを確かめ、外れたものは「再分類待ち」にする
- 自動部署ごとにテーマと感情の件数を集計し、回答が5件未満の部署は上の組織にまとめる
- 自動部署ごとに、件数と原文を言い換えた要点の下書きを作らせる
- 人人事の担当が、要対応の印が付いた記述と「その他」に入った記述を原文で読む
- 人人事の担当が、部署ごとの要点の下書きを読み、書き手が分かる言い回しが残っていないかを確かめる
- 人確かめた要点を、管理職へのメールの下書きから送る
- 自動分類の結果と、人が直した区分をシートに残す
各工程の詳しい説明を読む
- フォームの回答期間が終わったら、回答のスプレッドシートから自由記述の列を部署ごとに並べ替える
- 担当2名で部署を分け、自由記述を1件ずつ読む
- 1件ごとに、テーマと「前向き/不満/要望/その他」を隣の列に手で書く
- ハラスメントや体調の話が書かれていれば、別のシートに写して人事の責任者に知らせる
- 部署ごとにテーマの件数を数え、目立つ声を数件選ぶ
- 管理職ごとに、部署の要点を文章にしてメールで送る
- 全社の傾向を人事の責任者向けにまとめる
(a)読み終わる前に次の回が来る。 480件を2名で読み、分類して文章にするまでに、ほぼ2週間かかります。管理職に返るのは回答から3〜4週間後で、書かれた出来事はもう過ぎています。 毎月取る意味が薄れ、回答する側にも「出しても返ってこない」と映ります。
(b)分類の付け方が人によって違う。 「残業が続いて上司に相談しにくい」は、業務量の話か、上司との関係の話か。担当者によって付ける区分が分かれ、部署の件数が担当者の癖で動きます。 担当を入れ替えた月に、ある部署の「上司との関係」が急に増えたように見えたことがあります。
(c)管理職への返し方が決まらない。 原文を貼れば誰が書いたか分かる、要約すれば担当者の書き方で印象が変わる。結局、担当者がその都度判断していて、部署によって返る中身の濃さが違います。
(d)要対応の記述が埋もれる。 4番目は、読んだ担当者が気づいたときだけ行われます。疲れてきた後半の部署ほど、見落としが起きやすくなります。 気づくのが遅れると、対応が1か月遅れます。
- 【自動】 フォームの回答期間が終わった翌朝、スクリプトが回答のシートから自由記述を取り出す
- 【自動】 氏名・社員番号・メールアドレスらしい文字列を伏せ字にし、部署の回答数を数える
- 【自動】 自由記述を20件ずつまとめて Gemini API に送り、テーマ・感情・要対応の印を付けさせる
- 【自動】 返ってきた区分が決めた値の中にあるかを確かめ、外れたものは「再分類待ち」にする
- 【自動】 部署ごとにテーマと感情の件数を集計し、回答が5件未満の部署は上の組織にまとめる
- 【自動】 部署ごとに、件数と原文を言い換えた要点の下書きを作らせる
- 【人】 人事の担当が、要対応の印が付いた記述と「その他」に入った記述を原文で読む
- 【人】 人事の担当が、部署ごとの要点の下書きを読み、書き手が分かる言い回しが残っていないかを確かめる
- 【人】 確かめた要点を、管理職へのメールの下書きから送る
- 【自動】 分類の結果と、人が直した区分をシートに残す
7番目と8番目が、人の仕事として残る部分です。 要対応の記述は、人事が原文を読んで対応を決めます。部署の要点は、AIが言い換えた後でも出来事の具体さから書き手が分かることがあるので、送る前に人が読みます。 送信は人が行います。
分類そのものには人が1件ずつ手を入れません。 迷う記述はAIに「その他」と「確信が低い」を付けさせ、その分だけを人が見ます。全件を人が見直すと、32.0時間がほとんど減りません。
02今回想定するシステム構成
Google フォーム(パルスサーベイ。メールアドレスは集めない) ▼ 回答のスプレッドシート 【トリガー】時間主導型(毎日1回。回答期間の終了翌日だけ処理する) Google Apps Script ├──▶ 自由記述の取り出しと伏せ字 ├──▶ 部署ごとの回答数の確認 ▼ Gemini API(有料の枠、構造化出力) │ ① テーマ(固定の7区分) ② 感情(4区分) ③ 要対応の印 ▼ Google Apps Script ── 値の確認、部署ごとの集計、少人数の部署のまとめ ▼ Gemini API ── 部署ごとの要点の下書き(言い換え) ▼ Google Apps Script ── 結果のシートへ書き出し、管理職宛てメールの下書き ▼ 【人事が要対応の記述と要点を確かめてから送る】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make、Python |
| 生成AI | Gemini API(有料の枠、構造化出力) | Claude API、OpenAI API |
| シート | Google スプレッドシート(回答・部署マスタ・分類結果・区分の定義) | Microsoft 365 のブック |
| メール | Gmail(管理職への返送の下書き) | Outlook |
新しく足すのは、スクリプトと Gemini API の契約だけです。 フォームも回答のシートも、今使っているものをそのまま使います。スクリプトが書き込むのは、分類結果のシートだけです。 回答のシートは読むだけにし、元の回答には手を入れません。
土台になるのは、Google Apps Script のインストール型トリガーです。 時間主導型のトリガーは毎分から毎月までの間隔で関数を動かせ、インストール型トリガーは作成した人のアカウントで実行されます。 回答のシートを読める人事の担当者のアカウントで作り、ほかの人の権限で動かないようにします。
スクリプトの実行時間には上限があります。 1回の実行は6分まで、トリガーの合計の実行時間は Google Workspace のアカウントで1日6時間まで、外部へのURLの呼び出しは1日100,000回までとされています。480件を1件ずつ API に送ると6分に近づくので、20件ずつまとめて送り、どこまで終わったかを記録して続きから再開します。
Gemini API は有料の枠で使います。 規約では、有料のサービスでは送ったプロンプトや応答を Google が製品の改善に使わないとされています。一方、無料のサービスでは人が入力と出力を読むことがあり、機密や個人の情報を送らないよう書かれています。 社員の声を扱う以上、無料の枠では使いません。
構造化出力は、いまの公式の書き方に合わせます。 /v1beta/interactions に response_format を付け、mime_type を application/json、schema にJSONスキーマを入れます。スキーマでは enum で選択肢の値を列挙でき、分類の区分を決めた値の中に閉じ込められます。
03どうやって実装するのか
処理の起点を決める
時間主導型のトリガーを、毎朝6時台に1つ置きます。 毎日動きますが、処理するのは回答期間が終わった翌日だけです。回答期間の終了日は、区分の定義のシートに人事が毎月書き込みます。終了日の翌日でなければ、スクリプトは何もせずに終わります。
フォームの送信のたびには動かしません。 送信ごとのトリガーでも1件ずつ分類はできますが、回答期間の途中で部署の件数を出すと、回答の早い人の声だけで部署の傾向が決まって見えます。 回答が出そろってから一度に分類し、集計します。
処理は3つの段に分けます。 1段目で取り出しと伏せ字、2段目で分類、3段目で集計と要点の下書きです。どの段のどの件まで終わったかをスクリプト プロパティに残し、6分に近づいたら区切って、次の実行(同じ朝の15分後に置いた2つ目のトリガー)で続きから始めます。
同じ回が二度処理されないようにします。 処理を始めるときにロックを取り、分類結果のシートにその回の印があれば止まります。手で再実行したときに二重に集計されると、部署の件数が倍になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 回答 | 回答日時、部署(選択式)、5段階評価5問、自由記述 | 回答のスプレッドシート |
| 部署マスタ | 部署コード、部署名、上の組織、管理職のメールアドレス、在籍人数 | 人事の部署マスタ |
| 区分の定義 | テーマ7区分と感情4区分の名前と説明、迷ったときの決め方の例 | 区分の定義のシート |
| 要対応の定義 | 人事だけに回す記述の種類と、その例 | 区分の定義のシート |
| 前月までの集計 | 部署×テーマ×感情の件数 | 分類結果のシート |
AIに渡すのは、伏せ字にした自由記述と、区分の定義だけです。 部署名も5段階評価の点数も渡しません。部署名を渡すと、AIはその部署らしい分類に寄せてきます。 点数を渡すと、点の低い回答の記述を不満に寄せます。記述そのものだけで区分を決めさせます。
区分の定義が、分類の質を決めます。 テーマの名前だけを渡すと、「残業が続いて上司に相談しにくい」の行き先が毎回揺れます。「業務量の多さそのものが主語なら業務量、相談のしにくさが主語なら上司との関係」のように、迷ったときの決め方を例とともに書いておきます。 これは今の担当2名が迷ってきた記述から作ります。
データの取得方法を決める
回答のシートは、スプレッドシートの範囲をまとめて読みます。回答期間の開始日と終了日で回答日時を絞り、その回の分だけを取り出します。 フォームのイベントの値を使う方法もありますが、この構成はまとめて処理するため、シートから読むほうが単純です。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| その回の自由記述と部署 | 回答のシート(回答日時で絞る) | 分類の対象 |
| 部署の上の組織と在籍人数 | 部署マスタ | 少人数の部署のまとめ先 |
| 管理職のメールアドレス | 部署マスタ | 返送の下書きの宛先 |
| 区分の定義と要対応の定義 | 区分の定義のシート | プロンプトに埋め込む |
| 前月の件数 | 分類結果のシート | 前月との比較 |
Gemini API の鍵はスクリプト プロパティに置きます。 プロパティは文字列のキーと値の組で保存され、アプリ全体の設定を持たせる場所とされています。スクリプトの本文に鍵を書かないでください。 スクリプトの編集権限を持つ人を、人事の担当者に限ります。
API の呼び出しは UrlFetchApp で行います。 muteHttpExceptions を true にすると、失敗した応答でも例外にならずに応答が返るので、状態コードを見て、再試行するか「再分類待ち」にするかを決められます。
AIへ渡す前に整形する
- 回の絞り込み … 回答日時が回答期間に入るものだけを取り出します。期間外の回答は数に入れません
- 空欄と記号だけの記述の除外 … 「特になし」「なし」「—」などは分類せず、「記述なし」として数えます
- 伏せ字 … メールアドレス、社員番号の形の数字、電話番号の形の数字を正規表現で
[伏せ字]に置き換えます - 人名の候補の伏せ字 … 部署マスタの管理職の氏名と、社員名簿の姓が記述に含まれていれば
[氏名]に置き換えます。AIに渡す前に、こちらで消しておきます - 長すぎる記述の扱い … 1件が800字を超えるものは分割せず、そのまま1件として送ります。ただし1回にまとめる件数を減らします
- 部署の回答数の確認 … 部署ごとの自由記述の件数を数え、5件未満の部署には「上の組織にまとめる」の印を付けます
- 20件ずつのまとまりにする … 部署を混ぜて20件ずつに分けます。同じまとまりに1つの部署だけが入らないよう、並び順を回答日時で混ぜます
4番目を軽く見ないでください。 自由記述には「○○さんの指示が毎回変わる」のように、特定の社員の名前が書かれることがあります。 AIに渡す前に消しておけば、要点の下書きに名前が残ることもありません。名簿に無い呼び方(あだ名など)は消せないので、8番目の人の確認で拾います。
7番目で部署を混ぜるのは、まとまりの中の他の記述に引っ張られないためです。 同じ部署の不満が20件並ぶと、AIは中立の記述まで不満に寄せることがあります。
AIに処理させる
させるのは2つです。 1つ目は、自由記述1件ずつにテーマ・感情・要対応の印を付けること。2つ目は、集計が済んだ部署ごとに、件数の多いテーマについて原文を言い換えた要点を書くことです。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| テーマの分類 | 固定の7区分から主なテーマを1つ、関係するテーマを最大2つ | どれにも当たらなければ「その他」 |
| 感情の分類 | 前向き/不満/要望/中立 の4区分 | 両方が混ざるときは主な方。迷えば low_confidence |
| 要対応の印 | ハラスメント、心身の不調、法令違反の疑い、退職の意思のいずれかをうかがわせるか | うかがわせる語があれば印を付ける。迷えば付ける側 |
| 分類の根拠 | 区分を決めた記述の中の語句 | 原文の語句をそのまま写す |
| 部署の要点 | 件数の多いテーマごとに、言い換えた要点を2〜3行 | 件数が少なければ「目立った声なし」 |
要対応の印だけは「迷えば付ける」にしています。 テーマと感情は、迷えば「その他」や低い確信で人に回せば済みます。要対応の記述を見落とすと、対応が1か月遅れます。 付けすぎた分は人事が原文を読んで外せばよく、見落とすより安くつきます。
| させないこと | 理由 |
|---|---|
| 書き手の推定 | 匿名で取ったサーベイの前提を壊す |
| 部署や管理職の良し悪しの評価 | 集計の目的と違う。評価は人が行う |
| 要対応の記述への対応の決定 | 人事が原文を読んで決める |
| 区分にない新しいテーマを作ること | 月ごとの比較ができなくなる |
| 原文の引用を要点に入れること | 言い回しから書き手が分かる |
| 件数の集計 | スクリプトが数える。AIに数えさせない |
いちばん起きやすい失敗は、5行目です。 要点を書かせると、AIは「『会議が多すぎて資料を作る時間がない』という声がありました」のように原文を引用して具体的にしようとします。引用は、部署の人数が少ないほど書き手の見当をつけやすくします。 言い換えを指示し、さらに原文と同じ8文字以上の並びが要点に残っていないかをスクリプトで確かめます。
指示内容を固定する
1つ目の指示(分類)は次のとおりです。
あなたは人事部で、社員向けアンケートの自由記述を分類する立場です。
記述ごとに、決められた区分の中から選んでください。新しい区分を作らないでください。
【テーマ(主なテーマを1つ、関係するテーマを最大2つ)】
{theme_definitions}
(各テーマの説明と、迷ったときの決め方の例を含む)
【感情(1つ)】
- positive ... 前向き・満足・感謝
- negative ... 不満・困りごと
- request .... 具体的な要望・提案
- neutral .... 事実の報告など、どれにも当たらない
【要対応の印(当てはまるものをすべて)】
- harassment ... 言動による嫌がらせ・威圧をうかがわせる
- health ....... 心身の不調・眠れない・限界などをうかがわせる
- compliance ... 法令や社内規程に反する行為の疑い
- resignation .. 退職や異動を強く考えていることをうかがわせる
うかがわせる語句があれば印を付けてください。迷ったときは付けてください。
【厳守事項】
- 書いた人が誰か、どの部署かを推測しないでください。
- 部署や上司の良し悪しを判断しないでください。
- evidence には、区分を決めた語句を記述からそのまま写してください。
- 記述の内容が短く区分を決めきれないときは、theme を other、
confidence を low にしてください。
- [伏せ字][氏名]の中身を推測しないでください。
- 入力の id をそのまま返し、件数を増やしたり減らしたりしないでください。
【記述(id と本文)】{comments}
2つ目の指示(部署の要点)は次のとおりです。
あなたは人事部で、部署の管理職へ返す要点の下書きを書く立場です。
次の件数の表と、テーマごとの記述をもとに、件数の多いテーマを最大3つ選び、
テーマごとに要点を2〜3行で書いてください。
【厳守事項】
- 記述の文をそのまま引用しないでください。必ず言い換えてください。
- 特定の出来事・日付・会議名・案件名・人数など、書いた人が分かる具体を書かないでください。
- 「〜という声が複数ありました」のように、件数の表の範囲で書いてください。
件数が1件だけのテーマは要点に書かないでください。
- 部署や管理職の良し悪しを評価しないでください。改善策を指示しないでください。
- 要対応の印が付いた記述は渡していません。触れないでください。
【件数の表】{counts}
【テーマごとの記述(伏せ字済み)】{comments_by_theme}
「件数が1件だけのテーマは書かない」が、匿名を守るもう一つの線です。 1件だけの声は、それを書いた人と結び付きやすいからです。1件の声は人事が原文で読み、要点からは外します。
部署の要点を作るときは、要対応の印が付いた記述を最初から外して渡します。 指示で「触れない」と書くだけでなく、入力に入れないことで守ります。
出力形式を固定する
分類は次の形のJSONで受け取ります。 response_format の schema で、theme と sentiment と flags の値を enum で列挙しておきます。
{
"results": [
{
"id": "R2026-10-0137",
"theme_main": "workload",
"theme_sub": ["manager_relation"],
"sentiment": "negative",
"flags": [],
"confidence": "high | low",
"evidence": "締め切りが重なって毎週残業"
}
]
}
1つ目の理由は、enum で区分を決めた値の中に閉じ込められることです。 自由な文で返させると「業務負荷」「仕事量」「忙しさ」が別の区分として並び、集計のたびに名寄せが要ります。 それでも公式の説明では値の確かめはアプリケーションで行うようにとあるので、スクリプトで区分の一覧と照らし、外れたものは「再分類待ち」にします。
2つ目は、id で入力と出力を突き合わせられることです。 20件送って19件しか返らない、同じ id が二度返る、といったことをスクリプトで見つけられます。数が合わないまとまりは、まとまりごと送り直します。
3つ目は、flags を部署の集計と別の道に流せることです。 flags が空でない記述は、部署の要点の入力から外し、人事の要対応の一覧にだけ載せます。
部署の要点は次の形で受け取ります。
{
"dept_code": "D14",
"highlights": [
{ "theme": "workload", "count": 9, "summary": "" }
],
"no_clear_theme": false
}
count はAIに数えさせず、スクリプトが入れた値をそのまま返させます。 返ってきた count が件数の表と違えば、その部署の要点は使いません。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 回答のスプレッドシート | 読み取りのみ | その回の自由記述と部署 |
| 部署マスタ・区分の定義 | 読み取りのみ | まとめ先、宛先、区分の説明 |
| Gemini API | UrlFetchApp で呼び出し | 分類と、部署の要点の下書き |
| 分類結果のシート | 書き込み | 1件ごとの区分、部署×テーマ×感情の件数 |
| Gmail | 下書きの作成 | 管理職ごとの返送メールの下書き |
管理職へのメールは下書きまでにします。 人事の担当が要点を読み、書き手が分かる言い回しが残っていないかを確かめてから送ります。自動で送ると、確認の前に要点が管理職に届きます。
要対応の一覧は、人事の責任者と担当だけが開けるシートに分けて書きます。 分類結果のシートと同じブックに置くと、共有の範囲を広げたときに一緒に見えてしまいます。
人が確認する
- 要対応の一覧を最初に読む … 印が付いた記述を原文で読み、対応するかを決めます。付けすぎを外すのも人の仕事です
- 「その他」と
lowの記述を読む … 区分を直したら、直した区分を結果のシートに書きます - 部署の要点を読む … 書き手が分かる具体(出来事、時期、少人数の役割名など)が残っていないかを見て、残っていれば消します
- 少人数の部署のまとめ先を確かめる … 上の組織にまとめた部署が、まとめた先でも5件未満なら、その回は返しません
- 送る … 下書きを確かめてから、人が送ります
3番目を省かないでください。 AIが言い換えても、「新しい評価制度の説明会のあと」のような時期の手がかりが残ることがあります。部署の人数が少ないほど、その手がかりだけで書き手の見当がつきます。
目標は、480件をならして1件1分です。 要対応と「その他」と low を合わせて1〜2割ほどを人が原文で読み、残りは集計の表と要点を読むだけ、という想定です。
例外に対処する
| 起きること | 対応 |
|---|---|
| API が失敗の状態コードを返す | そのまとまりを最大2回送り直し、だめなら「再分類待ち」にして翌朝の実行で続ける |
| 返ってきた区分が決めた値の外 | その件を「再分類待ち」にし、単独で送り直す。2回外れたら人へ |
| 返ってきた件数が送った件数と違う | まとまりごと送り直す |
| 6分に近づいた | どこまで終わったかを記録して止め、次のトリガーで続きから |
| 部署を選ばずに回答した | 「部署不明」として全社の集計にだけ入れる |
| 自由記述が外国語 | そのまま分類させる。要点の下書きは日本語で書かせる |
| 部署の自由記述が5件未満 | 上の組織にまとめる。まとめても5件未満ならその回は返さない |
| 要点に原文と同じ並びが残った | その部署の要点を作り直す。2回続けば人が書く |
| 組織変更で部署コードが変わった | 部署マスタの旧コードと新コードの対応を見て、前月との比較をつなぐ |
いちばん多いのは、下から3行目と、少人数の部署の扱いです。 どちらもAIの精度ではなく、匿名を守る線の問題です。線を下げて返す部署を増やすより、返さない回があってよいと先に決めておくほうが、回答する側の信頼を保てます。
記録を残す
- その回の回答期間、送った件数、分類できた件数、「再分類待ち」の件数
- 1件ごとの区分(
theme_main、theme_sub、sentiment、flags、confidence、evidence) - 人が区分を直した記録 … どの記述を、どの区分からどの区分へ変えたか
- 部署×テーマ×感情の件数と、上の組織にまとめた部署の一覧
- 管理職に送った要点の最終版と、送った日時
- そのとき使った区分の定義の版
2つ目の記録には、自由記述の原文を持たせません。 原文は回答のシートにあり、結果のシートには id と区分だけを残します。原文の写しを増やすほど、見られる場所が増えます。
最後の行は、区分の定義を直したときに効きます。 定義を変えると、前の月の件数と並べられなくなります。どの月がどの版で分類されたかが残っていれば、比べてよい範囲が分かります。
人が直した記録は、区分の定義の改善に使います。 毎月同じ型の記述が直されているなら、迷ったときの決め方の例をその型で書き足します。
04実装レベルの3段階
本記事が想定するのは半自動化です。 管理職への送信と、要対応の記述への対応は人が行います。1件4分が1分になるのはこの段階です。 本格構成に進むのは、半自動化を3か月ほど回して、人が直した区分の記録がたまってからにしてください。 直された型が分かれば、定義の改善案を作らせる材料がそろいます。記録が無いまま改善案を作らせると、AIが自分の分類に合わせて定義を書き換える形になります。
05工数削減シミュレーション
導入後 480件 × 1分 ÷ 60 = 8 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 社員が数百名ほどで、毎月または隔週に Google フォームで短い社員アンケート(パルスサーベイ)を取り、自由記述を人事の担当者が読んで分類している会社。自由記述が月に数百件あり、読み終わる前に次の回が来てしまう場合。管理職に部署の結果を返したいが、誰が書いたか分かってしまうことを心配して返し方が決まっていない場合。Google Workspace を使っていて、スクリプトを動かせる担当者がいる場合。
- 社員が数十名で、自由記述が月に数十件しか無い場合(人が読んだほうが早く、匿名性も保ちにくい)。サーベイを外部の専用サービスで取っており、そのサービスに分類と集計の機能がすでにある場合。自由記述を記名で取っており、個人の評価や処遇に使うことを前提にしている場合(この構成は個人を特定しない集計のためのものです)。AIに部署や管理職の良し悪しを判定させたい場合。
07最小構成で試す方法
- 前回のサーベイの自由記述から、部署を混ぜて100件を取り出す(氏名などは手で伏せてから)
- 今の担当2名が付けた区分を、その100件について並べておく
- 区分の定義(テーマ7区分と感情4区分、迷ったときの決め方の例)を文章にする
- 手元のAIサービスの画面に、定義と100件を貼り、「定義の区分の中から1つずつ選び、根拠の語句を写してください。新しい区分を作らないでください」と指示する
- AIの区分と、担当2名の区分を突き合わせる
100件は、社内で使ってよいと決まっている AI サービスで行ってください。 個人の利用登録のサービスに社員の声を貼らないでください。
| 出てきた内容 | 判断 |
|---|---|
| 担当2名の区分とおおむね同じ | スクリプトでの自動化に進む |
| 担当2名の区分どうしが割れていた記述で、AIも揺れる | 定義の決め方の例を書き足す。 構成は有効 |
| AIが新しい区分を作る、原文を引用する | 指示と構造化出力の enum で直る |
2行目が出ることは珍しくありません。 それは、これまで担当者の癖で件数が動いていた記述が、どこにあったかが分かったということです。AIを入れる前に、区分の定義を詰める材料になります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 毎月ちがう切り口で要約される | 区分を固定し、enum で閉じ込める。 新しい区分は作らせない |
| 同じ記述が月によって別の区分になる | 迷ったときの決め方の例を定義に書き足す |
| 要点に原文が引用される | 言い換えを指示し、原文と同じ並びが残っていないかをスクリプトで確かめる |
| 少人数の部署で書き手が分かる | 5件未満は上の組織にまとめる。 まとめても足りなければ返さない |
| 要対応の記述が部署の要点に混ざる | flags が付いた記述を要点の入力から外す |
| 部署名を渡して分類が寄る | 部署名と点数をAIに渡さない |
| 6分の上限で止まる | 20件ずつまとめ、どこまで終わったかを記録して続きから再開 |
| 手で再実行して件数が倍になる | ロックを取り、その回の印があれば止まる |
| 無料の枠で社員の声を送る | 有料の枠を使う。 無料の枠は人が入出力を読むことがある |
| 鍵をスクリプトの本文に書く | スクリプト プロパティに置き、編集権限を絞る |
| 組織変更で前月と比べられない | 部署マスタに旧コードと新コードの対応を持たせる |
上の3行が、運用に乗るかどうかを決めます。 分類の値が揺れれば月ごとの比較ができず、要点に原文が残れば管理職に返せません。どちらもAIの賢さではなく、区分と出口の設計で守るものです。
下から3行目は、試すときに起きやすい失敗です。 最小構成の100件を、個人の登録のサービスや無料の枠で試さないでください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 社員の自由記述(職場への不満、上司との関係、心身の状態に触れるものを含む)、所属部署、そして管理職のメールアドレスです。
- 匿名で取ったものを、特定しようとしない … AIにも人にも、書き手を推定させない設計にします。フォームでメールアドレスを集めない設定のまま運用し、スクリプトの側でも回答日時と部署を組み合わせて個人を絞り込む集計をしません
- 原文を見る人を絞る … 原文は人事の担当と責任者だけが見ます。管理職に返すのは件数と言い換えた要点だけです
- 要対応の記述は人事だけで扱う … 管理職本人が関わっている可能性があります。部署の要点の入力から外し、別の権限のシートに置きます
- 有料の枠で使う … Gemini API の規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされ、無料のサービスには機密や個人の情報を送らないよう書かれています
- 個人の評価に使わない … この集計は部署の状態を見るためのものです。サーベイの結果を管理職の評価に直結させると、管理職が部下の回答を気にするようになり、回答の中身が変わります
- 回答する社員に使い方を伝える … 自由記述をAIで分類すること、原文を見るのは人事だけであること、管理職には要約だけが返ることを、サーベイの案内に書いておきます
誤りが起きた場合のリスクは、書き手が分かってしまうことと、要対応の記述を見落とすことの2つです。 前者は要点の引用と少人数の部署から、後者は区分の揺れと担当者の疲れから起きます。前者はスクリプトの線で、後者は「迷えば付ける」で守ります。
10まず何から始めるか
1週目:区分の定義を書く
テーマ7区分と感情4区分の名前と説明を書き、今の担当2名が迷ってきた記述を10件ほど集めて、どちらに入れるかを決めた例を添えます。 要対応の4種類の定義も、同じ形で書きます。
2週目:100件で試す
前回の自由記述から部署を混ぜて100件を取り出し、氏名を伏せてから、社内で使ってよいAIサービスで分類させます。担当2名の区分と並べ、割れた記述を定義に書き足します。
3週目:匿名を守る線を決める
何件未満の部署を上の組織にまとめるか、要点に何を書かないかを、人事の責任者と決めます。 あわせて、サーベイの案内に「自由記述はAIで分類する」「原文は人事だけが見る」を書き足します。
4週目:スクリプトで分類と集計までをつなぐ
回答期間の終了翌日に動くトリガーを置き、分類と部署ごとの件数の集計までを作ります。この時点では管理職へ返さず、人事の中で結果を見ます。
2か月目: 部署の要点の下書きと、メールの下書きを足し、人事が確かめてから管理職へ返します。3か月目以降: 人が直した区分の記録を見て定義を直し、1件4分が何分になったかを実測します。回答期間の終了から数日で管理職に返せるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導型のトリガーが毎分から毎月までの間隔で動かせること。フォームの送信などのイベントのトリガーがあること。インストール型トリガーは作成した人のアカウントで実行されること | Google: Installable triggers | 2026-10-07 |
スプレッドシートのフォーム送信のイベントが values・namedValues・range を持つこと。時間主導型のイベントの項目 | Google: Event objects | 2026-10-07 |
| 1回の実行が6分まで、トリガーの合計実行時間が Workspace のアカウントで1日6時間、URLの呼び出しが1日100,000回、プロパティの値が9KBまでであること | Google: Quotas for Google Services | 2026-10-07 |
UrlFetchApp の fetch・fetchAll、muteHttpExceptions を true にすると失敗の応答でも例外にならず応答が返ること | Google: Class UrlFetchApp | 2026-10-07 |
| プロパティがキーと値の文字列で保存され、スクリプト プロパティがアプリ全体の設定に使われること | Google: Properties Service | 2026-10-07 |
MailApp の送信と、htmlBody・cc・name などのオプション | Google: Class MailApp | 2026-10-07 |
構造化出力が /v1beta/interactions の response_format(mime_type に application/json、schema)で指定できること。enum で選択肢を列挙できること。値はアプリケーションで確かめるよう書かれていること | Google: Structured outputs(Gemini API) | 2026-10-07 |
| 有料のサービスではプロンプトと応答を製品の改善に使わないこと。無料のサービスでは人が入出力を読むことがあり、機密や個人の情報を送らないよう書かれていること。利用者が18歳以上であること | Google: Gemini API Additional Terms of Service | 2026-10-07 |
匿名を守る線(何件未満をまとめるか)と、要対応の記述への対応の手順は、自社の人事と産業保健の担当で決めてください。 本記事は公式ページで確認できた製品の仕様だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0782)についてのご相談はこちらから。
