【Zoho CRM】「気づいたら上書きされてた」を防ぐ。同時編集の事故をなくす警告機能の作り方(後編)

2026年06月02日

前編のおさらいと、まだ残っている課題

前編では、商談を開いた瞬間に「直近30分以内に誰かが更新していれば警告を出す」仕組みをご紹介しました。これだけでも、うっかりによる上書き事故の多くは防げます。

ただ、前編の最後でお伝えしたとおり、この仕組みには「見えない瞬間」があります。

たとえば、こんな状況を想像してみてください。

朝10時00分、Aさんが商談を開いて「編集する」ボタンを押し、編集ページで作業を始めました。まだ保存はしていません。

朝10時03分、別端末から同じ商談をBさんが開きました。前編の警告は「最後に保存された時刻」を見ているため、Aさんがまだ保存していないこの状況では、Bさんに警告は出ません。

そのままBさんも「編集する」を押して別の項目を編集し、先に保存。その後Aさんが保存すると、Bさんの入力は上書きされて消えてしまいます。

つまり前編の仕組みは、「保存されたあと」しか検知できないという弱点があるのです。

後編で作るのは、この弱点を埋める仕組みです。

後編で作る機能:編集ページに入った瞬間を記録する警告

後編のポイントはシンプルです。 「誰かが編集ページを開いた、その瞬間の時刻」を商談に記録しておきます。そして次に誰かが編集ページに入ったとき、「直前に別の誰かが編集を始めていないか」をチェックして、まだ作業中らしき気配があれば警告を出すのです。 完成すると、こんな動きになります。 朝10時00分、Aさんが商談で「編集する」ボタンを押す → 「Aさんが10時00分に編集開始」と商談に自動で記録される 朝10時03分、Bさんが同じ商談で「編集する」ボタンを押す → 画面に警告が表示される > ⚠️ 別端末で編集中の可能性があります。 > 約 3 分前に誰かが編集ページを開いています。 > 同時編集を避けるため、相手の編集が終わるまでお待ちください。

これにより、Aさんがまだ保存していない段階でも、Bさんは「あ、今誰かが触ってるかも」と気づくことができます。保存される前に気づける、というのが後編の最大の進化点です。

作り方:今回は事前準備が1つあります

後編の仕組みを動かすには、「編集ページに入った時刻」を商談に保存しておく場所が必要です。そのため最初に、商談へ新しい項目を1つ追加するところから始めます。

そのうえで、編集ページ用のクライアントスクリプトを作成します。前編をすでに作っている方は、それを残したまま今回の仕組みを追加してください。前編と後編は組み合わせて使うことで真価を発揮します。

ステップ1:商談に「編集開始日時」という項目を追加する

Zoho CRMの設定から、以下の順にたどります。

  1. 画面右上の歯車アイコン →「設定」
  2. 「カスタマイズ」→「モジュールと項目」
  3. 「取引(商談)」を選択
  4. レイアウトの編集画面を開く

新しい項目を1つ追加します。

設定項目入力する値
項目名編集開始日時
API名Editing_Started_At
種類日付/時間

レイアウト上のどこかに配置して保存します。営業担当の方が直接見る必要のない項目なので、目立たないセクションの隅や、非表示扱いのエリアに置いておけば大丈夫です。

ステップ2:編集ページ用のスクリプトを新規作成する

設定 → 開発者向け情報 → クライアントスクリプト → 「+新しいスクリプト」を開き、以下のように入力します。

設定項目入力する値
名前商談_編集開始ロック
カテゴリーModule
ページ編集ページ
タブ商談
レイアウト標準
種類ページの処理
タイミングonLoad

前編で作ったのは「詳細ページ」用、今回は「編集ページ」用です。混同しないようご注意ください。

入力できたら「次へ」をクリックします。

ステップ3:コードを貼り付ける

次に表示されるコード入力画面に、以下をそのままコピーして貼り付けます。

try {
  var recordId = $Page.record.id;
  var response = await zrc.get("/crm/v2/Deals/" + recordId);
  var deal = response.data.data[0];
  var lastStartStr = deal.Editing_Started_At;

  var now = new Date();
  var shouldWarn = false;
  var diffMin = 0;

  if (lastStartStr) {
    var lastStart = new Date(lastStartStr);
    diffMin = (now - lastStart) / 60000;
    if (diffMin >= 0 && diffMin < 10) {
      shouldWarn = true;
    }
  }

  if (shouldWarn) {
    var diffDisplay = Math.round(diffMin);
    var timeText = diffDisplay === 0 ? "1分以内" : "約 " + diffDisplay + " 分前";
    ZDK.Client.showAlert(
      "⚠️ 別端末で編集中の可能性があります。\n\n" +
      timeText + "に誰かが編集ページを開いています。\n" +
      "同時編集を避けるため、相手の編集が終わるまでお待ちください。"
    );
  }

  await zrc.put("/crm/v2/Deals/" + recordId, {
    data: [{ Editing_Started_At: now.toISOString() }]
  });
} catch (e) {
  // 何も表示しない
}

