社会福祉協議会が Google フォームで受けるボランティアの申込を、活動の定員と条件に照らして受付・調整中・お断りに分け、返信の下書きを作る
Google フォームで届くボランティアの申込を、活動ごとの定員と条件に照らして受付・調整中・お断りの3つに分け、申込者への返信の下書きを Gmail に作ります。 職員は下書きを確かめて送るだけになります。
- 生成AI
- ChatGPT/Claude
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- その他/介護/自治体
- 対象部門
- 総務
- 対象業務
- 分類・仕分け/問い合わせ対応
- 主な課題
- 人手が足りない/問い合わせが多い/確認ミスが多い
- AIで行う処理
- 分類
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 申込がフォームから届き、回答のスプレッドシートに1行が増える
- 職員が1件ずつ開き、希望の活動を活動の一覧で探す
- 定員の残り、締め切り、必須の条件(運転、研修、説明会)を確かめる
- 自由記述を読み、参加の時間や体の具合、質問がないかを見る
- 受付・調整・お断りを決め、活動の一覧の受付数を1つ増やす
- 返信のメールを、ひな形をもとに手で書いて送る
- 人申込者が Google フォームで申し込む(18歳以上であることの確認の欄を含む)
- 自動フォームの送信をきっかけに Apps Script が動き、回答を読む
- 自動18歳以上の確認が無い申込は、AIに渡さず「職員対応」の印を付ける
- 自動ロックを取ってから、活動の一覧で定員の残り・締め切り・必須の条件を確かめ、受付の候補なら仮の枠を押さえる
- 自動Claude API が自由記述と活動の条件を読み、受付・調整中・お断りの区分と理由、返信の下書きを返す
- 自動Gmail に申込者あての下書きを作り、回答のシートの横の列に区分と理由を書く
- 人職員が、区分ごとに下書きを確かめ、直して送る
- 人調整中のものは、申込者に電話やメールで確かめ、受付かお断りかを決める
各工程の詳しい説明を読む
- 申込がフォームから届き、回答のスプレッドシートに1行が増える
- 職員が1件ずつ開き、希望の活動を活動の一覧で探す
- 定員の残り、締め切り、必須の条件(運転、研修、説明会)を確かめる
- 自由記述を読み、参加の時間や体の具合、質問がないかを見る
- 受付・調整・お断りを決め、活動の一覧の受付数を1つ増やす
- 返信のメールを、ひな形をもとに手で書いて送る
(a)定員を超えて受け付けてしまう。 3番目の定員の残りは、5番目で受付数を増やすまで変わりません。2人の職員が同時に同じ活動の申込を処理すると、どちらも「残り1」を見て受け付けます。 後から1人に断りの連絡を入れることになり、いちばん印象の悪い対応になります。
(b)自由記述の読み落とし。 「午前だけ」「車いすを使っています」「初めてで不安です」といった記述は、受付の可否や当日の配置に関わります。集中する日にはひな形どおりの受付の返信を送り、当日になって分かることがあります。
(c)返信が遅れる。 集中する3日間に150件を3名でさばくと、1件6分で15時間です。返信が2〜3日遅れると、「申し込めていますか」という電話が増え、その対応でさらに遅れます。
(d)返信の書きぶりがばらばら。 同じお断りでも、職員によって「定員に達しました」だけのものと、別の日の活動を案内するものがあります。ボランティアの方にとっては、次も申し込むかどうかを決める文面です。
- 【人】 申込者が Google フォームで申し込む(18歳以上であることの確認の欄を含む)
- 【自動】 フォームの送信をきっかけに Apps Script が動き、回答を読む
- 【自動】 18歳以上の確認が無い申込は、AIに渡さず「職員対応」の印を付ける
- 【自動】 ロックを取ってから、活動の一覧で定員の残り・締め切り・必須の条件を確かめ、受付の候補なら仮の枠を押さえる
- 【自動】 Claude API が自由記述と活動の条件を読み、受付・調整中・お断りの区分と理由、返信の下書きを返す
- 【自動】 Gmail に申込者あての下書きを作り、回答のシートの横の列に区分と理由を書く
- 【人】 職員が、区分ごとに下書きを確かめ、直して送る
- 【人】 調整中のものは、申込者に電話やメールで確かめ、受付かお断りかを決める
7番目で職員は、下書きを読んで送るだけになります。 活動の一覧との見比べと返信の文面づくりは自動になり、職員の時間は、自由記述への答えが的確かを確かめることに使われます。
4番目のロックが、第3章の(a)の答えです。 同時に届いた申込でも、定員の確認と仮の枠の押さえを1件ずつ順に行うので、同じ「残り1」を2人に渡すことがありません。
02今回想定するシステム構成
申込者 ── Google フォーム(活動・希望日・条件の確認・自由記述・18歳以上の確認) ▼ 回答がスプレッドシートに書き込まれる 【トリガー】スプレッドシートのフォーム送信(インストール型) Google Apps Script ├── 18歳以上の確認が無い → 「職員対応」の印(AIに渡さない) ├── LockService ── ロックを取る ├── 活動の一覧のシート ── 定員の残り・締め切り・必須の条件・仮の枠 ├── Claude API(UrlFetchApp、構造化出力) │ ── 区分(受付・調整中・お断り)・理由・返信の下書き ├── 回答のシートの横の列 ── 区分と理由を書く └── GmailApp ── 申込者あての下書きを作る(送らない) ▼ 【職員が確かめて送る】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Make、Power Automate |
| 生成AI | Claude API(構造化出力) | OpenAI API |
| 保管 | Google スプレッドシート(回答、活動の一覧) | - |
| メール | Gmail(GmailApp の下書き) | - |
新しく足すのは、Apps Script と、活動の一覧のシートの数列だけです。 フォームと回答のスプレッドシートはいまのものを使い、回答のシートの右に「区分」「理由」「下書き作成」「送信済み」の列を足します。 活動の一覧には「受付数」「仮の枠」「必須の条件」の列を整えます。
きっかけにするのは、スプレッドシートの側のフォーム送信のトリガーです。 公式のページでは、フォーム送信のインストール型トリガーには Google フォームの側とスプレッドシートの側の2種類があります。スプレッドシートの側のイベントには、質問の名前と値の組(namedValues)と、書き込まれた範囲(range)が入ります。 区分と理由を同じ行の横の列に書くので、行の位置が分かる後者を使います。
定員の確認には、LockService のスクリプトのロックを使います。 公式のページでは、LockService はコードの一部が同時に実行されるのを防ぐもので、getScriptLock() はどの利用者からも同時に実行させないロックを返します。ロックは tryLock か waitLock を呼んだ時点で取られます。 募集の直後に申込が重なっても、定員の確認と仮の枠の押さえは1件ずつ進みます。
返信は GmailApp の createDraft で下書きにします。 公式のページでは、createDraft は下書きのメールを作るもので、送信はしません。送るのは職員です。 返信の宛先の表示名や返信先のアドレスは、オプションの name と replyTo で指定できます。
代替候補に Gemini API を挙げていないのは、規約のためです。 Gemini API の追加の利用規約では、API を使うには18歳以上であることが求められ、18歳未満に向けた、または18歳未満が利用しうるサービスに組み込むことが禁じられています。この構成は18歳以上の申込に限りますが、フォーム自体は誰でも開けるため、候補から外しています。
03どうやって実装するのか
処理の起点を決める
フォームの送信ごとに1件ずつ動かします。 申込は募集の直後に集中しますが、1件ずつ処理すれば、送信から数十秒で区分と下書きができます。 まとめて夜に処理すると、定員の仮の枠が翌朝まで押さえられず、その間に届いた申込の扱いが決まりません。
同時に届いた申込は、ロックで順番に並べます。 ロックを待つ時間は30秒までとし、取れなかった申込は「再処理待ち」の印を付けて、5分ごとの時間主導型のトリガーで拾い直します。 公式のページでは、Apps Script の1回の実行は6分まで、同時に動く実行はユーザーあたり30までとされています。募集の直後の重なりは、この範囲に収まる想定です。
もう1つ、毎朝8時の時間主導型のトリガーを置きます。 前の日に作った下書きのうち、まだ送られていないものの件数を職員に知らせます。下書きが溜まったまま返信が遅れることを防ぐためです。 あわせて、調整中のまま2日たった申込の一覧も添えます。仮の枠を外す3日目の前に、職員が申込者に連絡できるようにするためです。
募集は毎月くり返すので、トリガーも毎月作り直しません。 活動の一覧に翌月の行を足すだけで、同じ仕組みがそのまま翌月の申込を受けます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| フォームの回答 | 氏名、連絡先、希望の活動、希望日、運転の可否、研修・説明会の受講、経験、自由記述、18歳以上の確認 | Google フォーム(namedValues) |
| 活動の一覧 | 活動ID、名称、日時、集合場所、持ち物、定員、受付数、仮の枠、締め切り、必須の条件、配慮できること・できないこと | 活動の一覧のシート |
| 返信の決まり文句 | 受付・調整中・お断りの冒頭と結び、問い合わせ先、活動保険の案内 | 決まり文句のシート |
| 過去の参加 | 同じ人の過去の参加の回数(メールアドレスで照合) | 参加の記録のシート |
質を決めるのは、活動の一覧の「配慮できること・できないこと」の列です。 自由記述に「重い物は持てません」とあったとき、その活動が「軽作業のみの係もある」のか「全員が荷運びをする」のかで、受付か調整中かが変わります。この列が空だと、AIは判断の材料が無く、全部を調整中にします。
過去の参加の回数は、文面を変えるためだけに使います。 初めての人には集合場所の目印や当日の流れを詳しく、何度も来ている人には要点だけを書かせます。参加の回数で受付の可否を変えることはしません。 常連を優先すると、新しい人が入りにくくなるからです。優先の決まりを作るかどうかは、ボランティアセンターの方針として職員が決めます。
申込者の個人の情報のうち、AIに渡すのは区分に要るものだけです。 氏名と連絡先は返信の宛名と宛先に使いますが、AIには渡さず、下書きを作るときに Apps Script で差し込みます。
データの取得方法を決める
トリガーのイベントの namedValues から、質問の名前で各項目を取ります。質問の名前をフォームで変えると取れなくなるので、質問の名前と項目の対応を設定のシートに持ちます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 回答の各項目 | イベントの namedValues | 区分の判断と下書き |
| 書き込まれた行 | イベントの range | 区分と理由を同じ行に書く |
| 活動の条件・定員 | 活動の一覧のシート | ルールの確認とAIへの材料 |
| Claude API のキー | スクリプトのプロパティ | API の呼び出し |
API のキーは、スクリプトのプロパティに置きます。 公式のページでは、スクリプトのプロパティはスクリプトのすべての利用者から使える保存場所です。コードの中にキーを書かないためで、スクリプトの編集の権限は担当の職員に限ります。
AIへ渡す前に整形する
- 18歳以上の確認を見る … 確認の欄が「はい」でなければ、AIに渡さず「職員対応」の印を付けて終えます
- 活動を特定する … 希望の活動の選択肢から活動IDを引きます。一覧に無ければ「職員対応」
- ロックを取る …
getScriptLock()を取り、waitLockで30秒まで待ちます - ルールで確かめる … 締め切りを過ぎていないか、定員の残り(定員 − 受付数 − 仮の枠)があるか、必須の条件(運転、研修、説明会)を満たしているか
- 仮の枠を押さえる … 残りがあり、必須の条件を満たしていれば、仮の枠を1つ増やしてからロックを放します
- AIに渡す材料をそろえる … 自由記述、ルールの結果、活動の条件と配慮の列、過去の参加の回数
4番目で定員の残りが無いか、必須の条件を満たしていなければ、区分は「お断り」の候補に決まります。 AIはそれを覆せません。AIに渡すのは、お断りの理由に合わせた文面を書かせるためと、自由記述に別の日の希望が書かれていないかを見るためです。
4番目の締め切りは、フォームの送信の時刻で比べます。 Apps Script が動いた時刻で比べると、ロックの待ちや再処理で締め切りの直前の申込が「過ぎた」扱いになります。回答のシートのタイムスタンプの列を使います。 締め切りの「15日まで」が15日の終わりまでを指すことも、活動の一覧に時刻まで書いて揃えます。
5番目の仮の枠は、職員が下書きを送った時点で受付数に移します。 調整中のまま3日たったものは、仮の枠を外して職員に知らせます。枠を押さえたまま放置すると、ほかの申込者が断られます。
AIに処理させる
させるのは、自由記述と活動の条件を照らし、区分と理由と返信の下書きを返すことです。
| 見るもの | 区分への影響 |
|---|---|
| 参加できる時間の限り(「午前だけ」など) | 活動の時間と合わなければ調整中 |
| 体の具合や配慮の希望 | 活動の「配慮できること」にあれば受付、無ければ調整中 |
| 質問 | 受付の可否に関わる質問なら調整中、案内で足りるなら受付のまま答えを下書きに入れる |
| 18歳未満をうかがわせる記述(「高校2年です」など) | 確認の欄が「はい」でも調整中にし、age_concern の印 |
| ルールの結果が「お断り」 | 区分はお断りのまま。自由記述に別の日の希望があれば、ほかの活動の案内を下書きに入れる |
区分は3つだけにします。 「受付」は返信を送れば終わるもの、「調整中」は職員が申込者に確かめる必要があるもの、「お断り」はルールで受け付けられないと決まったものです。迷ったときは調整中にさせます。 受付と誤るより、職員が1本の電話をかけるほうが安く済みます。
| させないこと | 理由 |
|---|---|
| ルールの「お断り」を受付に変える | 定員と必須の条件はルールで決める |
| 体の具合から参加できるかを判断する | 安全の判断は職員が申込者と話して決める |
| 18歳未満かどうかを推し量って受け付ける | 年齢の扱いは職員が確かめる |
| 活動の一覧に無い活動を案内する | 存在しない募集を作らない |
| 活動保険の加入の可否を答える | 保険の手続きは職員が案内する |
指示内容を固定する
あなたは社会福祉協議会のボランティアセンターで、ボランティアの申込に
返信する下書きを作る立場です。渡す材料だけをもとに判断してください。
【区分の選び方】
- accepted ...... ルールの結果が ok で、自由記述に活動の条件と合わない点が無い
- pending ....... ルールの結果が ok だが、職員が申込者に確かめることがある
- declined ...... ルールの結果が declined(定員・締め切り・必須の条件)
迷ったときは pending を選んでください。
【厳守事項】
- rule_result が declined のとき、区分は必ず declined にしてください。
自由記述の内容で accepted や pending に変えないでください。
- 体の具合や配慮の希望は、活動の accommodations にある場合だけ accepted に
できます。無ければ pending にし、理由に記述をそのまま写してください。
- 参加できるかどうか、安全かどうかを判断して書かないでください。
- 18歳未満をうかがわせる記述があれば、pending にし age_concern を true に
してください。
- 返信の下書きに、活動の一覧に無い日時・場所・活動を書かないでください。
- declined の返信では、other_activities にある活動だけを案内してください。
- 質問には、活動の一覧に書かれていることだけで答えてください。
書かれていないことは「担当から改めてご連絡します」としてください。
- 宛名は {name} と書いてください。氏名を推測しないでください。
- 丁寧語で、ボランティアの方への感謝を一言添えてください。
【活動の情報】{activity}
【ルールの結果】{rule_result}
【案内できるほかの活動】{other_activities}
【申込の内容(氏名・連絡先を除く)】{application}
「rule_result が declined のとき、必ず declined」を書いているのは、AIが申込者に好意的に寄るためです。 「どうしても参加したいです」と書かれていると、定員を超えていても受付の文面を書きます。ルールの結果を変えさせないことを、指示とスキーマの両方で守ります。
宛名を {name} と書かせるのは、AIに氏名を渡さないためです。 下書きを作るときに、Apps Script が回答の氏名で置き換えます。
出力形式を固定する
Claude API の構造化出力で、次の形の JSON を受け取ります。
{
"category": "accepted | pending | declined",
"reasons": [""],
"age_concern": false,
"questions_to_confirm": [""],
"reply_subject": "",
"reply_body": ""
}
公式のページでは、構造化出力は output_config.format に type: "json_schema" の形でスキーマを渡し、オブジェクトの additionalProperties は false にする必要があります。category は列挙(enum)で3つの値に限ります。
1つ目の理由は、category を回答のシートの列に書けることです。 職員はシートを区分で絞り込み、受付は下書きを流し見て送り、調整中から先に手を付けます。
2つ目は、questions_to_confirm を職員の電話のメモにできることです。 調整中の申込で、何を申込者に確かめればよいかが一覧になります。
調整中の下書きは、たとえば次のような文面になります。
件名:【ボランティア申込】配食の配達(11月8日)について確認のお願い
{name} 様
このたびは配食の配達のボランティアにお申し込みいただき、
ありがとうございます。
お申込の内容を拝見し、当日の係の割り振りについて
担当から確認させていただきたいことがございます。
2〜3日のうちに、担当よりお電話またはメールでご連絡いたします。
なお、現時点ではお申込は確定しておりません。
確認ののち、改めて受付のご連絡をお送りします。
「現時点ではお申込は確定しておりません」の一文は、決まり文句のシートに置き、調整中の下書きには必ず入れます。 申込者が「受け付けられた」と思って当日来てしまうことを防ぐためです。AIに書かせると、言い回しを変えて弱めることがあるので、Apps Script で差し込みます。
ルールの結果との突き合わせも、Apps Script で行います。 ルールの結果が declined なのに category が declined でない応答は、下書きを作らずに「職員対応」の印を付けます。 指示を守らなかった応答を、職員の目に回すためです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Google フォーム/回答のシート | スプレッドシートの側のフォーム送信のトリガー | 回答を受け取る |
| 活動の一覧のシート | SpreadsheetApp(ロックの中で読み書き) | 定員の確認と仮の枠 |
| Claude API | UrlFetchApp、構造化出力 | 区分・理由・下書き |
| 回答のシート | SpreadsheetApp | 区分と理由を同じ行の横の列に書く |
| Gmail | GmailApp の createDraft | 申込者あての下書き(送らない) |
メールの送信は、この構成からは行いません。 下書きまでにし、職員が確かめて送ります。受付の返信は申込者にとって参加の確定の知らせで、誤って送ると取り消しが難しいからです。 Gmail の読み書きは、Google Workspace のアカウントで1日5万回までで、月300件の下書きには十分です。
人が確認する
職員は、回答のシートを区分で絞り込み、次の順で確かめます。
- 職員対応 … 18歳以上の確認が無いもの、活動が特定できないもの、AIの応答がルールと食い違ったもの。AIを通さずに職員が受け持ちます
- 調整中 …
questions_to_confirmを見て申込者に確かめ、受付かお断りかを決めて、下書きを直して送ります - お断り … ほかの活動の案内が、活動の一覧のとおりかを確かめて送ります
- 受付 … 日時・集合場所・持ち物が活動の一覧と合っているかを確かめて送ります
- 送ったら「送信済み」に印を付ける … 仮の枠が受付数に移ります
例えば、配食の配達に「腰が悪いので重い物は持てませんが、運転はできます」と書かれた申込です。 活動の「配慮できること」に「運転のみの係あり」があれば受付、無ければ調整中になります。職員は、運転のみの係に空きがあるかを確かめてから送ります。
区分を直したときは、回答のシートの「区分」の列を書き換え、元の区分は「AIの区分」の列に残します。 直した件数が、指示の見直しの材料になります。
受付の確認も省かないでください。 1件数十秒で済みますが、日時を1日取り違えた受付の返信は、当日に誰も来ない活動を生みます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 18歳以上の確認が無い | AIに渡さず「職員対応」。職員が年齢を確かめ、別の手続きを案内する |
| ロックが30秒で取れない | 「再処理待ち」の印。5分ごとのトリガーで拾い直す |
| 希望の活動が一覧に無い(募集の終わった活動など) | 「職員対応」 |
| 同じ人が同じ活動に2回申し込んだ | メールアドレスと活動IDで照合し、2回目は下書きを作らず印を付ける |
| Claude API がエラーを返す | 仮の枠は押さえたまま「再処理待ち」。3回失敗したら職員へ知らせる |
| AIの区分がルールの結果と食い違う | 下書きを作らず「職員対応」 |
| 調整中のまま3日たった | 仮の枠を外して職員に知らせる |
| 活動が雨天などで中止になった | 職員が活動の一覧で中止の印を付け、受付済みの人の一覧を出す(連絡は職員が行う) |
上から2行目のロックの待ちは、募集の直後にだけ起きます。 5分後に拾い直すので、申込者から見た返信の遅れは数分の差です。
下から2行目の中止は、AIにも Apps Script にも連絡させません。 中止の知らせは、受付済みの全員に確実に届いたかを職員が確かめる必要があります。この構成が出すのは、知らせる相手の一覧までです。
記録を残す
- フォームの回答の全項目(回答のシート)
- ルールの結果(締め切り・定員の残り・必須の条件)と、そのときの活動の一覧の受付数と仮の枠
- Claude API に渡した材料(氏名・連絡先を除く)と、返ってきた JSON の全文
- 職員が直した区分と下書き、送った日時
- 「職員対応」になった理由の内訳
2つ目に「そのときの受付数」を残すのは、定員の苦情に答えるためです。 「申し込んだのに断られた」と問い合わせがあったとき、申込の時点で残りがいくつだったかを示せます。
最後の行は、フォームと活動の一覧を直す材料になります。 「活動が特定できない」が多ければフォームの選択肢を、「配慮の列が空」が多ければ活動の一覧を見直します。
04実装レベルの3段階
半自動化で、1件6分が2分になり、この段階が本記事の想定です。 見比べと文面づくりが自動になり、職員は下書きを確かめて送るだけになります。定員の超過も、ロックで止まります。 本格構成は、申込の後の事務までつなぐ段階です。 当日の出欠や活動保険の名簿は、社会福祉協議会ごとに手続きが違います。半自動化が半年回ってから、どこまでつなぐかを決めます。 段階を飛ばさないでください。 最小構成の30件で、活動の一覧の「配慮できること」の抜けが見つかります。そこを埋めてから連携を作るほうが、調整中に偏らずに済みます。
05工数削減シミュレーション
導入後 300件 × 2分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 市区町村の社会福祉協議会のボランティアセンターや、NPO・地域の団体で、毎月決まった活動(高齢者のサロン、配食、清掃、イベントの運営など)のボランティアを募集している場合。申込を Google フォームで受けているのに、職員が1件ずつ活動の一覧と見比べて、受付の可否を判断し、返信のメールを手で書いている場合。申込が募集の開始の直後に集中し、定員を超えて受け付けてしまうことや、返信が数日遅れることがある場合。Google Workspace を使っている場合。
- 申込が月に数十件で、職員が電話で受けて足りている場合。活動ごとに面談や研修を経てから個別に配置を決めていて、申込の時点で受付の可否を決めない場合。18歳未満の申込を受ける活動が中心の場合(この構成は18歳以上の申込に限る)。なお、活動の安全の判断、配慮が必要な申込者の受け入れの判断、ボランティア活動保険の加入の手続きは、この構成では代替できません。
07最小構成で試す方法
- 先月の申込から30件を選ぶ(自由記述のあるものを半分以上入れる)
- 申込ごとに、当時の職員の判断(受付・調整・お断り)と返信の文面を書き出す
- 手元の生成AIの画面に、活動の一覧(その活動の行だけ)と申込の内容(氏名・連絡先を除く)を貼る
- 「受付・調整中・お断りのどれかに分け、理由と返信の下書きを書いてください。迷ったら調整中にしてください。活動の一覧に無いことは書かないでください」と指示する
- 出てきた区分と文面を、当時の判断と返信と並べる
この段階ではルールの確認(定員・締め切り)は人が行います。 確かめたいのは、自由記述を読んだ区分が、職員の判断と合うかです。
| 出てきた内容 | 判断 |
|---|---|
| 区分が職員の判断とおおむね合い、文面がそのまま使える | Apps Script との連携に進む |
| 調整中が多すぎる | 活動の一覧の「配慮できること」が空。一覧を整える |
| 受付にしてはいけないものを受付にした | 指示の書き方で直る。迷ったら調整中を強める |
2行目が出ることは珍しくありません。 職員の頭の中にある「この活動なら座ってできる係もある」が、一覧に書かれていないためです。一覧を整えると、職員どうしの判断のばらつきも減ります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 定員を超えて受け付ける | ロックの中で定員の確認と仮の枠の押さえを行う |
| 仮の枠が押さえられたまま残る | 送信で受付数に移し、調整中のまま3日たったら外す |
| AIがお断りを受付に変える | 指示で禁じ、応答をルールの結果と突き合わせる |
| 調整中ばかりになる | 活動の一覧の「配慮できること」を埋める |
| 体の具合から参加の可否を書く | 安全の判断はさせない。調整中にして職員が話す |
| 18歳未満の申込がAIに渡る | 確認の欄が「はい」以外は渡さない。記述にうかがわせる内容があれば印 |
| 質問の名前を変えて項目が取れない | 質問の名前と項目の対応を設定のシートに持つ |
| 下書きが溜まって返信が遅れる | 毎朝、未送信の件数を職員に知らせる |
| API のキーがコードに書かれる | スクリプトのプロパティに置き、編集の権限を絞る |
| 返信が自動で送られる | createDraft で下書きまでにする |
上の3行が、この構成の失敗のほとんどです。 定員は数えられることなのに、同時の処理と好意的な文面の2つの経路から崩れます。 ロックとルールの突き合わせで、両方を塞ぎます。
下から5行目は、規約と手続きの両方に関わります。 18歳未満の申込は、保護者の同意や学校との調整が要るだけでなく、生成AIのサービスの規約で扱いが制限されていることがあります。フォームの段階で分け、AIに渡さないのが確実です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 申込者の氏名、連絡先、年齢の確認、運転の可否、研修の受講、そして自由記述に書かれる体の具合や配慮の希望です。
- 外部へ渡す範囲を、区分に必要な項目までに限る … Claude API には氏名と連絡先を渡しません。自由記述に体の具合が書かれることは避けられないので、フォームに「配慮の希望は、活動に必要な範囲でお書きください」と添えます
- 体の具合を区分の根拠にしない … 自由記述の健康の情報は、活動の配慮の可否を見るためだけに使います。参加できるかどうかを AI に決めさせず、職員が申込者と話して決めます
- 返信を自動で送らない … 下書きまでにし、職員の確認を必ず通します
- 18歳未満の申込を AI に渡さない … フォームの確認の欄と、自由記述の印の2段で分けます。Gemini API など、18歳未満が利用しうるサービスでの利用を規約で禁じているサービスは使いません
- 回答のシートの共有を絞る … 申込者の連絡先と体の具合が載ったシートです。ボランティアセンターの職員だけが見られるようにし、活動先の施設には当日の名簿だけを渡します
- 個人情報の取り扱いを申込者に示す … フォームの冒頭に、申込の内容を返信の作成に外部のサービスで処理することを含めて、利用の目的を書いておきます
誤りが起きた場合のリスクは、受け付けてはいけない申込を受け付けることと、配慮が要る申込を受付として流してしまうことの2つです。 前者はロックとルールの突き合わせで防ぎ、後者は「迷ったら調整中」と職員の確認で防ぎます。
10まず何から始めるか
1週目:活動の一覧を整える
活動ごとに、定員、締め切り、必須の条件(運転、研修、説明会)、配慮できること・できないことを列に書きます。職員3名で、「この活動なら座ってできる係がある」といった頭の中の知識を言葉にします。
2週目:30件で試す
先月の申込から30件を選び、手元の生成AIの画面に貼って区分と下書きを作らせます。当時の職員の判断と並べ、受付にしてはいけないものを受付にしていないかを最優先で見ます。
3週目:フォームを直す
18歳以上の確認の欄と、配慮の希望の書き方の案内を足します。質問の名前を決め、設定のシートに項目との対応を書きます。
4週目:送信のトリガーとロックを作る
Apps Script で、ロックの中で定員と条件を確かめ、仮の枠を押さえるところまでを作ります。この時点ではAIを呼ばず、ルールの区分だけを回答のシートに書きます。
2か月目: Claude API で区分と下書きを作り、Gmail に下書きを置きます。毎月の募集の1回分で、区分ごとの件数と職員が直した件数を数えます。 3か月目以降: 職員が区分を直した件数が落ち着き、定員を超えた受付が0件の月が続いた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| フォーム送信のインストール型トリガーに Google フォームの側とスプレッドシートの側の2種類があること | Apps Script: Installable Triggers | 2026-10-14 |
スプレッドシートの側のフォーム送信のイベントに、質問の名前と値の組(namedValues)と、書き込まれた範囲(range)が入ること | Apps Script: Event Objects | 2026-10-14 |
| 1回の実行が6分まで、同時に動く実行がユーザーあたり30まで、Gmail の読み書き(送信を除く)が Google Workspace で1日5万回までであること | Apps Script: Quotas | 2026-10-14 |
createDraft が下書きのメールを作るもので、オプションに name・replyTo などがあること | Apps Script: GmailApp | 2026-10-14 |
LockService がコードの一部の同時実行を防ぐもので、getScriptLock() がどの利用者からも同時に実行させないロックを返し、tryLock・waitLock を呼んだ時点で取られること | Apps Script: LockService | 2026-10-14 |
| スクリプトのプロパティがスクリプトのすべての利用者から使える保存場所であること | Apps Script: Properties Service | 2026-10-14 |
構造化出力で output_config.format に type: "json_schema" を渡すこと。オブジェクトの additionalProperties を false にすること | Claude: Structured outputs | 2026-10-14 |
| Gemini API の利用に18歳以上であることが求められ、18歳未満に向けた、または18歳未満が利用しうるサービスへの組み込みが禁じられていること | Gemini API Additional Terms of Service | 2026-10-14 |
受け入れの可否と安全の判断は、ボランティアセンターの職員が行ってください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1541)についてのご相談はこちらから。
