議事録や要件からGoogle Spreadsheet見積書を自動生成。藍口さんの統一テンプレートで作成。
議事録・要件・口頭メモから、Google Spreadsheet上に見積書を自動生成します。 藍口康希さんの統一テンプレート(12件の実績データ)を基に、同一フォーマット・デザイン・金額感で作成します。
/estimate <内容>
内容の例:
| 列 | ヘッダー | 幅(px) | 配置 | 説明 |
|---|---|---|---|---|
| A | 大項目 | 100 | LEFT | セクション名(必須機能/マスタ管理画面/ユーザー側画面/その他/任意機能) |
| B | 中項目 | 100 | LEFT | 機能グループ名 + 小計金額 |
| C |
| 小項目 |
| 324 |
| LEFT |
| 個別機能名 |
| D | 内容 | 386 | LEFT | 機能の説明 |
| E | マスタ | 81 | CENTER | TRUE/FALSE(管理画面で使う機能か) |
| F | ユーザー | 81 | CENTER | TRUE/FALSE(ユーザー側で使う機能か)※案件により「エージェント」「お客様」「会社」等に変更 |
| G | 御見積(税抜) | 113 | CENTER | 生の数値(表示は¥#,##0フォーマット)。中項目行はSUM数式、小項目行は数値 |
| H | お見積もり備考 | 380 | LEFT | 補足説明・注意事項 |
| I | 減少可能項目 | 81 | CENTER | TRUE/FALSE(削減交渉可能か) |
※ 3つ以上のアクターがある場合(例: マスタ/会社/社員)は10列に拡張
| 設定 | 値 |
|---|---|
| 固定行 | 1(ヘッダー行) |
| 固定列 | 3(A〜C列) |
| グリッド線 | 表示(デフォルト) |
| フィルター | 全データ範囲に設定 |
| フォント | デフォルト(Arial)size 10 |
ヘッダー行(Row 1):
{
"backgroundColor": {"red": 0.40, "green": 0.40, "blue": 0.40},
"textFormat": {"bold": true, "fontSize": 10, "foregroundColor": {"red": 1, "green": 1, "blue": 1}},
"horizontalAlignment": "CENTER"
}
大項目行(必須機能/マスタ管理画面/ユーザー側画面/その他/任意機能):
{
"backgroundColor": {"red": 0.29, "green": 0.53, "blue": 0.91},
"textFormat": {"bold": true, "foregroundColor": {"red": 1, "green": 1, "blue": 1}}
}
A列(大項目列)全行: 大項目行と同じ青背景
{"backgroundColor": {"red": 0.29, "green": 0.53, "blue": 0.91}}
B列(中項目列)全行: 薄青背景
{"backgroundColor": {"red": 0.79, "green": 0.85, "blue": 0.97}}
中項目行(B〜I列): 薄青背景
{"backgroundColor": {"red": 0.79, "green": 0.85, "blue": 0.97}}
小項目行(C〜I列): 白背景(デフォルト)
{"backgroundColor": {"red": 1, "green": 1, "blue": 1}}
合計行: 薄青背景(中項目行と同じ)
[大項目行] A列に値あり。セクション名のみ。B〜I列は空。全行青背景。
[中項目行] B列に値あり。A,C列は空。G列に小計金額。B〜I列薄青背景。
[小項目行] C列に値あり。A,B列は空。D〜I列にデータ。C〜I列白背景。
[合計行] B列="合計"。G列に総額。
必須機能
├── 基本設計(常に最初)
│ ├── アプリケーション設計
│ ├── 管理画面設計(サーバー設計)
│ └── データベース設計
├── 共通機能
│ ├── ログイン制御
│ ├── パスワード再設定
│ ├── マスター管理画面の基幹機能
│ └── ユーザー画面の基幹機能
├── [案件固有の機能群]
│ └── ...
マスタ管理画面
├── ダッシュボード画面
├── ユーザー管理(一覧/詳細/登録編集削除)
├── [案件固有のエンティティ管理]
│ └── ...
ユーザー側画面
├── マイページ
├── [案件固有のユーザー機能]
│ └── ...
その他
├── インフラ構築
│ ├── DBサーバ初期構築・設定
│ ├── DNS設定
│ ├── 本番環境構築・設定
│ ├── ステージング環境構築・設定
│ └── 開発環境構築・設定
├── デザイン(UI・UX)
├── QA/デバッグ
├── 進行管理/ディレクション
└── 合計
任意機能(オプション、ある場合のみ)
├── [追加オプション機能]
│ └── ...
| 項目 | 金額レンジ | 実績 |
|---|---|---|
| アプリケーション設計 | ¥40,000〜¥150,000 | BUTAI:¥150K, エージェント:¥40K, クラウド請求書:¥100K |
| 管理画面設計/サーバー設計 | ¥40,000〜¥150,000 | BUTAI:¥150K, エージェント:¥40K, 履歴書:¥100K |
| データベース設計 | ¥40,000〜¥200,000 | BUTAI:¥200K, エージェント:¥40K, クローリング:¥80K |
| 基本設計 小計 | ¥120,000〜¥500,000 | 規模に応じて変動 |
| 項目 | 金額 | マスタ | ユーザー |
|---|---|---|---|
| ログイン制御 | ¥100,000〜¥200,000 | TRUE | TRUE |
| パスワード再設定 | ¥50,000〜¥100,000 | TRUE | TRUE |
| マスター管理画面の基幹機能 | ¥100,000 | TRUE | FALSE |
| ユーザー画面の基幹機能 | ¥100,000 | FALSE | TRUE |
| 項目 | 金額 | 備考 |
|---|---|---|
| ダッシュボード画面 | ¥100,000 | 減少可能項目 |
| 一覧画面(絞り込み付き) | ¥100,000 | |
| 詳細画面 | ¥80,000〜¥100,000 | |
| 登録・編集・削除 | ¥100,000 | |
| エンティティ管理 小計 | ¥280,000〜¥450,000 | 1エンティティあたり |
| 追加機能(視聴率/進捗等) | ¥100,000〜¥150,000 | 減少可能の場合あり |
| インポート機能 | ¥0〜¥100,000 | CSV一括取込 |
| 項目 | 金額 | 備考 |
|---|---|---|
| マイページ | ¥100,000 | 基本情報変更 |
| 閲覧履歴 | ¥80,000 | 減少可能 |
| お気に入り | ¥80,000 | 減少可能 |
| メイン機能画面(動画閲覧/一覧等) | ¥200,000 | 案件の中核機能 |
| 項目 | 金額レンジ | 備考 |
|---|---|---|
| DBサーバ初期構築・設定 | ¥100,000〜¥150,000 | |
| DNS設定 | ¥50,000 | |
| 本番環境構築・設定 | ¥100,000〜¥150,000 | |
| ステージング環境構築・設定 | ¥0〜¥100,000 | 減少可能 |
| 開発環境構築・設定 | ¥100,000 | |
| インフラ構築 小計 | ¥350,000〜¥450,000 | |
| デザイン(UI・UX) | ¥100,000〜¥600,000 | 「最終ご発注内容により変動いたします」 |
| QA/デバッグ | ¥100,000〜¥300,000 | 「最終ご発注内容により変動いたします」 |
| 進行管理/ディレクション | ¥0〜¥549,000 | 友人/パートナー割引で¥0の場合あり |
| 項目 | 金額 | 備考 |
|---|---|---|
| チャット/コミュニケーション機能 | ¥300,000 | |
| お知らせ(一覧+詳細) | ¥160,000 | |
| 操作ログの保存 | ¥160,000 | ログイン管理+ユーザー側管理 |
| セキュリティ向上(暗号化保存) | ¥100,000〜¥300,000 | |
| テストコードの作成 | 金額未定 | 「機能別の30%が目安」 |
| # | 案件名 | 合計 | スプレッドシートID |
|---|---|---|---|
| 1 | BUTAI様動画閲覧WEBアプリ | ¥4,209,000 | 1aSbmcq8PQRVMImzUMuLsxbnH9vZT7FpQfzbmIWHvO_A |
| 2 | エージェント管理WEBアプリ | - | 16MHDhQM37i0yVcPUPPltBIA84Bi8fgsRHBO0PIM_KPA |
| 3 | クラウド請求書管理システム | - | 1sYSIR5DFavP8Il8gEBrlW0CLJcNkzDU54Dw1O4fX4DY |
| 4 | 履歴書作成WEBアプリ | ¥2,120,000 | 1topd2oljK3B3j42ZEvbfT-wW5GIV4yjpsYzCxsg6mHY |
| 5 | ヤガミ様AED消耗品管理システム | - | 1ZI0sCFjD9_ccp9Xt9ir3sMFYfN1nb3t1O6v7zMlz3Qg |
| 6 | 大澤さんクローリングアプリ | ¥1,440,000 | 11CRlt9WCSaz_X3TV85UiLumRWzmaLI1_VMw3n_BQ20w |
| 7 | インフルエンサー×ホテルマッチング | ¥2,160,000 | 10YE0fpNO1CPsMI8yA2kGTBSj29XfDECsGNuPp2sSsuQ |
| 8 | AIエージェントアプリ(フェイズ1) | - | 1D64lgo17x-QWLcIkj-S6xUxJ0kNOca-k109WvSYVfC0 |
| 9 | 営業アシスタントAI | ¥1,680,000 | 1_GP0t_ef2ajbQf_kkz_gON_KsaQ4LL4eqQFyc5ksIpg |
| 10 | Instagram AI投稿サービス | - | 1kFwwm9kyEvnHsG4QvzNAMTlFc3HUJbFOyyoFd_awbZA |
| 11 | キャリカク様FC管理システム | - | 1a5Cfq-GlSA_kevIgMvZnltTbs5v5Im-EeOZfDcN57vY |
| 12 | 谷水様クリニック管理システム | - | 1GoJbdos3VKgiSNKqPIY-xDPYFGEkBAqcyDl9QQqyzOc |
ユーザーからの入力を解析し以下を特定:
2-1. スプレッドシート作成
gog sheets create "(見積)<案件名>"
2-2. ヘッダー書き込み(--values-json 必須)
gog sheets update <ID> "シート1!A1:I1" --values-json '[
["大項目","中項目","小項目","内容","マスタ","ユーザー","御見積\n(税抜)","お見積もり備考","減少可能項目"]
]'
2-3. データ書き込み(セクション単位で --values-json)
重要: G列(御見積)は生の数値で書く。¥文字列は使わない。
gog sheets update <ID> "シート1!A2:I<N>" --values-json '[
["必須機能"],
["","基本設計","","","","",""],
["","","アプリケーション設計","react.jsにて実装予定です","FALSE","FALSE",100000,"","FALSE"],
["","","管理画面設計(サーバー設計)","","FALSE","FALSE",100000,"","FALSE"],
["","","データベース設計","","FALSE","FALSE",100000,"","FALSE"],
...
]'
2-4. SUM数式の書き込み(--input USER_ENTERED 必須)
中項目行のG列にはSUM数式を設定する。--input USER_ENTERED フラグがないと数式が文字列として保存されるので注意。
# 中項目行: 配下の小項目範囲をSUMする
# 例: 基本設計(Row 3)の配下が Row 4〜6 の場合
gog sheets update <ID> "シート1!G3" --values-json '[["=SUM(G4:G6)"]]' --input USER_ENTERED
# 全中項目行に同様にSUM数式を設定
gog sheets update <ID> "シート1!G8" --values-json '[["=SUM(G9:G12)"]]' --input USER_ENTERED
# ... 以下、全中項目行に繰り返し
SUM数式パターン:
| 行の種類 | G列の値 | 例 |
|---|---|---|
| 小項目行 | 生の数値 | 100000, 150000, 200000 |
| 中項目行 | =SUM(G<first_child>:G<last_child>) | =SUM(G4:G6) |
| ディレクション行 | =SUM(全中項目セル)*0.15(任意) | =SUM(G3,G8,G15)*0.15 |
| 合計行 | =SUM(G<中項目1>,G<中項目2>,...) | =SUM(G3,G8,G15,G20,G25) |
注意:
*0.15は案件により変動。友人/パートナー割引で¥0の場合もあるgog sheets update する(バッチ書き込みだと数式が正しく認識されない場合がある)3-1. gog sheets format でセル書式
# ヘッダー行
gog sheets format <ID> "シート1!A1:I1" \
--format-json '{"backgroundColor":{"red":0.40,"green":0.40,"blue":0.40},"textFormat":{"bold":true,"fontSize":10,"foregroundColor":{"red":1,"green":1,"blue":1}},"horizontalAlignment":"CENTER"}' \
--format-fields 'backgroundColor,textFormat,horizontalAlignment'
# 大項目行(例: Row 2)
gog sheets format <ID> "シート1!A2:I2" \
--format-json '{"backgroundColor":{"red":0.29,"green":0.53,"blue":0.91},"textFormat":{"bold":true,"foregroundColor":{"red":1,"green":1,"blue":1}}}' \
--format-fields 'backgroundColor,textFormat'
# A列全体(青)
gog sheets format <ID> "シート1!A1:A<LAST>" \
--format-json '{"backgroundColor":{"red":0.29,"green":0.53,"blue":0.91}}' \
--format-fields 'backgroundColor'
# B列全体(薄青)
gog sheets format <ID> "シート1!B1:B<LAST>" \
--format-json '{"backgroundColor":{"red":0.79,"green":0.85,"blue":0.97}}' \
--format-fields 'backgroundColor'
# 中項目行(B〜I薄青)
gog sheets format <ID> "シート1!B<ROW>:I<ROW>" \
--format-json '{"backgroundColor":{"red":0.79,"green":0.85,"blue":0.97}}' \
--format-fields 'backgroundColor'
# E,F,G,I列: CENTER揃え
gog sheets format <ID> "シート1!E:E" \
--format-json '{"horizontalAlignment":"CENTER"}' \
--format-fields 'horizontalAlignment'
# F, G, I列も同様
3-2. Python (Sheets API) でシート設定
import json, subprocess, os
from google.oauth2.credentials import Credentials
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
# Auth
creds_path = os.path.expanduser("~/Library/Application Support/gogcli/credentials.json")
with open(creds_path) as f:
creds_data = json.load(f)
result = subprocess.run(["security", "find-generic-password", "-l", "gogcli", "-w"],
capture_output=True, text=True)
token_data = json.loads(result.stdout.strip())
creds = Credentials(token=None, refresh_token=token_data['refresh_token'],
client_id=creds_data['client_id'], client_secret=creds_data['client_secret'],
token_uri="https://oauth2.googleapis.com/token")
creds.refresh(Request())
service = build('sheets', 'v4', credentials=creds)
SHEET_ID = "<spreadsheetId>"
requests = [
# Freeze row 1, columns A-C
{"updateSheetProperties": {
"properties": {"sheetId": 0, "gridProperties": {"frozenRowCount": 1, "frozenColumnCount": 3}},
"fields": "gridProperties.frozenRowCount,gridProperties.frozenColumnCount"
}},
# Column widths: A=100, B=100, C=324, D=386, E=81, F=81, G=113, H=380, I=81
{"updateDimensionProperties": {
"range": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 0, "endIndex": 1},
"properties": {"pixelSize": 100}, "fields": "pixelSize"
}},
{"updateDimensionProperties": {
"range": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 1, "endIndex": 2},
"properties": {"pixelSize": 100}, "fields": "pixelSize"
}},
{"updateDimensionProperties": {
"range": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 2, "endIndex": 3},
"properties": {"pixelSize": 324}, "fields": "pixelSize"
}},
{"updateDimensionProperties": {
"range": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 3, "endIndex": 4},
"properties": {"pixelSize": 386}, "fields": "pixelSize"
}},
{"updateDimensionProperties": {
"range": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 4, "endIndex": 5},
"properties": {"pixelSize": 81}, "fields": "pixelSize"
}},
{"updateDimensionProperties": {
"range": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 5, "endIndex": 6},
"properties": {"pixelSize": 81}, "fields": "pixelSize"
}},
{"updateDimensionProperties": {
"range": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 6, "endIndex": 7},
"properties": {"pixelSize": 113}, "fields": "pixelSize"
}},
{"updateDimensionProperties": {
"range": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 7, "endIndex": 8},
"properties": {"pixelSize": 380}, "fields": "pixelSize"
}},
{"updateDimensionProperties": {
"range": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 8, "endIndex": 9},
"properties": {"pixelSize": 81}, "fields": "pixelSize"
}},
# Basic filter
{"setBasicFilter": {
"filter": {"range": {"sheetId": 0, "startRowIndex": 0, "endRowIndex": <LAST_ROW>,
"startColumnIndex": 0, "endColumnIndex": 9}}
}},
# G列(御見積)に ¥#,##0 通貨フォーマットを適用
{"repeatCell": {
"range": {"sheetId": 0, "startRowIndex": 1, "endRowIndex": <LAST_ROW>,
"startColumnIndex": 6, "endColumnIndex": 7},
"cell": {"userEnteredFormat": {"numberFormat": {"type": "NUMBER", "pattern": "¥#,##0"}}},
"fields": "userEnteredFormat.numberFormat"
}}
]
service.spreadsheets().batchUpdate(spreadsheetId=SHEET_ID, body={"requests": requests}).execute()
生成されたスプレッドシートのURLをユーザーに提示。
100000)で書き込み、表示は ¥#,##0 フォーマットで制御する。¥100,000 のような文字列はSUM数式が壊れるので絶対に使わない=SUM(配下の小項目範囲) で自動集計=SUM(全中項目セルを個別参照) で自動集計(範囲参照は二重カウントになるので不可)--input USER_ENTERED フラグが必須¥#,##0 は Python Sheets API の repeatCell で G列全体に適用--values-json を使わないと全データが1セルに連結されるので注意