公民館・集会所の利用日誌を月ごとに集計し、利用の偏りと設備の不具合・利用者の要望を施設ごとの月報にまとめる
公民館・集会所の管理人が付ける利用日誌を、月に1回、施設ごとに集計します。数える作業は Apps Script が行い、AI は自由記述から設備の不具合と利用者の要望をまとめ、利用の偏りの所見を書きます。担当課が施設ごとの月報を作る時間を減らします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- その他/教育/自治体
- 対象部門
- 総務
- 対象業務
- 要約/集計・分析
- 主な課題
- データ分析に時間がかかる/情報が見つからない/期限・対応漏れが起きる
- AIで行う処理
- 要約
- 主な効果
- 判断支援/対応スピード向上/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月の初めに、担当者が回答のスプレッドシートを開き、先月分の行を施設ごとに並べ替える
- 施設ごとに、部屋と時間帯(午前・午後・夜間)の利用の数をピボットテーブルで数える
- 団体ごとの利用の回数を数え、特定の団体に偏っていないかを見る
- 自由記述の3つの欄を上から読み、不具合と要望を書き出す
- 先月の月報を開き、書き出した不具合が先月も書かれていたかを見比べる
- 施設ごとの月報の文案を書き、集計表を貼る
- 課長に回し、修繕の要望を営繕の担当にメールで送る
- 人管理人がいまと同じフォームで利用日誌を入力する
- 自動フォームの送信のたびに、不具合の欄に安全に関わる語(漏電、ガス、水漏れ、けが など)があれば、担当課と営繕の担当にすぐ知らせる
- 自動毎月1日の朝、Apps Script が先月分の行を施設ごとに分ける
- 自動部屋の名前を正式な名前にそろえ、部屋・時間帯・団体ごとの利用の数と稼働率を数える
- 自動施設ごとに、集計値・自由記述・先月の不具合の一覧を Claude API に渡す
- 自動AI が、不具合と要望をまとめ、先月からの続きかどうかを分け、利用の偏りの所見を書く
- 自動所見に出てくる数字が集計値にあるかをスクリプトが確かめ、無ければ印を付ける
- 自動施設ごとの月報の下書きを Google ドキュメントに作り、不具合の一覧を修繕の一覧のシートに書く
- 人担当者が月報の下書きを読み、不具合の根拠になった日誌の行を確かめて直す
- 人課長に回し、修繕の要望を営繕の担当へ送る
各工程の詳しい説明を読む
- 月の初めに、担当者が回答のスプレッドシートを開き、先月分の行を施設ごとに並べ替える
- 施設ごとに、部屋と時間帯(午前・午後・夜間)の利用の数をピボットテーブルで数える
- 団体ごとの利用の回数を数え、特定の団体に偏っていないかを見る
- 自由記述の3つの欄を上から読み、不具合と要望を書き出す
- 先月の月報を開き、書き出した不具合が先月も書かれていたかを見比べる
- 施設ごとの月報の文案を書き、集計表を貼る
- 課長に回し、修繕の要望を営繕の担当にメールで送る
(a)数えるだけで半日かかる。 24施設のそれぞれでピボットテーブルを作り直し、部屋の名前の表記ゆれ(「和室1」「和室①」「第1和室」)を直してから数えます。数える作業そのものは単純ですが、施設の数だけくり返します。
(b)不具合の記述が埋もれる。 3,000行のうち自由記述のある600行を読むのは、月の初めの忙しい時期の仕事です。読む順番が後ろの施設ほど、読み方が粗くなります。 「照明がちらつく」と1行だけ書かれた記述は、読み飛ばされがちです。
(c)同じ不具合が何か月も書かれ続ける。 管理人は不具合を見るたびに書きますが、担当者が先月の月報と見比べなければ、それが3か月目の記述だとは分かりません。 新しい不具合と同じ扱いで営繕に送られ、優先度が上がりません。
(d)利用の偏りの所見が書けない。 時間をかけて数えても、月報には表が貼られるだけで、「夜間の和室は同じ3団体で9割が埋まっている」のような所見までは書く時間がありません。 施設の運営の会議で、利用の偏りが話題になる材料が出てきません。
- 【人】 管理人がいまと同じフォームで利用日誌を入力する
- 【自動】 フォームの送信のたびに、不具合の欄に安全に関わる語(漏電、ガス、水漏れ、けが など)があれば、担当課と営繕の担当にすぐ知らせる
- 【自動】 毎月1日の朝、Apps Script が先月分の行を施設ごとに分ける
- 【自動】 部屋の名前を正式な名前にそろえ、部屋・時間帯・団体ごとの利用の数と稼働率を数える
- 【自動】 施設ごとに、集計値・自由記述・先月の不具合の一覧を Claude API に渡す
- 【自動】 AI が、不具合と要望をまとめ、先月からの続きかどうかを分け、利用の偏りの所見を書く
- 【自動】 所見に出てくる数字が集計値にあるかをスクリプトが確かめ、無ければ印を付ける
- 【自動】 施設ごとの月報の下書きを Google ドキュメントに作り、不具合の一覧を修繕の一覧のシートに書く
- 【人】 担当者が月報の下書きを読み、不具合の根拠になった日誌の行を確かめて直す
- 【人】 課長に回し、修繕の要望を営繕の担当へ送る
9番目は省けません。 月報は課長と営繕の担当が読み、修繕の予算の話につながる資料です。AI のまとめを、そのまま課の外に出すことはしません。 その代わり、担当者が見るのは日誌の3,000行ではなく、施設ごとに数件の不具合と要望と、それぞれの根拠の行だけになります。
2番目を月次とは別にしているのは、安全のためです。 漏電やガスの臭いの記述を、月末まで待って月報に載せるわけにはいきません。この知らせは語の一覧で決め、AI を通しません。
02今回想定するシステム構成
管理人が利用日誌のフォームを送る(施設のタブレット) │ 回答は1つのスプレッドシートに入る ├─▶【トリガー】フォーム送信(インストール型) │ 不具合の欄に安全の語があれば MailApp で担当課と営繕へ ▼【トリガー】毎月1日の朝(時間主導型) Google Apps Script ├──▶ 先月分の行を施設ごとに分ける ├──▶ 部屋の名前をそろえ、部屋・時間帯・団体ごとに数える ├──▶ Claude API(構造化出力) │ 不具合と要望のまとめ/先月からの続きか/利用の偏りの所見 ├──▶ 所見の数字が集計値にあるかを確かめる ├──▶ 月報の下書き(Google ドキュメント) └──▶ 修繕の一覧のシートに書く ▼ 【人が月報を確かめ、課長と営繕へ】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Make、Power Automate |
| 生成AI | Claude API(構造化出力) | Gemini API、OpenAI API |
| 保管 | Google スプレッドシート(日誌の回答、部屋の名前の一覧、修繕の一覧) | - |
| 文書 | Google ドキュメント(施設ごとの月報の下書き) | - |
| 通知 | Gmail(MailApp) | Google Chat |
新しく足すのは、Apps Script と、部屋の名前の一覧、修繕の一覧のシート、月報の雛形だけです。 フォームと回答のスプレッドシートは、いまのものを使います。施設予約のシステムや財務会計のシステムには、この構成から書き込みません。
Apps Script は、回答のスプレッドシートに付けるスクリプトとして書きます。 トリガーは2つです。フォームの回答が入ったときに動くフォーム送信のインストール型トリガーと、毎月決まった日に動く時間主導型のトリガーです。公式のページでは、時間主導型のトリガーは1分ごとから月に1回までの間隔で動かせるとされ、毎月の日付は onMonthDay() で指定します。
インストール型のトリガーは、作った人のアカウントで動きます。 担当者の個人のアカウントで作ると、異動のあとに誰のトリガーか分からなくなります。課の共有のアカウントで作るか、異動のときに作り直す手順を決めておきます。 公式のページでは、ある人が作ったトリガーは、別の人のアカウントからは見えないとされています。
AI の処理は Claude API の構造化出力で行います。 Messages API の output_config.format に type: "json_schema" と JSON Schema を渡すと、その形に合う JSON が返ります。 Claude API では正式提供で、ベータのヘッダは要りません。オブジェクトには additionalProperties: false が必要で、enum が使えます。
03どうやって実装するのか
処理の起点を決める
月次の処理は、毎月1日の朝に動く時間主導型のトリガーを起点にします。 ScriptApp.newTrigger() に timeBased()・onMonthDay(1)・atHour(6) を続けて作ります。公式のページでは、atHour() で指定した時刻はその1時間のあいだのどこかで動き、nearMinute() を使っても前後15分の幅があるとされています。朝6時台に動けば、担当者が出勤するまでに終わります。
月末の夜の利用は、翌朝に入力されることがあります。 そこで、月報の下書きを作ったあとに前月分の行が追加されたら、その施設に「追加の入力あり」の印を付け、担当者が再実行のメニューから作り直します。
安全に関わる記述の知らせは、フォーム送信のトリガーで行います。 回答1件ごとに動き、不具合の欄に語の一覧の語があれば、その場でメールを送ります。 この処理は AI を呼びません。語の一覧との突き合わせだけなので、速く、確実です。
1回の実行は6分までです。 公式の割り当てでは、スクリプトの1回の実行時間は6分で、トリガーの1日の合計の実行時間は一般のアカウントで90分、Google Workspace のアカウントで6時間です。24施設を1回でまとめて処理すると、API の待ち時間で6分を超えることがあります。月次の処理は施設を数件ずつに分け、どこまで終わったかをスクリプトのプロパティに書き、続きは10分後の1回限りのトリガーで動かします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 利用日誌の回答 | 利用日、施設、部屋、開始・終了の時刻、団体名、人数、不具合の欄、要望・苦情の欄、管理人のメモ | 回答のスプレッドシート |
| 部屋の名前の一覧 | 施設ごとの正式な部屋の名前と、日誌で書かれがちな別名、時間帯ごとの貸し出しの枠の数 | 部屋の名前の一覧(シート) |
| 修繕の一覧 | 先月までに月報に載せた不具合。キー、施設、部屋、設備、症状、初めて書かれた月、状況 | 修繕の一覧(シート) |
| 団体の区分 | 登録団体の名前と区分(サークル、自治会、子ども会、行政の利用 など) | 団体の一覧(シート) |
| 安全の語の一覧 | 漏電、焦げ臭い、ガス、水漏れ、けが、転倒、ハチ など | 語の一覧(シート) |
質を決めるのは、部屋の名前の一覧と修繕の一覧です。 部屋の名前がそろわなければ、稼働率が「和室1」と「和室①」に割れます。修繕の一覧が無ければ、AI は先月からの続きかどうかを判断する材料を持ちません。
時間帯ごとの貸し出しの枠の数も一覧に持たせます。 稼働率は「使われた枠の数 ÷ 貸し出せる枠の数」で、分母は施設と部屋ごとに違います。休館日と、点検で貸し出さなかった日も枠から外すので、休館日の一覧も同じシートに置きます。
団体の区分は、利用の偏りの所見に使います。 「夜間の利用の7割がサークル」という所見は、団体の区分が無ければ出せません。
データの取得方法を決める
月次のトリガーで動く関数は、回答のシートを先月の範囲で読みます。 シート全体を毎回読むと、行が増えるほど遅くなります。利用日の列で先月の範囲に絞り、施設の列で分けてから処理します。
| 取るもの | どこから | どう取るか |
|---|---|---|
| 先月分の日誌の行 | 回答のシート | 利用日の範囲で絞って一度に読む |
| 部屋の名前・枠の数・休館日 | 部屋の名前の一覧 | 実行の最初に読む |
| 先月までの不具合 | 修繕の一覧 | 施設ごとに、状況が「対応済み」でないものを読む |
| 団体の区分 | 団体の一覧 | 実行の最初に読む |
API キーはスクリプトに直接書きません。 スクリプトのプロパティに置き、実行時に読みます。
施設ごとの処理は、次の順で行います。
1. その施設の先月分の行を取り出す(0行なら「利用なし」の月報を作って終わる)
2. 部屋の名前を正式な名前にそろえる(一覧に無い名前は「未登録の部屋」として数える)
3. 部屋×時間帯ごとの使われた枠の数と稼働率、団体ごとの回数、区分ごとの割合を数える
4. 自由記述が空でない行だけを取り出し、行の番号を付ける
5. 修繕の一覧から、その施設の対応済みでない不具合を取り出す
6. Claude API を呼び、JSON を受け取る(失敗したら施設に「要再実行」と書いて次へ)
7. 所見に出てくる数字が、3番目の集計値にあるかを確かめる
8. 月報の雛形を複製して下書きを作り、修繕の一覧に新しい不具合と続きの印を書く
9. 処理済みの施設をスクリプトのプロパティに書く
7番目が、この構成の安全装置です。 AI が書いた所見の「夜間の和室の稼働率は82%」という数字が、3番目で数えた値に無ければ、その文に「数字を確認」の印を付けて下書きに残します。 AI に計算させないと指示しても、言い換えのついでに数字を丸めたり作ったりすることがあるためです。
Claude API は UrlFetchApp で呼びます。 公式の割り当てでは、URL Fetch の呼び出しは一般のアカウントで1日2万回、Google Workspace のアカウントで1日10万回で、月24回の呼び出しには十分です。
AIへ渡す前に整形する
- 部屋の名前をそろえる … 別名の一覧で正式な名前に直します。AI に直させません
- 時間帯に分ける … 開始の時刻で午前・午後・夜間に分けます。枠をまたぐ利用は、またいだ枠すべてに数えます
- 自由記述の空と「特になし」を除く … 「特になし」「異常なし」「なし」だけの欄は渡しません
- 個人の名前と連絡先を落とす … 管理人のメモに書かれた利用者の個人の名前と電話番号を、記号に置き換えてから渡します。団体名は残します
- 行の番号を付ける … 自由記述の1件ごとに
L0123のような番号を付け、AI にはこの番号で根拠を返させます - 先月の不具合にキーを付ける … 修繕の一覧の各行に
R-07-012のようなキーがあることを確かめます - 長さを確かめる … 施設の自由記述の合計が極端に多いとき(たとえば300件を超えるとき)は、部屋ごとに分けて2回に分けて渡します
4番目は、日誌の性質のために要ります。 管理人のメモには「△△さん(090-…)から苦情」のように、個人の名前と電話番号が書かれることがあります。 正規表現で電話番号を、団体の一覧に無い「〜さん」を記号に置き換えます。
AIに処理させる
させるのは3つです。不具合をまとめること、要望をまとめること、集計値をもとに利用の偏りの所見を書くことです。
| させること | 中身 | 根拠の返し方 |
|---|---|---|
| 不具合のまとめ | 同じ設備の同じ症状を1件にまとめ、部屋・設備・症状を短く書く | 根拠にした行の番号の一覧 |
| 先月からの続きか | 先月の不具合の一覧と照らし、同じものならそのキーを返す | 一致したキー。新しいものは空 |
| 要望のまとめ | 予約の取り方、備品、騒音、清掃、利用のルールなどに分け、同じ趣旨を1件にまとめる | 根拠にした行の番号の一覧 |
| 利用の偏りの所見 | 渡された集計値から、偏りが目立つところを3つまで書く | 使った集計値のキー |
| 読み取れない記述 | 不具合か要望か分からないもの | 行の番号と理由 |
不具合の続きの判断は、AI に任せる部分のうち最も間違えやすいところです。 先月の「和室2のエアコンが効かない」と、今月の「和室2 冷房が弱い」は同じものですが、「和室2のエアコンから水が垂れる」は別の症状かもしれません。 そこで、AI には同じと言える根拠の文を書かせ、迷ったら新しいものとして扱わせます。 新しいものとして重複して載るのは担当者が見れば分かりますが、別の症状を同じものとしてまとめると、2つ目の症状が月報から消えます。
| させないこと | 理由 |
|---|---|
| 集計値の計算・言い換え | スクリプトが数える。所見の数字は集計値から写すだけ |
| 修繕の優先順位を付ける | 営繕の担当と課長が予算と合わせて決める |
| 不具合を「直った」とする | 日誌に「修理済み」と書かれていても、状況を変えるのは担当者 |
| 団体の利用の良し悪しを書く | 月報は施設の状態と使われ方の資料 |
| 個人を特定する書き方 | 要約に個人の名前を残さない |
安全に関わる記述には、safety の印を付けさせます。 月報の上でも目立つようにするためで、範囲は語の一覧と同じにします。
指示内容を固定する
あなたは市の公民館・集会所を所管する課で、施設ごとの月報の下書きを作る立場です。
渡された利用日誌の自由記述と集計値だけを使ってください。
【作るもの】
1. repairs:設備の不具合の一覧
- 同じ部屋・同じ設備・同じ症状の記述は1件にまとめる
- 先月までの不具合の一覧に同じものがあれば、そのキーを previous_key に入れる
- 同じと言える根拠を match_reason に書く。迷ったら previous_key は空にする
- 漏電・焦げ臭い・ガス・水漏れ・けが・転倒に関わる記述は safety を true にする
2. requests:利用者からの要望・苦情の一覧
- category は booking/equipment/noise/cleaning/rules/other から選ぶ
- 同じ趣旨の記述は1件にまとめ、件数を mentions に入れる
3. usage_notes:利用の偏りの所見を3つまで
- 渡された集計値の中から、偏りが目立つところを選ぶ
- 文に入れる数字は、集計値に書かれている値をそのまま写す
- 使った集計値のキーを stat_keys に入れる
4. unclear:不具合か要望か判断できない記述
【厳守事項】
- 数字を計算しないでください。合計・割合・前月との差を自分で出さないでください。
- 集計値に無い数字を所見に書かないでください。
- 日誌に「修理済み」「直った」とあっても、不具合を解決済みとして扱わないでください。
status_in_log に reported_fixed と書くだけにしてください。
- 修繕の優先順位、急ぐかどうかは書かないでください。
- 根拠の行の番号を必ず entry_ids に入れてください。番号の無いまとめは作らないでください。
- 個人の名前を書かないでください。記号に置き換えられた部分はそのままにしてください。
- 書かれていない事情(原因、経過、利用者の気持ち)を足さないでください。
【施設】{facility_name}
【部屋の一覧】{rooms}
【集計値】{stats_json}
【先月までの不具合の一覧】{open_repairs}
【自由記述(行の番号つき)】{entries}
「数字を計算しないでください」と「集計値に無い数字を書かないでください」を分けて書くのは、別の失敗だからです。 前者は割合を自分で出す失敗、後者は「約8割」のように丸めて書く失敗です。どちらも、スクリプトの突き合わせで印が付きますが、指示の側でも減らしておきます。
「修理済みと書かれていても解決済みにしない」も要ります。 管理人が「業者が来て直した」と書いても、別の部屋の話だったり、応急の処置だったりします。修繕の一覧の状況を変えるのは担当者だけにします。
出力形式を固定する
構造化出力で、次の形の JSON を受け取ります。
{
"facility_id": "",
"repairs": [
{ "room": "", "equipment": "", "symptom": "",
"status_in_log": "new | continuing | reported_fixed",
"previous_key": "", "match_reason": "",
"safety": false, "entry_ids": [""], "mentions": 0 }
],
"requests": [
{ "category": "booking | equipment | noise | cleaning | rules | other",
"summary": "", "entry_ids": [""], "mentions": 0 }
],
"usage_notes": [
{ "note": "", "stat_keys": [""] }
],
"unclear": [
{ "entry_id": "", "reason": "" }
]
}
スキーマでは status_in_log と category を enum で縛り、すべてのオブジェクトに additionalProperties: false を付けます。公式のページでは、minimum や maximum などの数値の制約は使えず、使うと 400 が返るとされています。mentions を0以上に縛りたくなりますが、スクリプトの側で確かめます。
entry_ids を必ず返させる理由は、担当者の確認の速さです。 月報の下書きでは、不具合の1件ごとに根拠の行の番号が並び、番号をたどれば日誌の元の記述にすぐ行けます。 根拠の無いまとめは、確かめようがありません。
| 下書きの欄 | 中身 |
|---|---|
| 【利用の状況】 | スクリプトの集計表(部屋×時間帯の稼働率、団体の区分ごとの割合) |
| 【利用の偏りの所見】 | usage_notes の文。数字の合わないものに「数字を確認」の印 |
| 【設備の不具合】 | repairs。safety のものを先頭に、続いて continuing、new の順 |
| 【利用者の要望】 | requests。区分ごと |
| 【判断できなかった記述】 | unclear の行の番号と理由 |
不具合の並べ方は、続いている月数の長いものを上にします。 修繕の一覧の「初めて書かれた月」から月数を出し、3か月以上続いているものには、その月数を太字で添えます。 第3章の(c)を月報の形で解く部分です。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 回答のスプレッドシート | Apps Script(読み取り) | 先月分の日誌の行 |
| 部屋の名前・団体・語の一覧 | Apps Script(読み取り) | 名前をそろえる、区分を付ける、安全の語を拾う |
| Claude API | UrlFetchApp | 不具合・要望のまとめと所見 |
| Google ドキュメント | Apps Script(雛形の複製と書き込み) | 施設ごとの月報の下書き |
| 修繕の一覧 | Apps Script(追記) | 新しい不具合の行と、続きの印 |
| Gmail | MailApp | 安全の語の知らせ、月報の下書きができた知らせ |
修繕の一覧には追記だけをします。 新しい不具合の行を足し、続いている不具合の行に「今月も記述あり」と行の番号を書きます。状況の列(未対応・依頼済み・対応済み)は、担当者だけが変えます。
メールの量は少なく収まります。 公式の割り当てでは、MailApp の1日の宛先の数は一般のアカウントで100、Google Workspace のアカウントで1,500です。月報の知らせは月に1回、安全の語の知らせも月に数回です。
人が確認する
担当者は、施設ごとの下書きを次の順で見ます。
safetyの不具合 … 根拠の行を開き、記述を読みます。すでに知らせが届いているはずなので、営繕の担当が動いているかを確かめますcontinuingの不具合 …match_reasonを読み、本当に同じ不具合かを根拠の行で確かめます。 別の症状なら分けます- 「数字を確認」の印の付いた所見 … 集計表と見比べ、直すか消します
unclearの記述 … 不具合か要望かを決め、必要なら施設の管理人に聞きます- 要望 … まとめ方が趣旨とずれていないかを見ます
2番目に時間をかけてください。 続いている不具合は、月報で最も目を引く部分です。続いていないものを続いているとすると、営繕の担当が直したはずの不具合を探しに行くことになります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 施設の先月分が0行 | 休館の月か、管理人が入力していないか。「利用なし」の月報を作り、休館の一覧と照らして違えば担当者へ |
| 一覧に無い部屋の名前 | 「未登録の部屋」として数え、名前を担当者に知らせる |
| 開始・終了の時刻が空 | 稼働率から外し、件数には数える。施設ごとの空の数を月報に出す |
| 団体名が「その他」の自由入力 | 区分を「未登録」として数える |
| API が失敗した・応答しない | その施設に「要再実行」と書き、次の施設へ進む。最後に再実行のメニューから動かす |
| 6分を超えそう | 処理済みの施設をプロパティに書いて止まり、10分後に続きから動く |
| 下書きのあとに前月分の行が増えた | 「追加の入力あり」の印。担当者が再実行する |
| JSON がスキーマに合わない | 1回だけ呼び直し、だめなら「要再実行」 |
| 根拠の番号が渡した番号に無い | そのまとめに「根拠不明」の印を付けて下書きに残す |
最も多いのは1行目と3行目です。 どちらも AI の問題ではなく、入力の仕方の問題です。
記録を残す
- 月次の実行ごとの、施設ごとの集計値の JSON
- AI に渡した自由記述(置き換えたあと)と、返ってきた JSON
- 「数字を確認」「根拠不明」の印の数
- 担当者が直した箇所 … 続きの判断を分けた・まとめた、所見を消した、など
- 修繕の一覧の状況の変更の履歴(誰が、いつ、どう変えたか)
- 安全の語の知らせを送った日時と宛先
4つ目が、指示を直す材料になります。 続きの判断を担当者が何件分けたかを月ごとに数え、多ければ、指示の「迷ったら空にする」を強めます。
04実装レベルの3段階
本記事の想定は半自動化です。 1件120分のうち、集計と読む作業と下書きが自動になり、担当者に残るのは下書きの確認と、修繕の一覧の手入れです。 半自動化を3か月回すと、修繕の一覧が育ちます。 続いている不具合のキーがたまり、何か月も直らない不具合が施設ごとに見えてきます。 営繕の担当との打ち合わせの材料が、毎月同じ形でそろいます。 本格構成で足すのは、予約と日誌の突き合わせです。 予約の記録をどう取り出せるかは、施設予約のシステムによります。CSV で書き出せるなら、そのファイルをドライブに置いて読む形が最も簡単です。 API の有無は、システムの提供元に確かめてください。
05工数削減シミュレーション
導入後 24件 × 30分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 公民館・地区集会所・コミュニティセンターなどを十数か所以上持ち、管理人が付ける利用日誌を担当課が毎月集計している市区町村。日誌がすでに Google フォームやスプレッドシートで入力されており、設備の不具合や利用者の要望が自由記述の欄に埋もれている場合。修繕の要望が施設の担当に届くまでに時間がかかっている場合。Google Workspace を使っている場合。
- 施設が数か所で、担当者が日誌を毎月すべて読める場合。日誌が紙だけで、入力の仕組みを変える予定が無い場合(紙の読み取りは別の構成が要ります)。施設予約システムに利用実績の集計と不具合の管理の機能があり、そこで足りている場合。なお、修繕の優先順位、予算の配分、利用ルールの変更の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の日誌から、自由記述の多い公民館を1館選ぶ
- その館の自由記述の行を、個人の名前と電話番号を消してからテキストに書き出す
- 先月の月報に載せた不具合の一覧も書き出す
- 手元のAIサービスの画面に両方を貼り付け、「設備の不具合と利用者の要望を分けて一覧にしてください。同じ設備の同じ症状は1件にまとめ、根拠にした行を必ず添えてください。先月の一覧に同じものがあれば、その番号を書いてください。迷ったら新しいものとしてください。数字の計算はしないでください」と指示する
- 出てきた一覧を、担当者が先月作った月報と見比べる
見比べるのは、取りこぼしと、まとめすぎです。 担当者が拾った不具合が一覧にあるか、別の症状が1件にまとめられていないかを1件ずつ確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 担当者の拾ったものとおおむね同じ | Apps Script の組み立てに進む |
| 別の症状が1件にまとめられた | 指示の「同じ症状」の定義を細かくする。構成は有効 |
| 部屋の名前がばらばらで、まとめられない | 部屋の名前の一覧を作るのが先 |
3行目が出たら、それが第3章の(a)の正体です。 集計にも同じ問題が出ているはずなので、部屋の名前の一覧を作るところから始めます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 所見に集計値に無い数字が出る | 数字の計算を禁じ、stat_keys で突き合わせて印を付ける |
| 別の症状が1件にまとめられる | 同じと言える根拠を書かせ、迷ったら新しいものにする |
| 「修理済み」の記述で不具合が消える | 状況を変えるのは担当者だけにする |
| 部屋の名前の表記ゆれで稼働率が割れる | 別名の一覧で、スクリプトがそろえる |
| 休館日が分母に入って稼働率が下がる | 休館日の一覧を枠の数から外す |
| 24施設で6分を超える | 数件ずつに分け、プロパティに進み具合を書く |
| 月末の夜の利用が入る前に動く | 下書きのあとに増えた行に「追加の入力あり」の印 |
| トリガーが担当者の異動で止まる | 課の共有のアカウントで作る |
| 毎月の時刻がずれる | 時間主導型は1時間の幅で動く。出勤前に終わる時刻にする |
| スキーマで 400 が返る | additionalProperties: false を付け、数値の制約を書かない |
| 個人の名前が要約に残る | 前処理で置き換え、指示でも禁じる |
| 安全に関わる記述が月末まで眠る | フォーム送信で語の一覧と突き合わせ、すぐ知らせる |
上の2行が、この構成の失敗のほとんどです。 どちらも、月報を読む人が気づきにくい誤りです。数字の誤りは突き合わせの仕組みで、まとめすぎは「迷ったら分ける」の指示で防ぎます。
最後の行は、設計の最初に入れてください。 月次の要約の仕組みを作ると、すべての情報が月に1回しか動かない形になりがちです。安全に関わるものだけは、要約の流れから外します。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 施設の利用の記録(団体名、人数、時刻)、設備の状態、利用者からの要望と苦情、管理人のメモに書かれることがある利用者の個人の名前と連絡先です。
- 外部のサービスを使ってよいかを先に確かめる … 日誌の自由記述を外部の AI に渡してよいかは、市の情報セキュリティの規程と、個人情報の取り扱いの規程によります。 導入の前に、所管の課と情報政策の担当に確かめます
- 個人の名前と連絡先を渡さない … 前処理で置き換えますが、置き換えの漏れは出ます。 管理人のメモの欄に個人の名前や電話番号を書かないよう、記入の手引きで頼みます
- 団体の利用の記録を広げない … 団体ごとの利用の回数は、特定の団体が施設をよく使っていることを示す情報です。月報の閲覧者を課の中と施設の運営の会議に限ります
- 修繕の判断を AI に任せない … AI は記述をまとめるだけで、直すかどうか、いつ直すかは営繕の担当と課長が決めます
- 安全に関わる知らせを AI に頼らない … 語の一覧との突き合わせで送り、AI の判断を待ちません
- 利用の偏りの所見を、団体への指導に直接使わない … 所見は集計値の言い換えで、偏りの理由までは分かりません。 施設の運営の会議で話し合う材料にとどめます
誤りが起きた場合のリスクは、不具合を見落とすことと、誤った数字が月報に載ることの2つです。 前者はまとめすぎから、後者は AI の数字の言い換えから起きます。どちらも、担当者が根拠の行と集計表で確かめる工程を残すことで防ぎます。
10まず何から始めるか
1週目:部屋の名前の一覧を作る
24施設の部屋の正式な名前と、日誌で書かれがちな別名を集めます。先月の日誌の部屋の列を施設ごとに並べ、表記の種類を数えるところから始めます。 時間帯ごとの貸し出しの枠の数と休館日も同じシートに書きます。
2週目:1館で試す
自由記述の多い公民館を1館選び、先月の自由記述を手元のAIサービスで不具合と要望に分けさせます。担当者が作った月報と見比べ、取りこぼしとまとめすぎを数えます。
3週目:修繕の一覧と安全の語の一覧を作る
過去3か月の月報から不具合を拾い、キーを付けて修繕の一覧にします。営繕の担当と一緒に、状況の列を埋めます。 安全の語の一覧を作り、フォーム送信のトリガーで知らせを送るところまで動かします。
4週目:月次の処理をつなぐ
集計、Claude API の呼び出し、月報の下書き、修繕の一覧への追記を作ります。初回は3施設だけで動かし、担当者が下書きと日誌を見比べます。
2か月目: 24施設に広げ、担当者が直した箇所を数えます。3か月目以降: 1件120分が何分になったかを実測し、続いている不具合の一覧を営繕の担当との打ち合わせに毎月出せるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導型のトリガーが1分ごとから月に1回までの間隔で動かせること。時刻が少しずれることがあり、指定した時刻の1時間のあいだで選ばれること。フォーム送信のトリガーにスプレッドシート用とフォーム用があること。インストール型のトリガーが作った人のアカウントで動き、別のアカウントからは見えないこと | Google Apps Script: Installable Triggers | 2026-10-08 |
onMonthDay() で月の日付を指定できること。atHour() の時刻がその1時間のあいだで動くこと。nearMinute() に前後15分の幅があること | Google Apps Script: Class ClockTriggerBuilder | 2026-10-08 |
| 1回の実行が6分までであること。トリガーの合計の実行時間が一般で1日90分、Google Workspace で1日6時間であること。URL Fetch の呼び出しが一般で1日2万回、Google Workspace で1日10万回であること。MailApp の宛先が一般で1日100、Google Workspace で1日1,500であること | Google Apps Script: Quotas for Google Services | 2026-10-08 |
Messages API の output_config.format に type: "json_schema" とスキーマを渡すと、スキーマに合う JSON が返ること。Claude API で正式提供でベータのヘッダが要らないこと。enum が使えること。オブジェクトに additionalProperties: false が必要なこと。minimum・maximum などの数値の制約が使えず、使うと 400 が返ること | Claude API Docs: Structured outputs | 2026-10-08 |
日誌の自由記述を外部の AI に渡してよいかは、市の情報セキュリティと個人情報の取り扱いの規程に沿って決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1121)についてのご相談はこちらから。
