kintoneのアプリ同士を相互に同期させる方法

kintoneの2つのアプリのデータを、同期させて同じ内容にしたい。また、その際に同じデータと満たす内容が両方にあれば、更新日時の新しい方を正として同期させたい。

サンプル概要

kintoneの2つのアプリ、「アプリA」と「アプリB」があり、この中に入っているデータを同期します。

2つのアプリのアプリのスキーマは同一であり、次のとおりです。

「文字列」「担当者」カラムの型はkintone上の「文字列(1行)」であり、「追加更新日時」カラムの型は、kintone上の「日時」です。

2つのアプリ内に入っているデータで、「担当者」と「追加更新日時」のデータが同一であった場合は、同じデータとして扱い、kintone内部で自動的にアイテム更新時に更新される「更新日時」カラムの日時が新しい方を正とし、「文字列」カラムを新しい方のデータに合わせた上で、2つのアプリへ書き込みます。

実行前のアプリAが次の状態で、

実行前のアプリBが次の状態のとき、

「担当者」と「追加更新日時」が同じなため、同じデータとして扱われる「担当者」が「田中太郎」のデータの、更新日時がアプリAよりもアプリBの方が新しい場合、アプリBのデータが優先されます。

このため、実行後のアプリAの状態は次のようになり、

実行後のアプリBの状態は次のようになります。

Workflow図

Source詳細

アプリA、アプリB共通

上のように、正しい接続情報を選択した上で、すべてのカラムを選択するようなクエリにします。

Analytics詳細

結合(Join) アプリA

上のように、アプリBとアプリAを、同じデータとして扱いたい条件である「担当者」と「追加更新日時」が同一なもので左結合し、UPSERTに必要なkintoneの自動採番IDや、各アプリのデータをSELECTします。

結合(Join) アプリB

上のように、アプリAとアプリBを、同じデータとして扱いたい条件である「担当者」と「追加更新日時」が同一なもので左結合し、UPSERTに必要なkintoneの自動採番IDや、各アプリのデータをSELECTします。

SQL 文字列カラム計算 アプリA、SQL 文字列カラム計算 アプリB共通

「SQL 文字列カラム計算 アプリA」「SQL 文字列カラム計算 アプリB」は、表示名は違いますが、クエリは同一で、次のとおりです。

SELECT *, IF(IFNULL(`アプリA更新日時`, to_timestamp('1970-01-01T00:00:00Z')) > IFNULL(`アプリB更新日時`, to_timestamp('1970-01-01T00:00:00Z')), `アプリA文字列`, `アプリB文字列`) AS `文字列` FROM linked_table

それぞれのアプリの更新日時が新しい方の「文字列」カラムのデータを、「文字列」カラムに入れています。

Transform詳細

投影 DROP アプリA、投影 DROP アプリB共通

「投影 DROP アプリA」「投影 DROP アプリB」は、表示名は違いますが、それ以外の設定は同一で、上のとおりです。

Sinkするために不要となったカラムを落としています。

Sink詳細

アプリA、アプリB共通

上のように、正しい接続情報を選択した上で、各アプリに対して、kintone内部で自動採番されるIDである「RecordId」をキーにした上でUPSERTを行います。