労働組合の執行部が、フォームで集めた職場の要望を職場とテーマで分け、会社との協議に出す要求項目の案と回答状況の一覧を作る
組合員が Google フォームで出した職場の要望を、届いたそばからテーマに分け、既に会社へ出している要求のうち近いものと結び付けます。月に一度、職場とテーマで集計した要求項目の案と、会社の回答状況の一覧を作ります。
- 生成AI
- ChatGPT/Claude
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- その他/医療/物流/製造
- 対象部門
- 人事
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- 人手が足りない/属人化している/情報が見つからない
- AIで行う処理
- 分類
- 主な効果
- 属人化解消/工数削減/検索時間短縮
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 書記がフォームの回答のスプレッドシートを開き、前回見たところから1件ずつ読む
- 内容を読んでテーマ(賃金・手当、労働時間・休暇、安全衛生、設備・職場環境、人員・配置、教育・制度、その他)を手で付ける
- 個人の相談と思われるものは、書記長に転送して一覧から外す
- 要求の台帳を開き、同じような要求を前に出していないかを探す
- 月末に、テーマと支部ごとに件数を数え、要求項目の案を文章にまとめる
- 労使協議の記録から、前に出した要求への会社の回答を拾い、回答状況の一覧を作り直す
- 人組合員がフォームで要望を出す
- 自動回答がスプレッドシートに入ったことをきっかけに Apps Script が動く
- 自動要望の本文と、同じテーマの候補になりうる要求の台帳の一覧を OpenAI API に渡し、分類の結果を JSON で受け取る
- 自動個人の相談と判定されたものは、書記長だけが見られるシートに移し、書記長へ知らせる
- 自動安全に関わるものは、執行部の3名にすぐ知らせる
- 自動それ以外は、テーマ・支部・近い要求の候補を付けて要望の一覧に書く
- 人書記が週に一度、要望の一覧で分類と近い要求の候補を確かめ、直す
- 自動執行委員会の10日前に、支部とテーマで集計し、要求項目の案と回答状況の一覧を作る
- 人執行部が案を直し、執行委員会に出す
各工程の詳しい説明を読む
- 書記がフォームの回答のスプレッドシートを開き、前回見たところから1件ずつ読む
- 内容を読んでテーマ(賃金・手当、労働時間・休暇、安全衛生、設備・職場環境、人員・配置、教育・制度、その他)を手で付ける
- 個人の相談と思われるものは、書記長に転送して一覧から外す
- 要求の台帳を開き、同じような要求を前に出していないかを探す
- 月末に、テーマと支部ごとに件数を数え、要求項目の案を文章にまとめる
- 労使協議の記録から、前に出した要求への会社の回答を拾い、回答状況の一覧を作り直す
(a)読んで仕分ける手が足りない。 300件を1件6分で読むと月30時間です。職場の仕事と兼ねている3名には重く、月末にまとめて読むことになります。 その間、安全に関わる要望が数週間読まれずに残ることがあります。
(b)同じ要望が前にも出ていたかが分からない。 4番目は、台帳を言葉で検索するしかありません。「駐車場が暗い」と「夜勤明けの帰り道の照明」は同じ話ですが、言葉が違うと検索に当たりません。 結果として、半年前に出した要求と同じ要求を新しく出し、会社から「前に回答した」と言われることがあります。
(c)個人の相談の切り分けが人しだい。 3番目で何を個人の相談とみなすかは、書記の判断です。職場全体の話のように書かれた個人の相談が一覧に残り、執行委員会の資料で本人が分かってしまったことがありました。
(d)まとめ方が書記長しだい。 5番目の要求項目の案は、書記長が長年の経験で書いています。どの要望を束ね、どれを外したかが記録に残らないので、組合員から「出した要望はどうなったのか」と聞かれても答えられません。
- 【人】 組合員がフォームで要望を出す
- 【自動】 回答がスプレッドシートに入ったことをきっかけに Apps Script が動く
- 【自動】 要望の本文と、同じテーマの候補になりうる要求の台帳の一覧を OpenAI API に渡し、分類の結果を JSON で受け取る
- 【自動】 個人の相談と判定されたものは、書記長だけが見られるシートに移し、書記長へ知らせる
- 【自動】 安全に関わるものは、執行部の3名にすぐ知らせる
- 【自動】 それ以外は、テーマ・支部・近い要求の候補を付けて要望の一覧に書く
- 【人】 書記が週に一度、要望の一覧で分類と近い要求の候補を確かめ、直す
- 【自動】 執行委員会の10日前に、支部とテーマで集計し、要求項目の案と回答状況の一覧を作る
- 【人】 執行部が案を直し、執行委員会に出す
7番目で人が見るのは、分類の結果です。 要望の本文を白紙から読んでテーマを付けるのではなく、付いたテーマと候補が正しいかを見る作業になります。
4番目と5番目は、週に一度の確認を待ちません。 個人の相談と安全の話は、届いたその日のうちに人へ渡すことがこの構成の目的の一つです。
8番目の集計は、執行部の手直しを前提にした案です。 支部とテーマの件数、近い要求ごとの新しい要望の数、安全に関わる件数までは数字で出ますが、どれを今月の協議に出すかは、会社との関係や時期を見て執行部が決めます。 案に載った順番も、件数の多い順に並べただけのものです。
02今回想定するシステム構成
Google フォーム(職場の要望) │ ▼【トリガー】回答がスプレッドシートに入る(フォーム送信のトリガー) Google Apps Script ├──▶ 同時に届いた回答を順に処理する(スクリプトのロック) ├──▶ 要求の台帳から、未解決の要求の一覧を読む ▼ OpenAI API ── テーマ、個人の相談か、安全に関わるか、近い要求の候補を JSON で返す ▼ Google Apps Script ├──▶ 個人の相談 … 書記長だけのシートへ移し、書記長に知らせる ├──▶ 安全に関わる … 執行部の3名に知らせる └──▶ それ以外 … 要望の一覧に書く ▼【トリガー】執行委員会の10日前(時間主導型のトリガー) 集計 ── 支部×テーマの件数、要求項目の案、回答状況の一覧 ▼ 【人】執行部が直して執行委員会へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make |
| 生成AI | OpenAI API(Responses API、構造化出力) | Claude API |
| 保管 | Google スプレッドシート(フォームの回答、要望の一覧、要求の台帳、労使協議の記録、個人の相談、処理ログ) | - |
| 入力 | Google フォーム | - |
新しく足すのは、Apps Script と、要望の一覧・個人の相談・処理ログのシートだけです。 フォームと要求の台帳と労使協議の記録は今のものを使い、要求の台帳には書き込みません。 台帳に要求を足すのは、執行委員会で決めたあとに人が行います。
すべてを組合が契約した Google Workspace の中に置きます。 会社が管理するアカウントやファイル共有の場所に置くと、会社の管理者が要望の中身を見られる状態になりえます。 組合員が会社に知られずに要望を出せることが、この仕組みの前提です。
03どうやって実装するのか
処理の起点を決める
フォームの回答がスプレッドシートに入ったことを起点にします。 Apps Script のインストール型のトリガーには、フォームの送信で動くものが2種類あり、フォーム側のものと、フォームの回答先のスプレッドシート側のものがあります。この構成ではスプレッドシート側のトリガーを使います。 公式のページでは、スプレッドシート側のフォーム送信のイベントは、質問の名前と値をまとめた namedValues、スプレッドシートの並びと同じ順の values、書き込まれたセルの range を持つとされています。range から行の番号が分かるので、処理の結果を同じ行の横の列に書けます。
回答はまとめて届くことがあります。 職場集会のあとに数十人が続けて出すと、スクリプトが同時にいくつも動きます。要望の一覧に同時に書き込むと行が重なるので、書き込みの前にスクリプトのロックを取ります。 公式のページでは、スクリプトのロックで守った部分は、利用者が誰であっても同時には実行されないとされています。ロックが取れなかったものは「未処理」の印を残して終わり、1時間ごとの時間主導型のトリガーで未処理の行を拾い直します。
集計は、執行委員会の10日前の朝に時間主導型のトリガーで動かします。 公式のページでは、時間主導型のトリガーは毎分から月1回までの間隔で動かせるとされています。執行委員会の日は月ごとに変わるので、毎朝動いて「労使協議の日程」のシートを見て、10日前の日だけ集計を作る形にします。
インストール型のトリガーは、作った人のアカウントで動きます。 書記長個人のアカウントで作ると、役員が改選で替わったときに止まります。執行部で共有している組合のアカウントで作ります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 要望 | 受付日時、支部、職種、要望の内容、氏名(任意)、連絡の希望 | フォームの回答のシート |
| 要求の台帳 | 要求ID、テーマ、要求の文、対象の支部、会社へ出した日、状態(未回答・検討中・回答済み・合意) | 要求の台帳のシート |
| 労使協議の記録 | 協議の日、要求ID、会社の回答の要旨、次の約束 | 労使協議の記録のシート |
| 協議の日程 | 執行委員会の日、労使協議の日 | 日程のシート |
質を決めるのは、要求の台帳の「要求の文」です。 近い要求の候補は、台帳の文と新しい要望の本文を比べて選びます。台帳の文が「照明の件」のように短いと、何の照明かが分からず候補に挙がりません。「〇〇工場の夜勤明けに使う第2駐車場の照明を増やす」のように、場所と困りごとが分かる文にしておきます。
AIに渡すのは、要求の台帳のうち状態が「合意」以外のものだけです。 合意して片づいた要求まで渡すと、候補が古い話に引っ張られます。
データの取得方法を決める
すべて同じスプレッドシートの中にあるので、Apps Script から読むだけです。 要望の本文はイベントの namedValues から取り、台帳はシートの範囲をまとめて読みます。
| 取るもの | どう取るか | 何に使うか |
|---|---|---|
| 要望の本文と支部・職種 | フォーム送信のイベントの namedValues | 分類の対象 |
| 書き込まれた行 | イベントの range | 結果を書く行 |
| 未解決の要求の一覧 | 台帳から状態が「合意」以外の行 | 近い要求の候補 |
| 会社の回答 | 労使協議の記録を要求IDで引く | 回答状況の一覧 |
支部と職種は、フォームの選択式の値をそのまま使います。 AIに本文から支部を推し量らせることはしません。選択式の値が空のとき(古いフォームの回答など)だけ、「支部不明」として書記の確認に回します。
氏名は AI に渡しません。 任意で書かれた氏名は、連絡の希望がある人に書記長が連絡するときにだけ使い、分類の材料にはしません。
AIへ渡す前に整形する
- 空の回答と試しの回答を外す … 本文が空、または「テスト」だけのものは処理しません
- 本文の長さを確かめる … 極端に長いものは、先頭から決めた長さまでで切り、切ったことを印に残します
- 氏名と連絡先らしい文字列を伏せる … 本文の中に書かれた電話番号やメールアドレスを、決まった記号に置き換えてから渡します
- 同じ人の連続した送信をまとめる … 同じ支部から数分以内に同じ本文が届いたら、二重送信として1件にします
- 未解決の要求を短い一覧にする … 要求ID、テーマ、要求の文、対象の支部の4つだけを1行ずつ並べます
- 安全の言葉を拾っておく … 「けが」「転倒」「挟まれ」「熱中症」など、決めておいた言葉が本文にあれば印を付けます
3番目は、AIの側で外せないものを先に外す処理です。 要望の本文に「私(内線1234)は」のように書く人がいます。本人が分かる情報は、渡す前にスクリプトで伏せます。
6番目は AI の判定と別に持ちます。 AIが「安全に関わらない」と判定しても、言葉の印が付いていれば執行部へ知らせます。安全の話を見逃す側の誤りだけは、二重に防ぎます。
AIに処理させる
させるのは、1件の要望について次の5つを決めることです。
| 決めること | 選び方 | 判断できないとき |
|---|---|---|
| 種類 | 職場の要望/個人の相談/組合への意見・質問 | 迷ったら個人の相談 |
| テーマ | 賃金・手当、労働時間・休暇、安全衛生、設備・職場環境、人員・配置、教育・制度、その他 | その他 |
| 安全に関わるか | けが・健康の危険が書かれているか | 迷ったら関わる |
| 要望の要旨 | 一文で。固有の人名を含めない | 空にして書記へ |
| 近い要求の候補 | 未解決の要求の一覧から最大3つの要求ID | 無ければ空 |
「迷ったら個人の相談」「迷ったら安全に関わる」としているのは、誤りの重さが違うためです。 職場の要望を個人の相談と誤っても、書記長が読んで一覧に戻すだけです。逆に、個人の相談を職場の要望と誤ると、本人が分かる形で資料に載ります。
| させないこと | 理由 |
|---|---|
| 要求にするかの判断 | 執行委員会が決めること |
| 会社の回答の評価 | 回答が十分かは執行部が判断する |
| 要望を出した人の推測 | 本文の書きぶりから誰かを推し量らない |
| 近い要求の確定 | 出すのは候補まで。結び付けるのは書記 |
| 要望の取捨 | 件数が少ない要望も一覧から外さない |
最後の行を書いているのは、少数の声を残すためです。 件数の多いテーマだけを要求にすると、人数の少ない職種の困りごとがいつまでも上がりません。一覧には全件を残し、要求にするかは人が決めます。
テーマの7つは、組合が決める分け方です。 執行委員会の担当の分け方に合わせておくと、集計がそのまま担当ごとの資料になります。担当の分け方が変わったら、指示のテーマの一覧と構造化出力の列挙の値を同時に直します。 片方だけを直すと、指示にないテーマが返ってきたり、指示にあるテーマを返せなかったりします。過去の要望のテーマは付け直さず、いつの分け方で付けたかを処理ログに残しておきます。
指示内容を固定する
あなたは労働組合の執行部で、組合員から届いた職場の要望を仕分ける担当です。
以下の要望1件について、決められた項目だけを返してください。
【kind の選び方】
- workplace_request … 職場の設備・制度・働き方について、職場全体に関わる要望
- personal_consultation … 特定の人との関係、本人の処遇・評価・健康、
ハラスメントなど、本人に関わる相談
- union_feedback … 組合の運営への意見や質問
職場の話のように書かれていても、特定の人の言動や本人の処遇に触れていれば
personal_consultation を選んでください。迷ったら personal_consultation です。
【theme の選び方】
wages / hours_leave / safety_health / facilities / staffing / training_system / other
【厳守事項】
- safety_related は、けが・病気・事故の危険が書かれていれば true。迷ったら true。
- summary は一文で書き、人名・役職名・個人が分かる表現を入れないでください。
- related_requests は【未解決の要求】の要求IDから、同じ困りごとを扱うものを
最大3つ選んでください。一覧にない要求IDを作らないでください。
同じ困りごとが無ければ空の配列にしてください。
- 要求にすべきか、会社の回答が妥当かは書かないでください。
- 要望を出した人が誰かを推し量らないでください。
- 判断の材料が足りないときは note に理由を書いてください。
【支部】{branch} 【職種】{job_type}
【要望の内容】{request_text}
【未解決の要求】{open_requests}
「職場の話のように書かれていても」の一文が、この指示の要です。 「うちの職場では残業を断ると評価が下がる雰囲気がある」は職場の話の形をしていますが、特定の上司を思い浮かべて書かれていることが多く、本人が分かる場合があります。 指示に書かないと workplace_request に入ります。
「一覧にない要求IDを作らない」も外せません。 何も言わないと、それらしい形の要求IDを作って返すことがあります。
出力形式を固定する
OpenAI API の Responses API で、構造化出力を使って次の形の JSON を受け取ります。 公式のページでは、text.format に json_schema を指定して strict を true にし、すべての項目を required にして、additionalProperties: false を付けることとされています。省いてよい項目は、型に null を加えて表します。
{
"kind": "workplace_request | personal_consultation | union_feedback",
"theme": "wages | hours_leave | safety_health | facilities | staffing | training_system | other",
"safety_related": false,
"summary": "第2駐車場の照明が暗く、夜勤明けに足元が見えない",
"related_requests": ["R-2026-031"],
"note": null
}
1つ目の理由は、振り分けをスクリプトの条件だけで書けることです。 kind が personal_consultation なら個人の相談のシートへ、safety_related が true なら知らせる、という分岐を文章の解釈なしに書けます。
2つ目は、related_requests を検算できることです。 返ってきた要求IDが台帳にあるかをスクリプトで確かめ、無いIDが入っていたらその要望を書記の確認に回します。
3つ目は、断りの応答を見分けられることです。 公式のページでは、安全上の理由でモデルが応じないとき、出力に refusal の項目が入るとされています。ハラスメントの相談のように重い内容で断りの応答が返ってきたら、分類せずに個人の相談として扱います。 迷ったら個人の相談、という方針と同じ向きに倒します。
月末の集計では、要望の一覧から次の3つを作ります。
| 作るもの | 中身 | 作り方 |
|---|---|---|
| 支部×テーマの件数表 | 件数、安全に関わる件数、近い要求の有無 | スクリプトで集計 |
| 要求項目の案 | テーマごとに、新しい要求の候補と、催促する既存の要求 | 要旨を束ねて案の文にする |
| 回答状況の一覧 | 要求ID、出した日、会社の回答の要旨、経過月数、関連する新しい要望の数 | スクリプトで台帳と記録を結ぶ |
回答状況の一覧の「関連する新しい要望の数」が、催促の根拠になります。 「検討中」のまま半年たった要求に、今月も新しい要望が5件結び付いていれば、それをそのまま協議の場で示せます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| フォームの回答のシート | フォーム送信のトリガー | 回答ごとにスクリプトを動かす |
| OpenAI API | UrlFetchApp.fetch | 1件ずつ分類の結果を受け取る |
| 要望の一覧のシート | Apps Script の書き込み(ロックを取ってから) | 分類の結果を書く |
| 個人の相談のシート | 書記長だけに共有したファイル | 個人の相談を移す |
| メール | 組合のアカウントから執行部へ | 個人の相談と安全の知らせ |
個人の相談は、別のファイルに移します。 同じファイルの別のシートにすると、ファイルを共有した人には見えてしまいます。書記長だけに共有したファイルに書き、要望の一覧からは行ごと消して「個人の相談に移した」とだけ残します。
API の呼び出しでは muteHttpExceptions を true にします。 公式のページでは、これを true にすると失敗の応答でも例外を投げずに応答を返すとされています。失敗したらその行に「未処理」の印を残し、1時間ごとの拾い直しに任せます。
人が確認する
- 個人の相談は書記長がその日のうちに読む … 連絡の希望があれば本人に連絡します。職場の要望として一覧に戻すかも、書記長が決めます
- 安全の知らせは執行部が当日中に見る … 支部の役員に現場を確かめてもらいます
- 書記が週に一度、要望の一覧を確かめる … テーマの付け方と、近い要求の候補を見て直します。候補を採るか外すかを決めるのは書記です
- 執行部が要求項目の案を直す … どの要望を束ね、どれを新しい要求にするかを決め、決めた理由を一言ずつ残します
- 執行委員会で決める … 協議に出す要求を確定し、台帳に足します
3番目の確認は1件2分を目安にします。 本文を読み、付いたテーマと候補が合っているかを見るだけです。2分を超える要望が多い週は、テーマの分け方そのものを見直す時期です。
4番目の「決めた理由」は、組合員への説明の材料になります。 「出した要望はどうなったのか」と聞かれたとき、どの要求に束ねたか、なぜ見送ったかを答えられます。
例外に対処する
| 起きること | 対応 |
|---|---|
| ロックが取れない(同時に多数届いた) | 「未処理」の印を残し、1時間ごとの拾い直しで処理する |
| API が応答しない・混み合い | 「未処理」の印を残す。続けて失敗したら書記に知らせる |
| 断りの応答が返る | 個人の相談として書記長へ回す |
| 台帳にない要求IDが返る | 候補を空にして書記の確認に回す |
| 支部が空 | 「支部不明」で書記の確認に回す。本文から推し量らない |
| 本文が極端に長い | 切ったことを印に残し、書記が全文を読む |
| 同じ本文が続けて届く | 二重送信として1件にまとめる |
| 1回の実行が時間切れになる | 未処理の印を見て次の実行で続きを処理する |
最後の行は、Apps Script の上限から来ます。 公式の上限の表では、スクリプトの実行時間は1回あたり6分、同時に動く実行は利用者あたり30です。フォーム送信のトリガーは1件ずつなので普段は収まりますが、拾い直しで未処理の行をまとめて処理するときは、時間を見ながら途中で区切ります。
外部への呼び出しの回数にも上限があります。 公式の表では、URL の取得は個人のアカウントで1日20,000回、Google Workspace のアカウントで1日100,000回です。月300件の分類では届かない数ですが、拾い直しの処理が同じ行を何度も呼ばないよう、処理済みの印を必ず付けます。
記録を残す
- 回答ごとに、処理した日時、渡した本文(伏せた後のもの)、AIが返した JSON の全文
- 書記が直した記録 … テーマや候補を、何から何に変えたか
- 個人の相談に移した記録 … 日時と移した理由(中身は要望の一覧に残さない)
- 安全の知らせを送った日時と、支部での確認の結果
- 要求項目の案に、どの要望を束ねたか、見送ったものとその理由
- 執行委員会で確定した要求と、台帳に足した日
2つ目の「書記が直した記録」は、指示を直す材料になります。 同じテーマの取り違えが続くなら、テーマの説明を指示に足します。
3つ目で中身を残さないのは、ログから本人が分かるのを防ぐためです。 処理ログは執行部の3名が見るので、個人の相談の中身は書記長のファイルにだけ置きます。
5つ目の「束ねた要望と見送った理由」は、次の役員への引き継ぎになります。 改選で執行部が替わっても、どの要求にどの職場の声が積み上がっているかが一覧で残ります。
04実装レベルの3段階
最小構成では300件をさばけません。 1件ずつ貼るので、確かめるための段階です。 本記事の想定は半自動化です。 届いたそばから分類され、書記は週に一度、付いた結果を確かめます。1件6分が2分になるのはこの段階です。 差が大きいのは、②の台帳を探す作業が候補を確かめる作業に変わるからです。 本格構成で足すのは、組合員への報告です。 回答状況の一覧から、「出された要望が、どの要求として協議されたか」を組合の掲示で知らせる下書きを作ります。どこまで掲示するかは執行委員会で決めてから足してください。 段階を飛ばさないでください。 半自動化を3か月回すと、書記が直した記録から、どのテーマの取り違えが多いか、どの支部の要望が個人の相談に寄りやすいかが見えてきます。その傾向を指示に戻してから報告の下書きに進むほうが、組合員に出す文の誤りが減ります。 組合員向けの文は一度掲示すると取り消しにくいので、半自動化の段階で分類の精度に納得できてから足すのが順当です。
05工数削減シミュレーション
導入後 300件 × 2分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 組合員が数百人から数千人いて、職場の要望を Google フォームで常に受け付けている企業内の労働組合。毎月の労使協議に出す要求をまとめる作業が、書記長など少数の役員の経験に頼っている場合。過去に出した要求と会社の回答がスプレッドシートに残っているが、新しい要望と結び付けられていない場合。
- 組合員が数十人で、要望を職場集会で口頭で集めて足りている組合。要望の大半が個人の処遇の相談で、職場全体の要求にまとめるものが少ない場合。会社が管理するアカウントやシステムでしか要望を集められず、執行部だけが見られる場所を用意できない場合。
07最小構成で試す方法
- 先月届いた要望から40件を選ぶ(個人の相談と分かっているものを数件、安全の話を数件入れる)
- その40件に、当時書記が付けたテーマと、個人の相談として外したかを並べる
- 要求の台帳から未解決の要求を書き出す
- 手元の ChatGPT の画面に、第7章の指示と、要望を1件ずつ、未解決の要求の一覧と一緒に貼る
- 返ってきた分類を、当時の書記の判断と並べて比べる
氏名と連絡先は、貼る前に必ず消してください。 試す段階でも、本人が分かる情報を外に出さないことは同じです。
| 出てきた内容 | 判断 |
|---|---|
| 個人の相談をすべて拾えた | スクリプトでつなぐ段階に進む |
| 個人の相談を職場の要望に入れた | 指示の例を足す。直らなければ構成を見直す |
| 近い要求の候補が当たらない | 台帳の要求の文が短すぎる。 文を書き直す |
| テーマの付け方が書記と違う | テーマの説明を足す |
2行目は、件数が少なくても見過ごさないでください。 この構成でいちばん避けたい誤りです。3行目が出ることは珍しくありません。 台帳の要求の文を、場所と困りごとが分かる文に書き直すと、候補の当たり方が変わります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 職場の話の形をした個人の相談が一覧に残る | 指示で「迷ったら個人の相談」を明記する。 試す段階で数件入れて確かめる |
| 個人の相談を同じファイルの別シートに移す | 別のファイルにする。 共有した人には見える |
| 存在しない要求IDが候補に入る | 台帳で検算し、無いIDなら候補を空にする |
| 候補がほとんど当たらない | 台帳の要求の文を、場所と困りごとが分かる文にする |
| 同時に届いた回答で行が重なる | 書き込みの前にスクリプトのロックを取る |
| 書記長のアカウントでトリガーを作る | 作成者のアカウントで動く。組合の共有アカウントで作る |
| 会社のアカウントでフォームを作る | 会社の管理者が見られる状態になりうる。組合の Workspace に置く |
| 本文に書かれた電話番号を渡してしまう | 渡す前にスクリプトで伏せる |
| 件数の少ない要望が案から消える | 一覧には全件を残す。要求にするかは人が決める |
| 安全の話を AI が見逃す | 言葉の印を別に持ち、どちらかで知らせる |
| テーマを変えたのに古いテーマが返る | 指示のテーマの一覧と列挙の値を同時に直す |
| 合意済みの要求が候補に出続ける | 台帳の状態を協議のたびに更新する。更新は人が行う |
| 役員の改選後に知らせが届かない | 知らせの宛先を役員の一覧のシートから読む。スクリプトに直接書かない |
上の2行が、この構成の失敗のほとんどです。 どちらも、個人の相談が本人の分かる形で人の目に触れる失敗です。組合員が要望を出さなくなる理由として、これより重いものはありません。
会社のアカウントの行も、最初に決めてください。 組合員の要望を会社の管理下の場所に置くと、実際に見られるかどうかにかかわらず、組合員が安心して書けなくなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 組合員の要望の内容、任意で書かれた氏名と連絡の希望、支部と職種、そして個人の相談(ハラスメント、処遇、健康)の内容です。組合員であること自体も、会社に対して慎重に扱う情報です。
- 会社の管理する場所に置かない … フォーム、スプレッドシート、スクリプト、API キーをすべて組合が契約したアカウントに置きます
- 外部へ渡す範囲を、分類に必要なものまでに限る … OpenAI API に渡すのは、伏せた後の本文、支部、職種、未解決の要求の一覧だけです。氏名と連絡先は渡しません
- 個人の相談は書記長だけが見る … 別のファイルにし、役員の改選のたびに共有の相手を見直します
- 要求にするかを AI に決めさせない … 何を会社に求めるかは組合の意思決定です。AIが出すのは分類と候補まで
- 少数の要望を消さない … 件数で並べても、一覧から外さないでください
- API キーをスクリプトに直接書かない … スクリプトのプロパティに置き、スクリプトを編集できるのは執行部に限ります
- API の利用の条件を契約の前に確かめる … 渡したデータが学習に使われるか、どれだけの期間保存されるかを、OpenAI の利用条件と組合の契約の形で確かめ、執行委員会で使ってよいと決めてから本番の要望を流します
誤りが起きた場合のリスクは、個人の相談を職場の要望として資料に載せることと、安全の話を見逃すことの2つです。どちらも「迷ったら重いほうへ倒す」指示と、人の確認で防ぎます。この2つの誤りだけは、件数を減らすより起こさないことを優先してください。
10まず何から始めるか
1週目:要求の台帳を書き直す
未解決の要求について、「要求の文」を場所と困りごとが分かる一文に書き直します。合意済みのものは後回しで構いません。近い要求の候補が当たるかは、ここで決まります。
2週目:40件で試す
先月の要望から40件を選び、氏名と連絡先を消してから、手元の ChatGPT の画面で分類させます。個人の相談をすべて拾えたかを最優先で見ます。
3週目:置き場所と見られる人を決める
組合の Google Workspace の中に、要望の一覧と個人の相談のファイルを分けて作り、誰がどれを見られるかを執行委員会で決めます。 あわせて、安全の言葉の一覧を作ります。
4週目:フォーム送信から一覧までをつなぐ
フォーム送信のトリガーで分類し、要望の一覧と個人の相談のファイルに振り分けるところまで作ります。この時点では集計は作らず、書記が毎日結果を見ます。
2か月目: 月末の集計と回答状況の一覧を足し、執行委員会の資料に使います。3か月目以降: 書記が直した記録を見て指示を直し、1件あたりの確認時間を測ります。組合員から「出した要望はどうなったか」と聞かれたときに、一覧からすぐ答えられるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| フォーム送信のトリガーがフォーム側とスプレッドシート側の2種類あること。時間主導型のトリガーが毎分から月1回まで動かせること。インストール型のトリガーが作成者のアカウントで動くこと | Google: Installable triggers | 2026-10-14 |
スプレッドシート側のフォーム送信のイベントが namedValues・values・range を持つこと | Google: Event objects | 2026-10-14 |
| 実行時間が1回6分、同時実行が利用者あたり30、URL の取得が個人1日20,000回・Workspace 1日100,000回であること | Google: Quotas for Google Services | 2026-10-14 |
| スクリプトのロックで守った部分は、利用者が誰であっても同時に実行されないこと | Google: Class LockService | 2026-10-14 |
muteHttpExceptions を true にすると、失敗の応答でも例外を投げずに応答を返すこと | Google: Class UrlFetchApp | 2026-10-14 |
Responses API の構造化出力を text.format の json_schema と strict で指定し、すべての項目を required、additionalProperties: false にすること。省ける項目を null との共用型で表すこと。断りの応答が refusal で返ること | OpenAI: Structured model outputs | 2026-10-14 |
組合の運営と会社との協議の進め方は、組合の規約と執行委員会の決定に従ってください。 本記事は、要望の仕分けと集計に絞って公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1543)についてのご相談はこちらから。
