生産日報の稼働・停止・不良の記録を月次で集計し、設備ごとの稼働率と停止理由の上位、前月からの変化を説明するコメントの下書きを工場長への報告にする
毎日の生産日報に残る設備ごとの稼働・停止・不良の記録を月の初めに集計し、稼働率と停止理由の上位、前月からの変化を表にします。変化の理由を日報の記述から要約したコメントの下書きを付け、工場長への月報にします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate/Python
- 対象業界
- 製造
- 対象部門
- 生産
- 対象業務
- 要約/集計・分析
- 主な課題
- データ分析に時間がかかる/属人化している/書類作成に時間がかかる
- AIで行う処理
- 要約
- 主な効果
- 判断支援/品質標準化/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 日報の回答のシートを前月分で絞り込み、設備ごとに稼働時間・停止の時間・生産数・不良数を集計する
- 計画の稼働時間に対する稼働時間の比率(稼働率)と、生産数に対する良品の比率(良品率)を計算する
- 停止の時間を理由のコードごとに合計し、多い順に並べる
- 前月の月報を開き、稼働率と停止の理由の上位を比べる
- 稼働率が大きく動いた設備について、日報の自由記述を読み返し、理由を探す
- 設備ごとにコメントを書き、月報のシートにまとめる
- 課長が目を通し、工場長へ送る
- 自動毎月2日の朝、Apps Script の時間主導型のトリガーが動く
- 自動スクリプトが前月の日報を設備ごとに集計し、稼働率・良品率・停止の時間の理由別の合計・前月との差を計算して、集計のシートに書く
- 自動設備ごとに、計算済みの数字と、停止の自由記述(前月分)を Gemini API に渡す
- 自動Gemini API が、変化の要点とその理由を日報の記述の範囲で要約し、決まった形の JSON で返す
- 自動スクリプトが、コメントの中の数字を集計と照らし、一致しないものに印を付ける
- 自動月報のシートに、設備ごとの表とコメントの下書きを並べ、生産管理課へメールで知らせる
- 人生産管理課の担当が、印の付いたものを先に、コメントの根拠を確かめて直す
- 人課長が確かめ、「確認済」にしたら、スクリプトが工場長へ月報のリンクを送る
各工程の詳しい説明を読む
- 日報の回答のシートを前月分で絞り込み、設備ごとに稼働時間・停止の時間・生産数・不良数を集計する
- 計画の稼働時間に対する稼働時間の比率(稼働率)と、生産数に対する良品の比率(良品率)を計算する
- 停止の時間を理由のコードごとに合計し、多い順に並べる
- 前月の月報を開き、稼働率と停止の理由の上位を比べる
- 稼働率が大きく動いた設備について、日報の自由記述を読み返し、理由を探す
- 設備ごとにコメントを書き、月報のシートにまとめる
- 課長が目を通し、工場長へ送る
(a)集計に時間がかかる。 1番目から3番目は、ピボットテーブルを設備ごとに組み直す作業です。60台を3名で分けても、1人20台分の表を作るのに半日以上かかります。 計画停止を稼働率の分母から除くかどうかも、担当者によって扱いが違います。
(b)変化の理由を探すのに日報を読み返す。 5番目がいちばん重い作業です。稼働率が下がった設備の、前月の日報の自由記述を数十行読み、「中旬に金型の冷却水の詰まりが3回」のような原因を拾い出します。 拾えるかどうかは、読む人の設備への慣れで決まります。
(c)コメントの書き方が担当ごとに違う。 ある担当は停止の理由を細かく書き、別の担当は「先月並み」とだけ書きます。工場長が設備どうしを比べようとしても、書かれている粒度がそろっていません。
(d)月報がそろうのが遅い。 集計と読み返しに1週間近くかかり、月報が工場長に届くのは月の半ばです。その月の生産計画はすでに動いており、月報の内容を翌月の計画にしか生かせません。
- 【自動】 毎月2日の朝、Apps Script の時間主導型のトリガーが動く
- 【自動】 スクリプトが前月の日報を設備ごとに集計し、稼働率・良品率・停止の時間の理由別の合計・前月との差を計算して、集計のシートに書く
- 【自動】 設備ごとに、計算済みの数字と、停止の自由記述(前月分)を Gemini API に渡す
- 【自動】 Gemini API が、変化の要点とその理由を日報の記述の範囲で要約し、決まった形の JSON で返す
- 【自動】 スクリプトが、コメントの中の数字を集計と照らし、一致しないものに印を付ける
- 【自動】 月報のシートに、設備ごとの表とコメントの下書きを並べ、生産管理課へメールで知らせる
- 【人】 生産管理課の担当が、印の付いたものを先に、コメントの根拠を確かめて直す
- 【人】 課長が確かめ、「確認済」にしたら、スクリプトが工場長へ月報のリンクを送る
7番目が、この設計の分かれ目です。 コメントの理由は日報に書かれた言葉の要約で、本当の原因かどうかは、設備を知っている担当が確かめます。 「冷却水の詰まり」と書かれていても、その奥に金型の設計の問題があるかもしれません。
2番目と4番目を分けているのも、意図してのことです。 稼働率の計算をAIに任せると、計画停止を分母に入れるかどうかが呼ぶたびに揺れます。計算の決まりはスクリプトの1か所に書き、AIには計算させません。
02今回想定するシステム構成
生産日報(Google フォーム → 回答のスプレッドシート) 停止理由のコード表/設備の一覧(スプレッドシート) │ ▼【トリガー】時間主導型(毎月2日 6時台) Google Apps Script ├──▶ 前月の日報を設備ごとに集計 │ 稼働率・良品率・停止の時間(理由別)・前月との差 ├──▶ 集計のシートに書く ▼ Gemini API(/v1beta/interactions、response_format で JSON を指定) │ 設備ごとに:変化の要点/理由(日報の記述から)/根拠にした記述 ▼ Google Apps Script ── コメントの数字を集計と照らす ├──▶ 月報のシート(表とコメントの下書き) └──▶ MailApp ── 生産管理課へ知らせる ▼ 【人】生産管理課が確かめて直す → 課長が「確認済」 ▼ MailApp ── 工場長へ月報のリンクを送る
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Python、Power Automate、Make |
| 生成AI | Gemini API(構造化出力) | Claude API、OpenAI API |
| 入力 | Google フォーム(生産日報) | Microsoft Forms |
| 保管 | Google スプレッドシート(日報の回答、コード表、設備の一覧、集計、月報) | Microsoft Lists |
新しく足すのは、スクリプトと Gemini API の利用だけです。 日報の入れ方は、現場の班長にとって今のままです。最初の準備作業は、設備の一覧に「計画停止を稼働率の分母から除くか」と「前月との差で知らせる幅」の列を足すことです。
集計は Apps Script のスクリプトで行います。 時間主導型のトリガーは、毎分から月1回までの間隔で設定できます。インストール型のトリガーは、作った人のアカウントで動きます。 生産管理課の共有の管理用アカウントで作り、日報のシートを読む権限を与えておきます。
AIの出力の形は、Gemini API の構造化出力で固定します。 公式のページでは、https://generativelanguage.googleapis.com/v1beta/interactions に、モデル・入力・response_format(type に text、mime_type に application/json、schema に JSON Schema)を送る書き方が示されています。スキーマには enum や required を書けるので、変化の区分を決めた語に絞れます。 ただし公式のページは、構文として正しい JSON が返っても、値が正しいかはアプリケーションの側で確かめるよう勧めています。第7章の数字の照らし直しは、そのためのものです。
03どうやって実装するのか
処理の起点を決める
毎月2日の6時台に、月1回の時間主導型のトリガーで動かします。 ScriptApp.newTrigger で作るトリガーに、onMonthDay(2) と atHour(6) を指定します。時刻は1時間の幅の中で選ばれます。 9時のトリガーなら9時から10時の間のどこかで動き、その時刻が毎回保たれるとされています。月報の締め切りに対して分単位の正確さは要らないので、この幅で足ります。
1日ではなく2日にするのは、月末の夜勤の日報を待つためです。 2直の工場では、月末の夜勤の日報が翌月1日の朝に入ります。1日の朝に動かすと、最後の夜勤が集計から漏れます。 入力の遅れが多い工場なら、3日にずらします。
60台を1回の実行で処理しきれない場合に備えて、続きから動けるようにします。 1回の実行は6分までです。集計そのものは数十秒で終わりますが、Gemini API を60回呼ぶと、応答の待ち時間で6分を超えることがあります。 設備ごとに「処理済」の印を集計のシートに残し、5分を過ぎたら止めて、10分後に動く1回限りのトリガーを作って続きから動かします。 全台の処理が終わったら、その1回限りのトリガーを消します。
トリガーの実行時間には、1日の合計の上限もあります。 個人の Google アカウントでは1日90分、Google Workspace では1日6時間です。月1回の処理なので上限には遠いのですが、同じアカウントで毎日動く別のスクリプトがあれば、合わせた時間で考えます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 生産日報 | 日付、直、設備、計画の稼働時間、停止の時間と理由のコード、停止の自由記述、生産数、不良数と不良の区分 | 日報の回答のシート |
| 停止理由のコード表 | コード、名前、計画停止か否か | コード表のシート |
| 設備の一覧 | 設備ID、名前、工場、種類、計画停止を分母から除くか、前月との差で知らせる幅 | 設備の一覧のシート |
| 前月の集計 | 設備ごとの稼働率・良品率・停止の時間(理由別) | 集計のシート(前月の実行で書いたもの) |
質を決めるのは、停止の自由記述です。 コードが「設備故障」だけでは、AIは「設備故障が増えた」としか書けません。「ヒーターの温度が上がらず再起動」と書かれていれば、同じ症状が何回あったかを拾えます。 班長に、症状・処置・再発かどうかの3つを書く書き方の例を配っておきます。
前月の集計は、スクリプトが毎月書く集計のシートから読みます。 前月の月報のコメントを読み返す必要はありません。比べるのは数字だけで、前月のコメントはAIに渡しません。 前月のコメントを渡すと、その言い回しを引き継いで、今月の記述に無い理由を書くことがあります。
データの取得方法を決める
日報の回答のシートを SpreadsheetApp で開き、前月の1日から末日までの行だけを、日付の列で絞って読みます。 月に約2,400行なので、シートの値をまとめて読み、スクリプトの中で設備ごとに分けます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 前月の日報の行 | 日報の回答のシート | 設備ごとの集計 |
| 計画停止のコード | コード表のシート | 稼働率の分母から除く停止を決める |
| 分母の扱いと知らせる幅 | 設備の一覧のシート | 設備ごとの計算と印 |
| 前月の数字 | 集計のシート | 前月との差 |
稼働率と良品率は、スクリプトの1か所で計算します。
| 数字 | 計算 |
|---|---|
| 負荷時間 | 計画の稼働時間の合計 -(分母から除く設備なら)計画停止の時間 |
| 稼働時間 | 負荷時間 - 計画停止以外の停止の時間 |
| 稼働率 | 稼働時間 ÷ 負荷時間 |
| 良品率 | (生産数 - 不良数)÷ 生産数 |
| 停止の理由の上位 | 計画停止以外の停止の時間を、理由のコードごとに合計して多い順に3つ |
| 前月との差 | 今月の値 - 前月の値(稼働率と良品率はポイント、停止の時間は分) |
この表の決め方は、自社の定義に合わせて書き換えてください。 大事なのは、決め方がスクリプトの1か所にあり、毎月同じ式で計算されることです。担当者ごとに分母が違う、という第3章(a)の問題は、ここで消えます。
API キーは、スクリプトのプロパティに置きます。 スクリプトのプロパティは、そのスクリプトの利用者全員が読める、アプリ全体の設定の置き場です。スクリプトの編集者を生産管理課の管理者に限り、コードの中にキーを書きません。
AIへ渡す前に整形する
- 入力漏れの確認 … 設備×日×直で日報が無い組み合わせを数え、集計のシートに書きます
- 時間の矛盾の確認 … 停止の時間の合計が計画の稼働時間を超える行は、集計から外して印を付けます
- 未定義のコードの確認 … コード表に無い理由のコードは「その他」にまとめ、件数を残します
- 自由記述の絞り込み … AIに渡すのは、計画停止以外の停止の記述だけにします。1台あたり最大60件、長いものは先頭の200字にします
- 知らせる幅の判定 … 稼働率の前月との差が、設備の一覧の幅を超えたかどうかを、スクリプトで決めておきます
1番目の結果は、AIにも渡します。 日報の入力漏れが多い設備は、稼働率が上がって見えることがあります。 停止の記録が無ければ、停止が無かったことになるからです。入力漏れの数を渡し、「入力漏れが多く、数字の比較に注意」と書けるようにします。
5番目をスクリプトで決めるのは、AIに「大きな変化かどうか」を判断させないためです。 同じ3ポイントの低下を、AIは設備によって「大きく低下」とも「わずかに低下」とも書きます。幅を超えたかどうかの印をスクリプトが付け、AIはその印に合わせて書きます。
AIに処理させる
させるのは、設備ごとに、計算済みの数字の動きと、停止の記述から読み取れる理由を、3文以内のコメントに要約することです。
| 出すもの | 中身 | 根拠 |
|---|---|---|
| 変化の区分 | 改善/悪化/横ばい/比較に注意 | スクリプトが付けた幅の印と入力漏れの数 |
| 要点 | 稼働率・良品率・停止の上位のうち、動いたもの | 計算済みの数字 |
| 理由 | 停止の記述に繰り返し出てくる症状や処置 | 停止の自由記述 |
| 根拠の記述 | 理由の判断に使った記述の日付と直と本文 | 停止の自由記述 |
| させないこと | 理由 |
|---|---|
| 数字の計算 | スクリプトが計算した値だけを使う。AIが計算した稼働率は集計と合わない |
| 記述に無い原因の推測 | 「金型の老朽化と考えられます」のような推し量りは、保全の判断を誤らせる |
| 対策の提案 | 保全の方法や生産計画の変更は、工場長と保全の担当が決める |
| 人の評価 | 「班長の入力が不十分」のように、記録した人を評価しない |
| 前月のコメントの引き継ぎ | 前月のコメントは渡さない |
2行目がいちばん起きやすい失敗です。 「設備故障」の停止が増えた設備を渡すと、AIは「経年による劣化が進んでいる可能性があります」と書き足します。それらしい推し量りは、工場長が保全の順番を決めるときの材料にされてしまいます。 記述に無いことは書かせず、根拠の記述が無い理由は、理由の欄を空にさせます。
指示内容を固定する
あなたは工場の生産管理課で、工場長への月報に載せる設備ごとのコメントを書く立場です。
次の集計の数字と、停止の記述だけを根拠に書いてください。推測で補わないでください。
【設備】{equipment_name}({plant}・{equipment_type})
【集計(前月 → 今月)】
稼働率:{availability_prev}% → {availability}%(差 {availability_diff} ポイント)
良品率:{yield_prev}% → {yield}%(差 {yield_diff} ポイント)
停止の理由の上位(今月):{top_reasons}
停止の理由の上位(前月):{top_reasons_prev}
知らせる幅を超えたか:{over_threshold}
日報の入力漏れ(設備×日×直):{missing_reports}件
【今月の停止の記述(計画停止を除く)】
{downtime_notes}
【書き方】
- category は improved / worsened / flat / caution のどれか1つ。
over_threshold が false なら flat、入力漏れが5件以上なら caution にしてください。
- summary には、動いた数字を上の値のまま書いてください。数字を計算しないでください。
- reason には、停止の記述に2回以上出てくる症状や処置を書いてください。
当てはまるものが無ければ空にしてください。
- evidence には、reason の根拠にした記述を、日付・直・本文のまま3件まで写してください。
- コメント全体は3文以内。
【厳守事項】
- 停止の記述に書かれていない原因を書かないでください。
「劣化」「老朽化」「可能性があります」のような推し量りをしないでください。
- 保全の方法、部品の交換、生産計画の変更などの対策を書かないでください。
- 日報を記録した人や班を評価しないでください。
「上の値のまま書く」と「計算しない」を両方書くのは、AIが差を計算し直すからです。 「82.4%から78.9%へ」と渡すと、自分で引き算をして「3.6ポイント低下」と書くことがあります。差もスクリプトが計算した値を渡し、そのまま写させます。
「2回以上出てくる」を条件にしているのは、1回きりの出来事を月の傾向として書かせないためです。 1回の停電が理由として書かれると、工場長は毎月の問題と受け取ります。
出力形式を固定する
response_format の schema に、次の形を指定します。
{
"equipment_id": "M-12",
"category": "worsened",
"summary": "稼働率が82.4%から78.9%に下がり(差 -3.5ポイント)、停止の理由の1位が金型交換から設備故障に変わった。",
"reason": "中旬以降、ヒーターの温度が上がらず再起動した記述が4回ある。",
"evidence": [
{ "date": "2026-09-14", "shift": "2直", "note": "ヒーター温度上がらず再起動 40分" }
]
}
1つ目の理由は、category を enum で4つに絞れることです。 月報の表で区分ごとに色を付け、工場長は worsened の設備から読めます。
2つ目は、summary の数字を照らし直せることです。 スクリプトが summary から数字を取り出し、集計の値と一つずつ比べます。集計に無い数字が1つでも入っていれば、そのコメントに「数字の不一致」の印を付けます。
3つ目は、evidence で根拠をすぐに確かめられることです。 担当者は日報のシートを開かずに、どの記述から理由が書かれたかを読めます。
月報のシートは、次のような並びにします。
| 設備 | 稼働率(前月→今月) | 良品率(前月→今月) | 停止の上位 | 区分 | コメント | 印 | 確認 |
|---|---|---|---|---|---|---|---|
| M-12 | 82.4% → 78.9% | 98.1% → 97.8% | 設備故障/金型交換/材料切れ | 悪化 | (AIのコメント) |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 日報・コード表・設備の一覧 | SpreadsheetApp | 前月の行と設定を読む |
| 集計のシート | SpreadsheetApp | 設備ごとの数字と処理済の印を書く |
| Gemini API | UrlFetchApp(POST) | 設備ごとに数字と記述を送り、JSON を受ける |
| 月報のシート | SpreadsheetApp | 表とコメントの下書きを並べる |
| 生産管理課・工場長 | MailApp | 下書きができたこと、確認済の月報のリンクを知らせる |
Gemini API の呼び出しは UrlFetchApp.fetch で行います。 method を post、contentType を application/json にし、headers に API キーのヘッダー(x-goog-api-key)を入れます。muteHttpExceptions を true にすると、失敗の応答でも例外を投げずに応答を返すので、応答コードを見て再試行するかどうかを決められます。
複数の設備をまとめて呼ぶなら、UrlFetchApp.fetchAll を使えます。 複数のリクエストを配列で渡し、それぞれの応答を配列で受け取ります。10台ずつまとめると、6分の上限の中で処理できる台数が増えます。 1日の URL Fetch の回数の上限(個人のアカウントで2万回、Workspace で10万回)には、月60回では遠く及びません。
工場長へのメールは、課長が「確認済」にした後にだけ送ります。 月報のシートの確認の列がすべて埋まったことを、毎日動く小さなトリガーで確かめ、埋まった日に1回だけ送ります。送ったら、送った日を集計のシートに書き、二度送らないようにします。 メールの1日の送信先の数にも上限があり、個人のアカウントで100、Workspace で1,500です。
人が確認する
生産管理課の担当は、月報のシートの印の付いた行から見ます。
- 「数字の不一致」の印 … コメントの数字を集計の値に直します。直せないほど食い違うなら、コメントを書き直します
worsenedの設備 …evidenceの記述を読み、理由が設備の実情と合っているかを確かめます。保全の担当に一言聞けば分かることは聞きますcautionの設備 … 入力漏れの多い設備です。数字そのものを信じてよいかを、班長に確かめますflatとimprovedの設備 … 流し見て、違和感があるものだけ開きます
2番目を省かないでください。 工場長は、悪化した設備のコメントを読んで保全の順番を決めます。日報の記述に書かれた症状が、本当の原因の手前の症状であることは珍しくありません。 設備を知っている人の一言を足すだけで、コメントの重みが変わります。
直した内容は、確認の列の横に「直した」と残します。 月に何件直したか、どの区分で直したかを見れば、指示のどこを直すべきか、日報の書き方のどこを直すべきかが分かります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 6分を超えそうになる | 処理済の印を残して止め、1回限りのトリガーで続きから動かす |
| Gemini API が失敗の応答を返す | 応答コードを記録し、その設備を未処理のまま残す。続きの実行で再試行する |
| JSON がスキーマどおりでない | その設備のコメントを空にし、「生成失敗」の印を付ける |
| コメントの数字が集計と合わない | 「数字の不一致」の印を付ける。コメントは消さずに担当者に見せる |
| 入力漏れが多い | caution にし、班長に確かめる |
| 停止の時間が計画の稼働時間を超える行 | 集計から外し、行の一覧を担当者に渡す |
| 新しい設備が一覧に無い | 日報にあって一覧に無い設備IDを数え、一覧への追加を担当者に頼む |
| トリガーが失敗する | Apps Script が失敗の内容をメールで知らせる。管理用アカウントのメールを課の誰かが見る |
最後の行を軽く見ないでください。 トリガーの失敗の知らせは、トリガーを作ったアカウントに届きます。 共有の管理用アカウントのメールを誰も見ていないと、月報が作られていないことに締め切りの日まで気づきません。
記録を残す
- 実行した日時、対象の月、処理した設備の数と、処理できなかった設備
- 設備ごとの集計の数字(集計のシート。翌月の比較に使う)
- Gemini API に送った内容と、返った JSON の全文
- 数字の照らし直しの結果と、付けた印
- 担当者が直した内容と、確認した人
- 工場長へ送った日時
2つ目の集計のシートは、消さずに積み上げます。 翌月の比較の元になるだけでなく、半年分の稼働率の推移を、いつでも同じ定義で見返せます。
04実装レベルの3段階
最小構成でも、数字はスクリプトか手元の集計の値を使います。 画面に日報の行をそのまま貼って稼働率まで計算させると、第12章の1行目の失敗をそのまま試すことになります。 本記事の想定は半自動化です。 1件40分が12分になり、その12分の中心は、悪化した設備の理由を保全の担当に確かめることと、コメントを直すことです。 段階を飛ばさないでください。 半自動化を3か月回すと、停止の自由記述の書き方がそろってきます。記述がそろってから保全の記録を結び付けるほうが、修理と停止の関係を読み違えません。
05工数削減シミュレーション
導入後 60件 × 12分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 成形機・加工機・組立ラインなどの設備を数十台持つ工場で、設備ごと・直ごとの生産日報(稼働時間、停止の時間と理由、生産数、不良数)を Google フォームやスプレッドシートで毎日記録している場合。月の初めに生産管理の担当が設備ごとの稼働率と停止の理由を集計し、工場長への月報にコメントを書いている場合。停止の理由がコードと自由記述の両方で残っている場合。Google Workspace と Gemini API を使える場合。
- 生産日報が紙だけで、データとして残っていない場合(先に記録の電子化が要ります)。設備の稼働を IoT の仕組みで自動で取っており、停止の理由の分析まで専用の仕組みでできている場合。設備が数台で、月報のコメントを書く手間が小さい場合。なお、設備の保全や生産計画の変更の判断、不良の原因の特定は、この構成では代替できません。
07最小構成で試す方法
- 前月の月報から、稼働率が大きく動いた設備を5台、ほとんど動かなかった設備を5台選ぶ
- その10台について、集計の数字(前月と今月)と、今月の停止の自由記述をシートから書き出す
- 1台ずつ、手元のAIサービスの画面に貼り付ける
- 第7章の指示の例をそのまま使い、コメントを書かせる
- 当時担当者が書いたコメントと並べ、課長に「どちらが工場長の判断に使えるか」を見てもらう
| 出てきた内容 | 判断 |
|---|---|
| 理由が当時のコメントと同じか、より具体的 | スクリプトの作成に進む |
| 記述に無い原因や対策を書く | 指示の書き方で直る。構成は有効 |
| 理由の欄がほとんど空になる | 停止の自由記述が足りない。 日報の書き方が先 |
3行目が出ることは珍しくありません。 担当者は、日報に書かれていない現場の話を知っていて、それをコメントに書いていたということです。その話を日報に書いてもらうことが、この構成の最初の作業になります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| コメントの数字が表と合わない | 数字を計算させず、スクリプトが照らし直す |
| 記述に無い原因や対策が書かれる | 推し量りと対策を禁じ、理由は2回以上出てくる記述に限る |
| 1日に動かして月末の夜勤が漏れる | 2日以降に動かす |
| 60台で6分を超える | 処理済の印と1回限りのトリガーで続きから動かす。fetchAll でまとめる |
| 入力漏れの多い設備の稼働率が高く出る | 入力漏れの数を渡し、caution にする |
| 計画停止の扱いが設備ごとに違う | 設備の一覧の列で決め、スクリプトの1か所で計算する |
| 「大きく」「わずかに」が設備ごとに揺れる | 知らせる幅の判定をスクリプトで行う |
| 前月の言い回しが引き継がれる | 前月のコメントを渡さない |
| API キーがコードに書かれる | スクリプトのプロパティに置き、編集者を絞る |
| トリガーの失敗に気づかない | 管理用アカウントのメールを課で見る |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIに数字と原因を「作らせて」しまうことから出ています。 数字はスクリプトが作り、原因は日報に書かれたものだけを要約させます。AIの仕事を要約に絞ることが、月報の信用を守ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 設備ごとの稼働・停止・不良の数字、停止の自由記述、日報を入力した班長の名前です。生産の数量と不良率は、取引先との価格交渉に関わる社外秘の情報です。
- AIに渡す項目を絞る … 渡すのは集計の数字と停止の記述だけにし、日報を入力した人の名前や、製品の品番と取引先の名前は渡しません。 設備IDと設備の種類で足ります
- 人の評価に使わない … コメントに入力した人や班の評価を書かせません。日報が人の評価に使われると分かれば、停止の記述が書かれなくなります
- この構成は保全と生産計画の判断を代替しません … どの設備を先に直すか、生産計画をどう変えるかは、工場長と保全・製造の担当が決めることです。 この構成が出すのは、記録に書かれた範囲の要約です
- API キーとスクリプトの編集者を絞る … スクリプトのプロパティは、そのスクリプトの利用者全員が読めます。スクリプトの編集者を生産管理課の管理者に限ります
- 工場長への送信を確認の後にする … 確認の列が埋まる前に送らない作りにします
- 送ったデータと応答を残す … Gemini API に何を送り、何が返ったかを保存のシートに残します。月報の記載について後から問われたときに、どの記述を根拠にしたコメントだったかをたどれます
誤りが起きた場合のリスクは、数字が表と食い違うことと、記録に無い原因が月報に載ることの2つです。 前者はスクリプトの照らし直しで、後者は推し量りの禁止と担当者の確認で防ぎます。
10まず何から始めるか
1週目:稼働率の定義を決める
計画停止を稼働率の分母から除くかどうか、どの理由のコードを計画停止とするかを、設備の種類ごとに課長と決めます。 設備の一覧とコード表に列を足します。
2週目:10台で試す
前月の10台について、手元のAIサービスでコメントを書かせ、当時のコメントと並べます。記述に無い原因や対策を書いていないかを最優先で見ます。
3週目:集計のスクリプトを書く
日報の回答のシートを読み、設備ごとの稼働率・良品率・停止の上位・前月との差を集計のシートに書くところまで作ります。この時点では AI を呼ばず、集計の値を担当者の手計算と突き合わせます。
4週目:Gemini API とつなぐ
設備ごとに Gemini API を呼び、コメントの下書きと数字の照らし直しを月報のシートに並べます。処理済の印と続きからの実行も、ここで作ります。
2か月目: 月初めのトリガーで本番の月報を作り、担当者が直した件数を数えます。班長に停止の記述の書き方の例を配ります。3か月目以降: 1件40分が何分になったかを実測し、停止の記述がそろい、直す件数が落ち着いた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導型のトリガーが毎分から月1回までの間隔で設定できること。9時のトリガーなら9時から10時の間で時刻が選ばれ、その時刻が保たれること。インストール型のトリガーが作った人のアカウントで動くこと。失敗するとメールで知らせること | Google: Installable triggers | 2026-10-07 |
onMonthDay で月の中の日を、atHour で時を指定できること | Google: Class ClockTriggerBuilder | 2026-10-07 |
| 1回の実行が6分まで。トリガーの合計の実行時間が1日90分(個人)/6時間(Workspace)。URL Fetch が1日2万回(個人)/10万回(Workspace)。メールの送信先が1日100(個人)/1,500(Workspace) | Google: Quotas for Google Services | 2026-10-07 |
UrlFetchApp.fetch の method・contentType・headers・payload の指定。muteHttpExceptions を true にすると失敗の応答でも例外を投げずに応答を返すこと。fetchAll で複数のリクエストをまとめて送れること | Google: Class UrlFetchApp | 2026-10-07 |
| スクリプトのプロパティが、そのスクリプトの利用者全員が使えるアプリ全体の設定の置き場であること | Google: Properties Service | 2026-10-07 |
MailApp.sendEmail でメールを送れること | Google: Class MailApp | 2026-10-07 |
構造化出力を /v1beta/interactions に response_format(type・mime_type・schema)を付けて求めること。x-goog-api-key のヘッダーで認証すること。スキーマで enum・required などを使えること。構文として正しい JSON が返っても値はアプリケーションの側で確かめるよう勧めていること | Google AI for Developers: Structured outputs | 2026-10-07 |
稼働率の定義、保全の優先順位、生産計画の判断は、自社の生産・保全の担当で決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0781)についてのご相談はこちらから。
