造園会社がお客様から届く庭の写真を Gemini で見て、剪定・伐採・除草の作業量を見立て、見積の明細の下地を作る
お客様からメールで届く庭の写真を Gemini で見て、木ごとの高さの区分と、剪定・伐採・抜根の作業の候補、生垣と除草と処分の量の区分を拾います。自社の単価表と結び付けて見積の明細の下地にし、現地で確かめる事項を添えます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/不動産/建設
- 対象部門
- 営業
- 対象業務
- 内容確認・チェック/書類作成
- 主な課題
- 人手が足りない/属人化している/書類作成に時間がかかる
- AIで行う処理
- 画像認識
- 主な効果
- 対応スピード向上/属人化解消/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 見積の依頼のメールを開き、写真を1枚ずつ見る
- 写真の重なりを見て、どの木がどの写真に写っているかを頭の中で整理する
- 社長かベテランの担当に写真を回し、木ごとの高さ、剪定か伐採か、生垣の長さ、除草の広さの見立てを聞く
- 見立てを単価表に当てはめ、見積の一覧のシートに明細を書く
- 電線の近く、隣の家との境、車の入る道など、写真では分からないことを書き出す
- 現地を見に行くか、写真の概算で返すかを決める
- お客様に、概算と、現地を見に行く日の候補を返す
- 人お客様が、ホームページの「写真の撮り方」の案内に沿って写真をメールで送る
- 自動スクリプトが15分ごとに受付のメールを見て、新しい依頼の写真を依頼ごとのフォルダに保存する
- 自動写真の向きと大きさをそろえ、依頼の本文と一緒に Gemini API に渡す
- 自動木ごとの候補、生垣・除草・処分の量の区分、足りない写真、現地で確かめる事項を JSON で受け取る
- 自動スクリプトが区分を単価表に当てはめ、見積の一覧のシートに明細の下地を書く
- 人担当が下地と写真を並べて見て、区分を直し、明細を確かめる
- 人担当が、写真の概算で返すか、現地を見に行くかを決める。迷うものは社長に回す
- 人担当が、概算と、足りない写真のお願い、または現地を見に行く日の候補をお客様に返す
各工程の詳しい説明を読む
- 見積の依頼のメールを開き、写真を1枚ずつ見る
- 写真の重なりを見て、どの木がどの写真に写っているかを頭の中で整理する
- 社長かベテランの担当に写真を回し、木ごとの高さ、剪定か伐採か、生垣の長さ、除草の広さの見立てを聞く
- 見立てを単価表に当てはめ、見積の一覧のシートに明細を書く
- 電線の近く、隣の家との境、車の入る道など、写真では分からないことを書き出す
- 現地を見に行くか、写真の概算で返すかを決める
- お客様に、概算と、現地を見に行く日の候補を返す
(a)見立てを聞くまで先に進めない。 3番目の手順が、社長とベテランの手が空くのを待つ時間になります。2人が現場に出ている日は、依頼のメールが夕方まで開かれたままになります。
(b)同じ写真でも見立てが人によって違う。 「5メートル前後」の木を、別の担当は「4メートルくらい」と書きます。高さの区分が1つ違うと、単価が変わります。 どの目安と比べたかが残っていないので、後から見直せません。
(c)写真の足りないことが、後から分かる。 根元の写っていない木、裏庭の写っていない家があっても、見積を書き始めてから気付きます。 そこからお客様に写真を頼むと、返事がもう1日遅れます。
(d)現地で確かめることが漏れる。 電線にかかった枝、隣地にはみ出した木、車の入れない細い道は、現地で作業できるかどうかを分けます。 書き出しが担当の経験に頼っているので、漏れたまま概算を返すと、作業の日に段取りが変わります。
- 【人】 お客様が、ホームページの「写真の撮り方」の案内に沿って写真をメールで送る
- 【自動】 スクリプトが15分ごとに受付のメールを見て、新しい依頼の写真を依頼ごとのフォルダに保存する
- 【自動】 写真の向きと大きさをそろえ、依頼の本文と一緒に Gemini API に渡す
- 【自動】 木ごとの候補、生垣・除草・処分の量の区分、足りない写真、現地で確かめる事項を JSON で受け取る
- 【自動】 スクリプトが区分を単価表に当てはめ、見積の一覧のシートに明細の下地を書く
- 【人】 担当が下地と写真を並べて見て、区分を直し、明細を確かめる
- 【人】 担当が、写真の概算で返すか、現地を見に行くかを決める。迷うものは社長に回す
- 【人】 担当が、概算と、足りない写真のお願い、または現地を見に行く日の候補をお客様に返す
6番目と7番目が、この設計の分かれ目です。 AIの下地は、担当がどの木をどの区分で見ればよいかの出発点です。区分を決め、現地を見に行くかを決めるのは担当です。
5番目で金額を出すのは、スクリプトです。 AIが返すのは区分と数量の候補までで、単価表を引くのは、決まりの書かれたシートの側に置きます。単価を改めたときは、シートを直すだけで済みます。
02今回想定するシステム構成
お客様(写真の撮り方の案内に沿って撮る) ▼ メールで送る(本文に住所の市区町村・依頼の内容) Gmail(見積の受付のアドレス。届いたものにラベル) ▼【トリガー】15分ごとの時間主導型 Google Apps Script ├── 添付の写真を取り出し、依頼ごとのフォルダに保存 ├── 向きの補正と縮小 ▼ Gemini API(画像の理解・構造化出力)── 依頼ごとに全部の写真 │ 木ごとの候補(どの写真のどこか、高さの区分、比べた目安) │ 作業の候補(剪定・強い剪定・伐採・抜根) │ 生垣の長さ、除草の範囲、処分の量の区分 │ 足りない写真、現地で確かめる事項 ▼ Google Apps Script ── 単価表を引き、見積の一覧に明細の下地を書く ▼ 【人】担当が区分を直し、概算で返すか現地を見に行くかを決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Gemini API(写真の木と範囲を見て、区分と現地で確かめる事項を返す) | Claude API、OpenAI API |
| 連携 | Google Apps Script(メールの受け取り、写真の保存、呼び出し、単価表の照合と書き込み) | Python |
| 受付 | Gmail(見積の受付のアドレス) | - |
| 台帳 | Google スプレッドシート(単価表、見積の一覧、依頼の記録) | - |
新しく足すのは、スクリプトと Gemini API の契約、そしてお客様向けの「写真の撮り方」の案内です。 単価表と見積の一覧、見積書の書式は、すでにあるものです。見積の金額の決め方と、現地調査の段取りは変えません。
写真を見る土台は、Gemini API の画像の理解です。 公式の案内では、対応する形式は PNG、JPEG、WEBP、HEIC、HEIF で、1つのリクエストに複数の画像を入れられます。 依頼ごとに届いた写真を全部まとめて渡し、同じ木が複数の写真に写っているのを、AIに組にさせます。 枠は [ymin, xmin, ymax, xmax] の順で0〜1000に正規化されて返ります。
出力は構造化出力で受けます。 /v1beta/interactions に送り、response_format で mime_type を application/json にし、schema にスキーマを入れます。enum で値を決まった文字列に絞れます。値はアプリ側で検証するよう書かれています。
受付のメールは、Gmail のメッセージを Apps Script から読みます。 メッセージから添付ファイルを Blob の配列として取り出せ、差出人のアドレスと日時も取れます。本文に貼られた画像(インライン画像)を含めるかどうかも選べます。 スマートフォンのメールでは、写真が本文に貼られて届くことがあるので、含める設定にします。
03どうやって実装するのか
処理の起点を決める
15分ごとに動く時間主導型のトリガーで、受付のメールを見ます。 Google Apps Script のインストール型のトリガーには、毎分から月1回まで間隔を選べる時間主導型があります。受付のアドレスに届いた、まだラベルの付いていないメールだけを処理し、終わったら「下地済み」のラベルを付けます。 ラベルは、下地を書き終えたときだけ付けます。
インストール型のトリガーは、作った人のアカウントで動きます。 担当それぞれのアカウントで作るのではなく、受付のアドレスを持つ営業の共用のアカウントで1つだけ作ります。 作った人の異動で止まらないよう、作り直しの手順を単価表のシートの隅に書いておきます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 写真 | お客様が撮った庭の写真。届いた順 | Gmail の添付とインライン画像 |
| 依頼の本文 | 「剪定」「草を何とかしたい」などの依頼の内容、市区町村、希望の時期 | Gmail の本文 |
| 写真の撮り方の案内 | 全体を1枚、木ごとに根元から先まで1枚、目安になる物を入れて | 案内の文(スクリプトに持たせる) |
| 区分の一覧 | 高木・中木・低木の高さの区分、生垣の長さの区分、除草の広さの区分、処分の量の区分 | 単価表のシート |
| 作業の種類の一覧 | 剪定、強い剪定(切り詰め)、伐採、抜根、生垣の刈り込み、除草、処分 | 単価表のシート |
| 現地で確かめる事項の一覧 | 電線・電話線の近く、隣地へのはみ出し、車と脚立の入る道、建物や塀との近さ、枯れや傾き | スクリプトに持たせる |
質を決めるのは、写真の撮り方の案内です。 「木の根元から先までを1枚に入れてください」「2階の窓や塀など、高さの分かる物を一緒に入れてください」と頼んでおくと、高さの区分を目安と比べて返せる写真が増えます。 案内は、ホームページの依頼の受付の欄と、自動の受付の返信に載せます。
区分の一覧は、単価表と同じ区切りにします。 単価表が「3メートルまで」「3から5メートル」「5から7メートル」「7メートルを超えるもの」で分かれていれば、AIにもその4つの中から選ばせます。 区切りがずれると、スクリプトで単価を引けません。
データの取得方法を決める
受付のメールから、写真と本文を取ります。 スクリプトはラベルの無いスレッドを探し、メッセージごとに添付とインライン画像を Blob として取り出します。差出人のアドレスと届いた日時は、依頼の記録のシートに書き、写真は依頼ごとのフォルダに保存します。 ファイル名は、依頼の番号と届いた順の番号にします。
Gemini API へは、依頼ごとに1回、全部の写真をまとめて渡します。 公式の案内では、1つのリクエストに入れられる画像の数は多く、インラインで送るときは、文の指示と画像を合わせたリクエスト全体が20MBまでです。十数枚の写真をそのまま送ると超えることがあるので、前処理で縮めます。
単価表は、スクリプトがシートから読みます。 AIの返した区分を単価表の行と突き合わせ、単価と数量を掛けた金額は、スクリプトが見積の一覧の欄に書きます。 AIには単価表の金額を渡しません。
有料の利用枠で使い、store を false にします。 Gemini API の規約では、有料のサービスではプロンプトと応答が製品の改善に使われないとされています。Interactions API は既定でやり取りを保存し(有料の枠で55日)、保存しないときは store=false を付けると案内されています。お客様の家の写真を、保存させないで使います。
AIへ渡す前に整形する
- 形式の確認 … JPEG、PNG、HEIC などの写真だけを残し、それ以外の添付は外します
- 向きの補正 … スマートフォンの写真の向きの情報で回転しているだけのものは、画素を回転させます。向きがずれると、返った枠がずれます
- 縮小 … 長い辺を1,600ピクセル程度に縮めます。リクエスト全体が20MBに収まるようにします
- 重複の除外 … 同じ写真が二度付いているものは1枚にします
- 枚数の確認 … 1枚だけ、または全体の写真が無いと分かる依頼には、写真の追加のお願いを先に返す印を付けます
- 写り込みの確認 … 人の顔、表札、車のナンバーが大きく写っている写真には、担当が見るときの注意の印を付けます
- 区分の一覧の付け足し … 単価表のシートから、高さ・長さ・広さ・処分の量の区分を読み、指示に入れます
3番目を軽く見ないでください。 縮めすぎると、細い枝や生垣の先が見えなくなります。全体の写真は小さめに、木ごとの写真は大きめに残すと、費用と見分けの両方に効きます。
AIに処理させる
させるのは、写真に写っている木と範囲を拾い、それぞれを区分に当てはめ、比べた目安と、足りない写真と、現地で確かめる事項を返すことだけです。
| 返すもの | 中身 | 判断できないときの扱い |
|---|---|---|
| 木ごとの候補 | どの写真のどこか(枠)、同じ木が写っている写真の番号、高木・中木・低木の高さの区分、比べた目安(2階の軒、塀、人など) | 根元か先が写っていなければ height_unknown |
| 作業の候補 | 剪定、強い剪定、伐採、抜根の中から。お客様の依頼に無いものは印を付ける | 枯れているか分からなければ needs_site_check |
| 生垣 | 長さの区分と高さの区分、片面か両面か | 端が写っていなければ length_unknown |
| 除草の範囲 | 広さの区分と、比べた目安(駐車場1台分、ブロック塀の長さなど) | 範囲の端が見えなければ area_unknown |
| 処分の量 | 枝と草の量の区分 | 作業の候補が決まらなければ書かない |
| 足りない写真 | 裏庭、木の根元、全体の写真など | - |
| 現地で確かめる事項 | 電線の近く、隣地へのはみ出し、道の幅、建物との近さ、枯れや傾き | 写っていなくても、写真の範囲では分からないと返す |
右端の列の考え方は、区分を決められないものを、決めずに担当に返すことです。 根元が写っていない木の高さを「たぶん中木」と埋めると、見積の数字がそのまま出ていってしまいます。 分からない区分は分からないと返させ、足りない写真のお願いか、現地を見に行く理由にします。
| させないこと | 理由 |
|---|---|
| 高さや長さ、広さのメートルの値 | 写真から正確には測れない。区分と比べた目安までにする |
| 金額の計算 | 単価は会社の決まり。スクリプトが単価表を引く |
| 倒木の危険や、木の病気の判断 | 現地で幹と根元を見て、職人が判断する |
| 電線の近くで作業できるかの判断 | 現地で確かめ、必要なら電力会社や通信会社に相談する |
| 隣地との境界の判断 | 境界はお客様と隣の家の間の話。写真からは決めない |
| 樹種の断定 | 単価には使わない。参考として候補を書くだけにする |
| 写っている人や家についての記述 | 見積に要らない |
1行目がいちばん起きやすい失敗です。 「この木の高さは何メートルですか」と聞くと、AIはもっともらしい数字を返します。写真の奥行きや撮った角度で、同じ木でも高さは大きく違って見えます。 返させるのは「2階の軒より上で、屋根の棟より下」という比べた事実と、そこから選んだ区分です。
指示内容を固定する
あなたは造園会社の見積の担当を手伝う係です。
お客様が送ってきた庭の写真が {枚数} 枚あります。写真には 1 から順に番号を付けています。
お客様の依頼の本文は次のとおりです。
{依頼の本文}
【区分の一覧】
高さ:高木の区分 {3mまで/3〜5m/5〜7m/7mを超える} 中木・低木 {…}
生垣の長さ:{5mまで/5〜10m/10〜20m/20mを超える}
除草の広さ:{10㎡まで/10〜30㎡/30〜60㎡/60㎡を超える}
処分の量:{少ない/中くらい/多い}
作業の種類:剪定、強い剪定(切り詰め)、伐採、抜根、生垣の刈り込み、除草
【やること】
1. 写真に写っている木を1本ずつ拾い、同じ木が写っている写真の番号をまとめる。
2. 木ごとに、高さの区分を上の一覧から1つ選ぶ。
選んだ根拠として、比べた目安(2階の軒、塀、物置、人など)と、
木の先と根元がどの写真に写っているかを書く。
3. 木ごとに、作業の候補を上の一覧から選ぶ。
お客様の依頼の本文に無い作業を挙げるときは requested を false にする。
4. 生垣の長さと高さの区分、除草の範囲の広さの区分、処分の量の区分を選ぶ。
広さは、駐車場1台分やブロック塀の長さなど、比べた目安を書く。
5. 足りない写真を挙げる。
6. 電線の近く、隣地へのはみ出し、道の幅、建物や塀との近さ、
枯れや傾きのように、現地で確かめるべき事項を挙げる。
【厳守事項】
- 高さ・長さ・広さをメートルや平方メートルの数字で書かないでください。
区分を選び、比べた目安を書いてください。
- 木の根元か先が写っていないときは、高さを height_unknown にしてください。
推測で区分を選ばないでください。
- 区分の境に近いときは near_boundary を true にしてください。
- 金額、単価、作業の日数を書かないでください。
- 倒木の危険、病気、作業できるかどうかの結論を書かないでください。
気になるものは現地で確かめる事項に入れてください。
- 電線が写っていなくても、写真の範囲で分からないときは
「電線の有無は写真の範囲では分からない」と現地で確かめる事項に入れてください。
- 写っている人、家、車、表札については何も書かないでください。
「根元か先が写っていないときは height_unknown」を明記しないと、区分が埋まってしまいます。 埋まった区分は、写真を開かなければ根拠のある区分と見分けがつきません。
電線の一文を別に書いているのは、写っていないことを「無い」と読ませないためです。 写真の上の端が木の途中で切れていれば、その上に電線があるかは分かりません。分からないという事実を、毎回返させます。
出力形式を固定する
依頼ごとに、次の形の JSON で受け取ります。 height_class、work、length_class、area_class、volume_class、check_item は enum で、区分の一覧と同じ文字列に絞ります。
{
"request_id": "R-2026-1103",
"trees": [
{ "tree_no": 1,
"photos": [2, 5],
"box_2d": { "photo": 2, "box": [120, 300, 980, 520] },
"height_class": "tall_3_5 | tall_5_7 | tall_over_7 | tall_under_3 | mid | low | height_unknown",
"near_boundary": false,
"compared_with": "2階の軒より上、屋根の棟より下",
"work": ["prune", "hard_prune", "fell", "stump_removal"],
"requested": true,
"species_guess": "",
"note": "" }
],
"hedge": { "length_class": "10_20", "height_class": "under_2", "sides": "one | both | unknown" },
"weeding": { "area_class": "30_60", "compared_with": "駐車場2台分ほど" },
"disposal": { "volume_class": "medium" },
"missing_photos": ["裏庭の全体", "1番の木の根元"],
"site_checks": [
{ "check_item": "power_line | neighbor_overhang | access_road | near_building | dead_or_leaning", "detail": "" }
]
}
1つ目の理由は、区分の文字列で単価表を機械的に引けることです。 height_class が tall_5_7 なら、単価表の「高木 5〜7メートル」の行を引きます。AIの返した文字列が単価表に無ければ、スクリプトはその行に金額を入れず、担当に回します。
2つ目は、compared_with で見立ての根拠を残せることです。 担当が区分を直したとき、「2階の軒より上」を見て直したのか、別の写真を見て直したのかを、後から見直せます。第3章の(b)の、見立てが人によって違う理由を確かめる材料になります。
3つ目は、missing_photos と site_checks を明細と分けて持てることです。 返事の最初に写真のお願いや、現地を見に行く理由を書けます。
見積の一覧の下地の行は、次の形です。
| 依頼 | 明細 | 区分 | 数量 | 単価 | 金額 | 確認 |
|---|---|---|---|---|---|---|
| R-2026-1103 | 1番の木 剪定 | 高木 5〜7m | 1本 | (単価表から) | (スクリプト) | 根元の写真なし |
| R-2026-1103 | 生垣の刈り込み 片面 | 10〜20m | 1式 | (単価表から) | (スクリプト) | - |
| R-2026-1103 | 除草 | 30〜60㎡ | 1式 | (単価表から) | (スクリプト) | 電線の有無は現地で |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Gmail | Google Apps Script の Gmail の操作 | ラベルの無いスレッドを探し、添付・インライン画像・本文・差出人・日時を取る。処理後にラベルを付ける |
| Google ドライブ | Google Apps Script のドライブの操作 | 依頼ごとのフォルダに写真を保存する |
| Gemini API | URL の取得(/v1beta/interactions、store=false) | 木ごとの候補、量の区分、足りない写真、現地で確かめる事項 |
| 単価表 | スプレッドシートの読み取り | 区分の一覧と単価を読む。書き込まない |
| 見積の一覧 | スプレッドシートへの書き込み | 明細の下地の行。担当の確認の欄と最終の金額の欄には書かない |
お客様へのメールは、スクリプトから送りません。 概算を返すか、写真のお願いをするか、現地を見に行く日を伝えるかは、担当が決めて自分で送ります。下地の金額がそのままお客様に届く経路を作らないためです。 単価表も、共用のアカウントには閲覧だけを許します。
人が確認する
- 担当が区分を直す … 下地の行と写真を並べ、木ごとに区分を確かめます。
height_unknownとnear_boundaryの付いた木を先に見ます - 担当が作業の候補を確かめる …
requestedがfalseの作業は、お客様の依頼に無いものです。勝手に明細に入れず、提案として返事に書くかを決めます - 担当が現地を見に行くかを決める …
site_checksに電線、隣地へのはみ出し、枯れや傾きがあれば、写真の概算では返さず、現地を見に行きます - 迷うものは社長に回す … 高木の伐採、重機の要りそうな抜根、管理会社の物件のまとめての依頼は、社長が見ます
- 担当がお客様に返す … 概算、足りない写真のお願い、現地を見に行く日の候補を、自分の言葉で送ります
3番目の決まりは、AIの結果より先に会社で決めておきます。 「電線の近くの木は必ず現地を見る」「高木の伐採は必ず現地を見る」のような決まりがあれば、担当ごとに判断が分かれません。 第3章の(d)の漏れも、この決まりで防ぎます。
目標は、150件をならして1件10分です。 担当が直した区分が1件で半分を超えるなら、撮り方の案内か区分の一覧が崩れています。
例外に対処する
| 起きること | 対応 |
|---|---|
| 写真が1枚だけ、または全体の写真が無い | 下地を作らず、写真のお願いの印を付けて担当に回す |
| 写真が大きく、リクエストが20MBを超える | 縮小をやり直す。それでも超えるときは、全体と木ごとの写真を分けて2回に分ける |
| 写真が後から分けて届く | 同じスレッドの依頼にまとめ、全部の写真で見立てを出し直す。前の下地の行は残し、新しい行に印を付ける |
| 庭ではない写真(室内、家の外壁だけ)が混ざる | その写真を見立てに使わず、missing_photos に必要な写真を返す |
| 夜や逆光で木の形が見えない | height_unknown が多くなる。昼の写真のお願いを返す |
| 管理会社から物件ごとに写真がまとめて届く | 物件ごとに依頼の番号を分けてから渡す |
| JSON の区分が単価表に無い | その行に金額を入れず、担当に回す |
| Gemini API が応答しない | ラベルを付けずに残し、次の15分で処理し直す |
上から3行目までが大半を占め、どれも写真の撮り方と届き方の問題です。
記録を残す
- 依頼ごとの写真と、Gemini API が返した JSON の全文
- 指示に入れた区分の一覧(そのときの単価表の区切り)
- 担当が直した区分と、直した理由(別の写真を見た、現地で見た、など)
- 現地を見に行ったかどうかと、現地で分かった高さの区分
- お客様に概算を返した日時と、受注したかどうか
- 依頼が届いてから最初の返事までの時間
4つ目の行が、見立ての答え合わせになります。 写真の下地で tall_3_5 だった木が、現地で tall_5_7 だったなら、どの写真のどの目安で見誤ったかを、compared_with と並べて見直せます。 これを月に一度まとめると、撮り方の案内のどこを直すかが分かります。
04実装レベルの3段階
最小構成では件数がさばけません。 月150件の写真を手で渡す時間はありません。確かめるための段階です。 半自動化で、1件24分が16分程度になります。 写真の整理と見立ては自動になりますが、区分を単価表に当てはめて明細を書く作業が残ります。本格構成で10分になり、この段階が本記事の想定です。 差が大きいのは、区分と単価表の行の対応がスクリプトに移り、書き写しが無くなるからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、担当がよく直す区分と、height_unknown の多い写真の撮り方が分かります。そこを直してから本格構成に進むほうが、金額の入った下地を直す手間が減ります。
05工数削減シミュレーション
導入後 150件 × 10分 ÷ 60 = 25 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 個人宅の庭の手入れ(剪定・伐採・除草・生垣の刈り込み)を請け負う、従業員10名から30名ほどの造園会社や植木屋。見積の依頼が月に100件を超え、写真を見て概算を出せるのが社長かベテランの職人だけになっている場合。写真をもらっても見方が人によって違い、現地を見に行くかどうかの判断がばらばらな場合。不動産の管理会社から空き家や賃貸物件の庭の手入れをまとめて頼まれる場合。担当が Google Workspace を使っている場合。
- 公共の造園工事や大きな造成工事のように、図面と数量の拾い出しで見積を作る場合。見積の依頼が月に数件で、毎回必ず現地を見てから出している場合。なお、木の高さや幹の太さの測定、倒木の危険の判断、電線に近い木の作業の可否、隣地との境界、処分の方法の判断と最終の見積の金額は、この構成では代替できません。
07最小構成で試す方法
- 先月の見積の依頼から、写真付きのものを10件選ぶ(うち3件は、現地を見て区分が変わったと分かっているもの)
- 単価表の区分の一覧を、指示の文に書き写す
- Gemini API の有料の利用枠で、依頼ごとに全部の写真を渡す
- 「写真の木ごとに、高さの区分をこの一覧から選び、何と比べたかを書いてください。根元か先が写っていなければ分からないとしてください。メートルの数字と金額は書かないでください」と指示する
- 出てきた区分を、当時の見積と、現地で確かめた区分と突き合わせる
10件は必ずやってください。 スクリプトを組む前に、「いまお客様から届いている写真で、区分が選べるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
当時の見積と同じ区分が多く、現地で変わった木に near_boundary か height_unknown が付いた | スクリプトと単価表の照合に進む |
| メートルの数字や金額を書いた | 指示の書き方で直る。構成は有効 |
ほとんどの木が height_unknown になる | 写真の撮り方の案内が先。 AIの問題ではない |
3行目が出ることは珍しくありません。 失敗ではなく、社長とベテランが写真の足りない分を経験で埋めていたことが分かったということです。 撮り方の案内を作って1か月写真を集め、もう一度試してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 写真から高さのメートルの値を書く | 指示で禁じる。 区分と比べた目安だけを返させる |
| 根元の写っていない木の区分を埋める | height_unknown を指示に明記する |
| 区分の言葉が単価表と合わない | 区分の一覧を単価表のシートから毎回読む |
| 金額を書く | 単価表をAIに渡さない。金額はスクリプトが出す |
| 写っていない電線を「無い」と読む | 「写真の範囲では分からない」を毎回返させる |
| お客様の依頼に無い作業が明細に入る | requested で分け、担当が提案として扱うか決める |
| 写真が20MBを超えて止まる | 縮小をやり直し、2回に分ける |
| スマートフォンのメールの写真を取りこぼす | インライン画像を含める設定にする |
上の2行が、この構成の失敗のほとんどです。 どちらも、写真で分からないことを数字や区分で埋める失敗です。分からないものを分からないと返させ、担当がそれを写真のお願いや現地調査に変えるかどうかで、見積の数字が守られるかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客様の家の庭の写真、メールアドレス、依頼の本文に書かれた住所や電話番号、見積の明細です。写真には、家の外観、表札、車のナンバー、家族や近所の人が写り込むことがあります。
- 有料の利用枠で、保存させない … 規約では、有料のサービスではプロンプトと応答が製品の改善に使われないとされています。無料の枠では人が入出力を読むことがあるとされ、個人の情報を無料の枠に送らないよう案内されています。Interactions API の
storeをfalseにします - 住所と電話番号を指示に入れない … 見立てに要るのは写真と依頼の内容だけです。市区町村までを指示に入れ、番地と電話番号は依頼の記録のシートにだけ残します
- 写っている人や家を書かせない … 指示の文で禁じます。写り込みの多い写真は、担当が見るときの注意の印を付けます
- 概算の金額を自動で送らない … 下地の金額は担当が確かめてから返します。写真の見誤りがそのまま契約の話になることを避けます
- 写真の保存の期間を決める … 受注しなかった依頼の写真をいつまで持つかを決め、期間が過ぎたらフォルダごと消します
- 安全の判断を AI に寄せない … 電線の近くの作業、倒木の危険、高所の作業の段取りは、これまでどおり現地を見た担当と職人が決めます
誤りが起きた場合のリスクは、写真の見誤りで安すぎる概算を返すことと、電線や枯れ木を見落として作業の日に段取りが崩れることの2つです。 前者は区分を推測で埋めると起き、後者は写っていないことを「無い」と読ませると起きます。どちらも、分からないものを分からないと返させる設計で防げます。
10まず何から始めるか
1週目:単価表の区分を決める
社長とベテランで、高木・中木・低木の高さの区切り、生垣の長さの区切り、除草の広さの区切り、処分の量の区切りを決め、単価表のシートに区分の一覧として書きます。 「必ず現地を見るもの」の決まりも、ここで決めます。
2週目:10件で試す
先月の依頼から10件を選び、写真を Gemini API に渡して区分を出させます。現地で区分が変わった木に near_boundary や height_unknown が付くか、メートルの数字を書いていないかを最優先で見ます。
3週目:写真の撮り方の案内を作る
「全体を1枚」「木ごとに根元から先まで」「高さの分かる物を一緒に」の案内を、ホームページの受付の欄と自動の受付の返信に載せます。10件の試しで height_unknown になった写真を見ながら書きます。
4週目:受付のメールから一覧までをつなぐ
時間主導型のトリガーで受付のメールを見て、写真を保存し、呼び出して、区分の一覧を書き出すところまで作ります。この時点では単価表を引かず、区分の一覧だけを担当が見ます。
2か月目: 単価表の照合と明細の下地を足します。担当が直した区分の理由を毎週数えます。3か月目以降: 現地で分かった区分との答え合わせを足し、1件24分が何分になったかを実測します。直した理由が撮り方の案内と区分の一覧に反映され、社長とベテランの手を待たずにその日のうちに最初の返事が出せるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
対応する画像の形式が PNG、JPEG、WEBP、HEIC、HEIF であること。1つのリクエストに複数の画像を入れられること。インラインで送るときはリクエスト全体が20MBまでであること。枠が [ymin, xmin, ymax, xmax] の順で0〜1000に正規化されること。画像のトークンの換算(384ピクセル以下は258トークン、それより大きいものは768×768の区画ごとに258トークン) | Gemini API: Image understanding | 2026-10-26 |
構造化出力が /v1beta/interactions に response_format で mime_type を application/json にし、schema にスキーマを入れて送る形であること。enum が使えること。値はアプリ側で検証するよう書かれていること | Gemini API: Structured output | 2026-10-26 |
Interactions API が既定でやり取りを保存し、有料の枠で55日、無料の枠で1日保持すること。store=false で保存しないようにできること | Gemini API: Interactions | 2026-10-26 |
| 有料のサービスではプロンプトと応答が製品の改善に使われないこと。無料のサービスでは人が入出力を読むことがあり、個人の情報を送らないよう求めていること。18歳以上であることが利用の条件であること | Gemini API Additional Terms of Service | 2026-10-26 |
| 時間主導型のトリガーが毎分から月1回までの間隔で動くこと。インストール型のトリガーは作った人のアカウントで動くこと | Apps Script: Installable triggers | 2026-10-26 |
| Gmail のメッセージから添付を Blob の配列として取れること。インライン画像を含めるかを選べること。差出人と日時、書式の無い本文を取れること | Apps Script: Class GmailMessage | 2026-10-26 |
電線の近くの作業、高所の作業、伐採した木の処分の方法は、最新の法令と、電力会社・自治体の案内、自社の安全の決まりに沿って行ってください。 本記事は公開の資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1790)についてのご相談はこちらから。