貼り付けたら「保存して閉じる」をクリックします。

最後の仕上げ:必ず「有効化」する

前編と同じく、スクリプトは保存しただけでは動きません。

クライアントスクリプトの一覧画面に戻り、作成したスクリプトの行にある有効化のスイッチ(トグル)をオンにしてください。

その後、ブラウザで強制リロード(Macは Cmd+Shift+R、Windowsは Ctrl+Shift+R)をすれば、設定完了です。

商談を開いて「編集する」ボタンを押し、時間を空けずにもう一度同じ操作をすると、警告が表示されることを確認できます。これは「自分の直前の編集」も検知しているためで、後ほど触れる仕様です。

後編の仕組みを、もう少し詳しく

このスクリプトが動く流れを、簡単に図解しておきます。

  1. 誰かが「編集する」ボタンを押し、編集ページが開く
  2. スクリプトが起動し、商談に保存されている「前回の編集開始日時」を読みに行く
  3. その日時が10分以内であれば → 警告メッセージを表示
  4. 警告の有無に関わらず、現在の時刻を「編集開始日時」として商談に上書き保存

このサイクルを、誰かが編集ページを開くたびに繰り返します。常に「直近で誰かが編集ページに入ったか」をチームで共有している状態が、自動的に作られていきます。

「10分」をチームに合わせて調整する

コードの中ほどにある、この一行に注目してください。

if (diffMin >= 0 && diffMin < 10) {

この 10 という数字が、「編集開始から何分以内なら警告を出すか」を決めています。単位は「分」です。

前編の30分と異なり、こちらは少し短めの設定が向いています。理由は、編集ページを長時間開きっぱなしにすることは少なく、たいてい数分以内に保存するかキャンセルするからです。

設定値向いているチーム
5入力が手早く、編集時間が短いチーム
10(初期値)一般的なバランス。多くのケースで適切
20じっくり考えながら編集することが多いチーム
30以上編集を始めて他作業に移ることが多い環境

長くしすぎると、誰も触っていないのに警告が出続けてしまうので、現実的な作業時間に合わせて調整するのがコツです。

後編の仕組みの「できること」と「できないこと」

正直にお伝えしておきます。

まずできることは、「保存される前の編集中」を検知できることです。前編では拾えなかった、まさに作業中の人の存在に気づけるようになります。

一方で、できないこともあります。

  • 同じアカウントを共有している場合、「自分の直前の編集」と「別端末の編集」を区別できません。たとえば自分が編集ページに入ってキャンセルし、すぐにもう一度入り直すと、自分自身の前回の入室が記録されているため警告が出ます
  • 概要画面で項目を直接クリックして編集する「インライン編集」には反応しません
  • 警告を無視して、そのまま編集すること自体は止められません

このうち、インライン編集についてはチーム内のルールでカバーするのが現実的です。「商談の編集は必ず編集ボタンから行う」というシンプルなルールを共有しておけば、警告が機能する経路に編集を集約できます。

前編と後編を組み合わせると、こうなる

前編と後編を両方導入すると、以下の二段構えで同時編集を防げるようになります。

タイミング検知する内容由来
商談の詳細画面を開いた瞬間直近で誰かが「保存した」前編
「編集する」ボタンを押した瞬間直近で誰かが「編集を始めた」後編

つまり、相手が保存し終わった後はもちろん、まだ保存していない作業中の段階でも、こちらに警告が届くようになります。

完全な排他制御ではないものの、現実の業務で起きる同時編集事故は、この二段構えでかなりの割合を防げます。AndSoでもこの仕組みを実運用していて、導入前と比べて「気づいたら上書きされていた」というトラブルが大きく減りました。

まとめ:完璧を目指さず、現実的に効く仕組みを

2回にわたってご紹介してきた同時編集の警告機能は、Zoho CRMの制約のなかで「現実的に効くライン」を狙った設計です。

完璧な排他制御を目指してシステムを複雑にしすぎると、運用が回らなくなったり、業務スピードを落としてしまったりします。それよりも、「気づかせる仕組み」を入れて、最後はチーム内のコミュニケーションで補う。このバランスが、長く運用できる仕組みのコツだとAndSoでは考えています。

前編・後編どちらも、コードをコピーして貼り付けるだけで動きます。同時編集のトラブルに心当たりがある方は、ぜひ試してみてください。

【Zoho CRM】「気づいたら上書きされてた」を防ぐ。同時編集の事故をなくす警告機能の作り方(後編) | Zoho CRMを活用した中小企業へのDX支援は【And So株式会社】。全ての企業にDXを!