Reckonerでkintoneのアプリ同士を相互に同期する方法
![](https://reckoner.io/wp-content/uploads/2022/06/kintone-to-kintone-eyecatch.webp)
kintoneで複数のアプリを運用している際、お互いにデータ同期させたい要望があります。今回は更新日時の新しいデータを正として、Reckonerでデータ同期させる方法を記載します。
サンプル概要
kintoneの2つのアプリ、「アプリA」と「アプリB」があり、この中に入っているデータを同期します。2つのアプリのアプリのスキーマは同一であり、次のとおりです。
![s-1200x200_v-fms_webp_eb5f0320-cee8-40e8-ae71-cd34861ccd21 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1200x200_v-fms_webp_eb5f0320-cee8-40e8-ae71-cd34861ccd21-1024x171.webp)
「文字列」「担当者」カラムの型はkintone上の「文字列(1行)」であり、「追加更新日時」カラムの型は、kintone上の「日時」です。
2つのアプリ内に入っているデータで、「担当者」と「追加更新日時」のデータが同一であった場合は、同じデータとして扱い、kintone内部で自動的にアイテム更新時に更新される「更新日時」カラムの日時が新しい方を正とし、「文字列」カラムを新しい方のデータに合わせた上で、2つのアプリへ書き込みます。
実行前のアプリAが次の状態で、
![s-1113x458_v-fs_webp_2fcddc67-2bd2-4379-90c3-6af83798923f | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1113x458_v-fs_webp_2fcddc67-2bd2-4379-90c3-6af83798923f-1024x421.webp)
実行前のアプリBが次の状態のとき、
![s-1113x580_v-fs_webp_96476257-4684-4a30-98b7-f853a7f6b347 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1113x580_v-fs_webp_96476257-4684-4a30-98b7-f853a7f6b347-1024x534.webp)
「担当者」と「追加更新日時」が同じなため、同じデータとして扱われる「担当者」が「田中太郎」のデータの、更新日時がアプリAよりもアプリBの方が新しい場合、アプリBのデータが優先されます。
このため、実行後のアプリAの状態は次のようになり、
![s-1285x604_v-fms_webp_a3987a53-7791-49a1-b2c1-88b9656e0a34 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1285x604_v-fms_webp_a3987a53-7791-49a1-b2c1-88b9656e0a34-1024x481.webp)
実行後のアプリBの状態は次のようになります。
![s-1285x604_v-fms_webp_d365d420-ca42-4366-8d4f-880b3c6b449d | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1285x604_v-fms_webp_d365d420-ca42-4366-8d4f-880b3c6b449d-1024x481.webp)
Reckoner ワークフロー概要
Reckonerで作成したワークフローの全体像は以下のとおりです
![s-2400x676_v-frms_webp_0d8859ec-677e-4ce9-8444-fc8c81aeb008 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-2400x676_v-frms_webp_0d8859ec-677e-4ce9-8444-fc8c81aeb008-1024x288.webp)
設定詳細: 転送元アプリA
転送元のkintoneアプリAの設定は以下のように設定しました。
(事前に登録したkintone接続情報を選択後、すべてのカラムを選択するようなクエリを記述します)
![s-1162x610_v-fs_webp_2f818ded-b759-456c-83b9-6f848350183a | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1162x610_v-fs_webp_2f818ded-b759-456c-83b9-6f848350183a-1024x538.webp)
詳細設定: 転送元アプリB
同様にkintoneアプリBの設定は以下のように設定しました。
![s-1162x610_v-fs_webp_8457ef81-1c6c-416d-b891-7a62d4a55c51 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1162x610_v-fs_webp_8457ef81-1c6c-416d-b891-7a62d4a55c51-1024x538.webp)
詳細設定: 結合(JOIN)アプリA
次にkintoneアプリAから抽出したデータに対してkintoneアプリBから抽出したデータを結合(JOIN)します。この時、同じデータとして扱いたい条件である「担当者」と「追加更新日時」が同一なもので左結合し、UPSERTに必要なkintoneの自動採番IDや、各アプリのデータをSELECTします。
![s-1098x1110_v-fs_webp_d0baad15-9703-4dc0-97d6-1f6c2bc77fd9 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1098x1110_v-fs_webp_d0baad15-9703-4dc0-97d6-1f6c2bc77fd9-1013x1024.webp)
![s-1104x1174_v-fs_webp_b77c7426-9c3f-4404-80ed-f19db29e5ffe | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1104x1174_v-fs_webp_b77c7426-9c3f-4404-80ed-f19db29e5ffe-963x1024.webp)
詳細設定: 結合(JOIN)アプリB
次にkintoneアプリBから抽出したデータに対してkintoneアプリAから抽出したデータを結合(JOIN)します。こちらも同様に、同じデータとして扱いたい条件である「担当者」と「追加更新日時」が同一なもので左結合し、UPSERTに必要なkintoneの自動採番IDや、各アプリのデータをSELECTします。
![s-1104x1174_v-fs_webp_f5257a94-f8ba-4630-95c2-3b552ced9101 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1104x1174_v-fs_webp_f5257a94-f8ba-4630-95c2-3b552ced9101-963x1024.webp)
![s-1104x1174_v-fs_webp_ad6b41e3-e455-443c-b2d8-46efef087c7b | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1104x1174_v-fs_webp_ad6b41e3-e455-443c-b2d8-46efef087c7b-963x1024.webp)
設定詳細: SQL文字列カラム計算アプリA/B
![s-1104x436_v-fs_webp_cbd841e6-927d-4a9d-a874-006f5f13f554 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1104x436_v-fs_webp_cbd841e6-927d-4a9d-a874-006f5f13f554-1024x404.webp)
「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
それぞれのアプリの更新日時が新しい方の「文字列」カラムのデータを、「文字列」カラムに入れています。
設定詳細: 投影 DROPアプリA/B
![s-1116x844_v-fs_webp_32fb6c22-fe60-4bb1-beb5-44f2da2a038e | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1116x844_v-fs_webp_32fb6c22-fe60-4bb1-beb5-44f2da2a038e-1024x774.webp)
「投影 DROP アプリA」「投影 DROP アプリB」は、表示名は違いますが、それ以外の設定は同一で、上のとおりです。
転送するために不要となったカラムを落としています。
設定詳細: 転送先アプリA/B
![s-1116x844_v-fs_webp_5640d94c-de15-40d8-86c6-57f08ed94e00 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1116x844_v-fs_webp_5640d94c-de15-40d8-86c6-57f08ed94e00-1024x774.webp)
![s-1116x844_v-fs_webp_0e9c4b6c-48e5-411f-9b61-a98d3c2e4336 | Reckoner](https://dj8g918l0q6mc.cloudfront.net/wp-content/uploads/2022/08/s-1116x844_v-fs_webp_0e9c4b6c-48e5-411f-9b61-a98d3c2e4336-1024x774.webp)
上のように、正しい接続情報を選択した上で、各アプリに対して、kintone内部で自動採番されるIDである「RecordId」をキーにした上でUPSERTを行います。
以上で2つのkintoneアプリをデータ同期させることができました
Reckoner(レコナー)について
Reckoner(レコナー)は、スリーシェイクが提供するオンプレミスからクラウドサービスまで、様々なデータを連携させることが可能なクラウドネイティブなデータ連携プラットフォーム(Data Integration Platform as a Service)です。
データ整備に欠かせないETL/ELTやデータパイプラインなどをノンプログラミングで実現し、従来エンジニアが必要とされていた開発・運用コストを大幅に削減できます。
https://www.reckoner.io/
ETLツールについて詳しく知りたい、ETLツールの選び方を知りたいという方はこちらの「ETLツールとは?選び方やメリットを解説」をぜひご覧ください。