共有端末アプリの担当者別状態バグ防止
GAS/Sheetsで共有端末アプリを作る時、担当者名を一意キーに含め忘れて全員の状態が連動してしまうバグの原因と直し方
約5,300トークンの節約 (API料金換算で約8円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「共有端末アプリの担当者別状態バグ防止」は、開発プロセスカテゴリのAI指示書(MDファイル)です。GAS/Sheetsで共有端末アプリを作る時、担当者名を一意キーに含め忘れて全員の状態が連動してしまうバグの原因と直し方この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約5,300トークン(API料金換算で約8円)・88%のトークンを節約できます。
- カテゴリ
- 開発プロセス
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約6,000トークン
- この巻物使用時
- 約700トークン
- 節約量
- 約5,300トークン (約8円)
- 更新日
- 2026-08-25
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/md-dd379802/raw を読み込んで、この指示書どおりに実装して"
中身
共有端末アプリのGAS/Sheetsで「担当者名をレコードの一意キーに含め忘れる」バグを防ぐ
症状
複数人が同じ端末・同じアプリ(GAS Webアプリ+Sheetsをデータストアにした業務アプリ)を使う設計で、 「1人が状態を更新すると他の人の画面にも同じ状態が反映されてしまう」というバグが起きる。 例: チェックリストのチェックボックス、進捗フラグ、予約状態など、日付単位で管理しているつもりの値が 実は全員で共有されてしまっている。
原因
Google Sheetsをデータストアとして使うとき、レコードの一意キーを 「エンティティID + 日付」のような組み合わせだけで設計し、 「誰が操作したか(担当者名・ユーザーID)」を参考情報(監査ログ用の列)としてしか持たせないことがある。
// NGパターン: 担当者名は書き込むだけで、検索条件(一意キー)には使っていない
function checkItem(params) {
const row = findRow(params.entityId, params.date, params.itemId); // ← 担当者名が入っていない
if (row) {
updateRow(row, { updatedBy: params.operatorName, done: params.checked }); // 誰が押しても同じ行を上書き
} else {
appendRow([params.entityId, params.date, params.itemId, params.operatorName, params.checked]);
}
}
この設計だと、Aさんがチェックを入れて行ができた後、Bさんが同じ項目を開くと 「(entityId, date, itemId)」が一致する既存行が見つかり、Aさんの行をBさんの操作で上書きしてしまう。 双方の画面には「同じ1行」の状態がそのまま反映されるため、チェック状態が連動して見える。
直し方
一意キーの検索条件に必ず担当者名(またはユーザーID)を含める。
// OK: 担当者名を検索条件に含める=担当者ごとに別の行になる
function checkItem(params) {
const row = findRow(params.entityId, params.date, params.itemId, params.operatorName);
if (row) {
updateRow(row, { checkedAt: now(), done: params.checked });
} else {
appendRow([params.entityId, params.date, params.itemId, params.operatorName, now(), params.checked]);
}
}
読み取り側(一覧表示・集計)も同様に、担当者名でフィルタしてから件数計算する関数と、 フィルタなしで全員分を返す関数(管理者の集計画面用)を分けて用意するとよい。
function readRuns(date, operatorName) {
return getAllRows()
.filter(r => r.date === date && (!operatorName || r.operatorName === operatorName));
}
operatorName を渡せば本人だけの状態、渡さなければ全員分(管理者ダッシュボード用の集計)という
1つの関数で両方をカバーできる。
チェックリスト(新規設計時に確認する)
- 「同じ日に複数人が同時に触る」レコードか?(勤怠・チェックリスト・予約・在庫引当など)
- レコードの検索キーに、担当者名/ユーザーIDが検索条件として含まれているか(書き込み列にあるだけでは不十分)
- 一覧・集計画面が「本人だけ」と「全員合計」のどちらを見せるべきか設計時に決めているか
- 既存データのマイグレーションが不要な設計になっているか(担当者名を検索条件に足すだけなら、 既存行は「最後に触った人のもの」として自然に引き継がれるため、通常はマイグレーション不要)
関連
- 認証を伴わない共有端末アプリ(名前を自己申告するだけのUIなど)ほど、この種のバグが起きやすい。 ログインの概念がないぶん「誰の状態か」を暗黙に共有カラムに頼りがちになるため、設計段階で意識する。
よくある質問
+「共有端末アプリの担当者別状態バグ防止」とは何ですか?
GAS/Sheetsで共有端末アプリを作る時、担当者名を一意キーに含め忘れて全員の状態が連動してしまうバグの原因と直し方
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約6,000トークンかかりますが、この巻物を使えば約700トークンで済みます。差し引き約5,300トークン(API料金換算で約8円)・88%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
ドキュメント駆動開発プロセス CLAUDE.md — 作るものを固めてから書かせる
「AIが暴走して意図と違うものを作る」を根絶する開発プロセス指示書。UI仕様→機能設計→実装の順をAIに強制し、1ファイルごとに承認ゲートを挟む。受託開発・チーム開発向け。
AIに指示書マーケットを自動参照させ、終了時に自動出品させるMD
開発依頼を受けた瞬間にマーケットの完成済み指示書を検索してAIに読ませ、セッション終了時には汎用ノウハウを自動出品させる仕組みの作り方。全台配布・秘密情報スキャン・実際に踏んだ配布バグ3つの回避込み。
「そのPCにしか直せない障害」をAIに自分で気付かせて着手させる
特定の1台にしかリポジトリが無い機能は、修正手順を書いても誰にも実行されず放置される。SessionStart hook で当該PCのAIだけに指示を出し、完了後は指示書へ状態を書き戻して再実装事故を防ぐ型。走査の時間予算とセッション跨ぎの再開、メール一致だけの自動承認がなりすまされる理由と署名キー方式、状態問い合わせAPI、鍵の自動配布、no-op通知の抑止まで、実際に94件の滞留を解消した実例に基づく手順。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア