NocoBaseで編集履歴を残したい

NocoBaseで編集履歴を残したい

2025.08.07

GoogleスプレッドシートからNocoBaseを利用したデータ基盤への移行の際、編集履歴機能が欲しいと要望をいただきました。
以前はplugin-snapshot-fieldが提供されており、比較的簡単に編集履歴を残すことができましたが、1.0.0で非推奨となりました。
今回は、NocoBaseの機能を利用して登録・更新時に変更された値を別テーブルに保持する形で編集履歴機能を実装します。

テーブルを定義する

今回はサンプルとして「従業員」テーブルの編集履歴を「従業員編集履歴」テーブルに記録する形式とします。

「従業員」テーブルの定義

table-definition-parent

「従業員編集履歴」テーブル作成後、「1:多」で関連付けます。

table-definition-parent-relation

「従業員編集履歴」テーブルの定義

table-definition-child

プリセットフィールドは「ID」「作成日」「作成者」のみを選択してテーブルを作成します。
「作成日」は編集日時として、「作成者」は編集者として扱います。

編集履歴テーブルのフィールドは、履歴の対象とする列ごとに2つずつ用意しています。
「差分-」と付いているフィールドは、差分があった場合のみ値を入れるフィールドです。「どの列に変更があったか」を見やすく表現するために設けています。
「差分-」と付かないフィールドは、次の編集の際に差分チェックできるよう、現時点の値を格納しておくフィールドです。

また、編集者が編集理由などを入力できるよう「編集コメント」列を設けてみました。

履歴を作成するワークフローを定義

履歴はNocoBaseのワークフローを利用して自動作成します。

ワークフローを作成

create-workflow

トリガータイプは、UI上の操作を起点とするため「操作後のイベント」を選択します。

実行モードは、今回はワークフローの実行結果を利用しないため「非同期」を選択します。

ノード構築

workflow-whole

全体像は上記のとおりです。

上から順に説明していきます。

トリガー

全ての画面からの操作に対して履歴を作成したい場合はグローバルモードを選択。
特定の画面からの操作に対して履歴を作成したい場合はローカルモードを選択。

今回は「グローバルモード」を選択しました。

ローカルモードの場合は、履歴作成対象となる「保存」ボタンにワークフローをバインドすることで、定義した履歴作成ワークフローが呼び出されるようになります。

bind-postaction-workflow

クエリレコード

workflow-node-query

編集の有無を後続ノードでチェックするため、編集された「従業員」レコードに対する最新の編集履歴を1件取得します。

最新の編集履歴を取得するため、「作成日」の「降順」でソートを掛けます。

条件

workflow-node-condition-isedit

入力フォーム側で何も変更せずそのまま「保存」を押下した際にもAPIにリクエストが行われるため、「操作後のイベント」のトリガーが発火してしまいます。
編集されている場合のみ後続ノードを実行するため、ここで「クエリレコード」ノードの結果と比較して編集有無をチェックします。

「モデル」は「はい」の場合に続行を選択します。

「条件」として、編集履歴を残す列の何れかが変更されている場合に真となるよう条件を設定します。

レコード追加

workflow-node-record-add

編集されていることが確定したら、新たな編集履歴レコードを追加します。

「作成者」にはトリガーを発生させたユーザーのIDを指定します。
「レコード追加」ノードでは、レコードの「作成者」がデフォルトでは空欄となるため指定する必要があります。

外部キー列(「従業員ID」)には親レコードのIDが格納されるよう指定します。

他、差分チェック用の各列(「差分-」とつかない列)には、トリガーデータの対応する各列の値が格納されるよう指定します。

分岐

workflow-node-parallel

履歴対象の各列の値に差分があるかチェックを行います。
が、その前に「分岐」ノードを利用し、今後履歴対象の列が増えても処理速度に影響しないよう処理を並列化します。

「モード」は「Run all branch (ignore failures)」を選択します。
(各分岐の成否を利用しないため)

これ以降のノードは、履歴対象の列ごとに分岐を作成し、分岐にそれぞれノードをぶら下げます。

条件

workflow-node-condition-column-isedit

「クエリレコード」ノードの結果(最新の編集履歴)との差分があるかチェックします。

レコード更新

workflow-node-update

差分があった場合、「レコードを追加」ノードで追加したレコードの対応する「差分-」列に編集された値を格納します。

動作確認

verif-add

ひとまず、「従業員」のレコードを追加してみました。

verif-added-history

この時点での「従業員編集履歴」(差分のみ表示)は上記のとおりです。

verif-update

「誕生日」列を素で入力し忘れたので編集しました。

verif-updated-history

編集後の「従業員編集履歴」は上記のとおりです。

レコード作成時は入力されたすべての列が差分として格納され、レコード編集時は差分がある列のみ格納されていることがわかります。

verif-comment

せっかく「編集コメント」列を用意したので入力してみました。

かなりそれっぽく編集履歴が取れるようになったかと思います。

verif-comment-rule

また、「コメント編集」は実際に編集したユーザーのみが入力できるよう、上記のように連動規則を設けています。

課題点

  1. 履歴対象のテーブル構成変更時にメンテナンスが必要となる
  2. レコードが削除された場合の履歴が残らない

削除された場合の履歴を残す方法については後日別記事でご紹介させていただきます。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.