【Zoho CRM】「気づいたら上書きされてた」を防ぐ。同時編集の事故をなくす警告機能の作り方(後編)
-557961.png)
前編のおさらいと、まだ残っている課題
前編では、商談を開いた瞬間に「直近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つ追加します。
| 設定項目 | 入力する値 |
|---|---|
| 項目名 | 編集開始日時 |
| 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)をすれば、設定完了です。
商談を開いて「編集する」ボタンを押し、時間を空けずにもう一度同じ操作をすると、警告が表示されることを確認できます。これは「自分の直前の編集」も検知しているためで、後ほど触れる仕様です。
後編の仕組みを、もう少し詳しく
このスクリプトが動く流れを、簡単に図解しておきます。
- 誰かが「編集する」ボタンを押し、編集ページが開く
- スクリプトが起動し、商談に保存されている「前回の編集開始日時」を読みに行く
- その日時が10分以内であれば → 警告メッセージを表示
- 警告の有無に関わらず、現在の時刻を「編集開始日時」として商談に上書き保存
このサイクルを、誰かが編集ページを開くたびに繰り返します。常に「直近で誰かが編集ページに入ったか」をチームで共有している状態が、自動的に作られていきます。
「10分」をチームに合わせて調整する
コードの中ほどにある、この一行に注目してください。
if (diffMin >= 0 && diffMin < 10) {
この 10 という数字が、「編集開始から何分以内なら警告を出すか」を決めています。単位は「分」です。
前編の30分と異なり、こちらは少し短めの設定が向いています。理由は、編集ページを長時間開きっぱなしにすることは少なく、たいてい数分以内に保存するかキャンセルするからです。
| 設定値 | 向いているチーム |
|---|---|
| 5 | 入力が手早く、編集時間が短いチーム |
| 10(初期値) | 一般的なバランス。多くのケースで適切 |
| 20 | じっくり考えながら編集することが多いチーム |
| 30以上 | 編集を始めて他作業に移ることが多い環境 |
長くしすぎると、誰も触っていないのに警告が出続けてしまうので、現実的な作業時間に合わせて調整するのがコツです。
後編の仕組みの「できること」と「できないこと」
正直にお伝えしておきます。
まずできることは、「保存される前の編集中」を検知できることです。前編では拾えなかった、まさに作業中の人の存在に気づけるようになります。
一方で、できないこともあります。
- 同じアカウントを共有している場合、「自分の直前の編集」と「別端末の編集」を区別できません。たとえば自分が編集ページに入ってキャンセルし、すぐにもう一度入り直すと、自分自身の前回の入室が記録されているため警告が出ます
- 概要画面で項目を直接クリックして編集する「インライン編集」には反応しません
- 警告を無視して、そのまま編集すること自体は止められません
このうち、インライン編集についてはチーム内のルールでカバーするのが現実的です。「商談の編集は必ず編集ボタンから行う」というシンプルなルールを共有しておけば、警告が機能する経路に編集を集約できます。
前編と後編を組み合わせると、こうなる
前編と後編を両方導入すると、以下の二段構えで同時編集を防げるようになります。
| タイミング | 検知する内容 | 由来 |
|---|---|---|
| 商談の詳細画面を開いた瞬間 | 直近で誰かが「保存した」 | 前編 |
| 「編集する」ボタンを押した瞬間 | 直近で誰かが「編集を始めた」 | 後編 |
つまり、相手が保存し終わった後はもちろん、まだ保存していない作業中の段階でも、こちらに警告が届くようになります。
完全な排他制御ではないものの、現実の業務で起きる同時編集事故は、この二段構えでかなりの割合を防げます。AndSoでもこの仕組みを実運用していて、導入前と比べて「気づいたら上書きされていた」というトラブルが大きく減りました。
まとめ:完璧を目指さず、現実的に効く仕組みを
2回にわたってご紹介してきた同時編集の警告機能は、Zoho CRMの制約のなかで「現実的に効くライン」を狙った設計です。
完璧な排他制御を目指してシステムを複雑にしすぎると、運用が回らなくなったり、業務スピードを落としてしまったりします。それよりも、「気づかせる仕組み」を入れて、最後はチーム内のコミュニケーションで補う。このバランスが、長く運用できる仕組みのコツだとAndSoでは考えています。
前編・後編どちらも、コードをコピーして貼り付けるだけで動きます。同時編集のトラブルに心当たりがある方は、ぜひ試してみてください。