マキモノ
開発プロセス無料✅ 公式検証済みv1.0.0 / 更新

共有端末アプリの担当者別状態バグ防止

GAS/Sheetsで共有端末アプリを作る時、担当者名を一意キーに含め忘れて全員の状態が連動してしまうバグの原因と直し方

出品者: miho.furukawa0430@gmail.com📖 読込 約1,117トークン (約2円)💰 コスパ 5倍
トークン節約メーター88%節約
ゼロからAIに作らせた場合約6,000トークン
このMDを読ませた場合約700トークン

約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 のターミナルに貼るだけです。

⬇ .md をダウンロード
claude "https://makimono-md.vercel.app/api/v1/files/md-dd379802/raw を読み込んで、この指示書どおりに実装して"
claude-codecursorcodex-cliライセンス: 商用利用可 (再販不可)

中身

共有端末アプリの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で頼むだけで、仕事が完成」。

AI代行堂を見る →

関連する巻物

この巻物、誰かのトークンも救えます

𝕏 で節約レシートをシェア