定期実行でデータの同期を実現するスマートな方法 その1〜cli-kintone編〜
警告
この記事ではver. 0.x.xのcli-kintoneを使って説明しています。 ver.1.0.0以降のcli-kintoneの使い方は、次のページを参照してください。
kintone コマンドラインツール(cli-kintone)
はじめに
こんにちは、クローバの門屋です。
kintoneは単体でも十分便利なものですが、社内のデータと連携して使いたいというシーンはかなりあると思います。
たとえば社内システムの社員マスターや顧客マスターと連携する場合や、集計した結果のみをkintoneに保存したい場合などが考えられます。
自分で実装する場合にはREST APIを使った連携が定石ですが、APIの仕様を理解する必要があるため、敷居の高さを感じる方も多いでしょう。
ここではkintoneのコマンドラインツールのcli-kintoneを定期実行させて、2つのシステム間のデータ同期をとる方法について説明します。
今回はインポートとエクスポートどちらでも流用しやすいように、2つのkintoneのデータを同期するシナリオを考えてみたいと思います。
2つのkintoneがそれぞれ別のドメインで運用されています。ドメインAのアプリAから、ドメインBのアプリBへと、毎日深夜に、前日更新分のデータを同期します。
なにはともあれ、cli-kintoneについて
cli-kintoneはコマンドライン上からkintoneにデータをインポート・エクスポートできるツールです。Windows/Linux/Mac版が提供されています。cli-kintoneについての説明は以前 詳しい記事を書いたので、こちらを確認してください。
具体的な活用のし方はこちらも参考にしてみてください。
同期するアプリについて
cli-kintoneを使えばサブテーブルや添付ファイルのインポート・エクスポートも可能なので、たいていのデータは同期が可能ですが、以下の同期はできません。
- カテゴリー
- ステータス
- 作業者
また以下の注意点があります。
- 両方のアプリのフォームに作成日時フィールドと更新日時フィールドを含める必要があります。
- 顧客コードなど、キーとなるフィールドを用意する必要があります。キーとなるフィールドはアプリの設定で重複を禁止してください。
- コピー元、コピー先両方のAPIトークンが必要です。コピー元のAPIトークンには閲覧権限、コピー先のAPIトークンにはレコード追加、レコード更新、アプリ管理権限を設定してください。
前日追加されたデータを取得する
cli-kintoneを使って前日追加されたデータを取得するには、次のようなコマンドを実行します(前日の日付を2016/11/1としています)。
|
|
変数 | 値 |
---|---|
$DOMAIN | ドメイン |
$APP_ID | アプリID |
$API_TOKEN | APIトークン |
$DOMAIN_AはドメインAの値を表します。
前日更新されたデータを取得する
同様に、前日更新されたデータを取得するには、次のようなコマンドを実行します。
|
|
データを追加、更新する前に
次に、取得したデータファイルを使って、ドメインBのアプリに追加、更新するわけですが、注意点があります。
CSVファイルに$idフィールドが存在すると、レコード番号でデータが更新される
今回はレコード番号以外のキーフィールドで更新したいわけですから、CSVファイルから$idフィールドを削除する必要があります。
cli-kintoneの仕様により、-cオプションでフィールドを指定しない場合、1列目はレコード番号となり、2列目はリビジョン番号となりますので、これらを削除します。
特定キーで更新するには、CSVファイルのヘッダーに「*」をつける
たとえば、フィールドコードが"code", "name", "address"とあって、"code"フィールドをキーにして更新する場合は、次のようになります。
|
|
上記2点の変換をする必要があります。今回はPythonを使って変換スクリプトを書くことにしました。
conv_csv.py
|
|
あらためて、データを追加、更新する
上で作成したフィルターを使って変換したファイルを使って、ドメインBのアプリを更新します。コマンドは以下のようになります。
|
|
ここまでの処理をシェルスクリプトにまとめました。
copy2kintone
|
|
定期実行する
作成したシェルスクリプトを定期実行するため、cronに登録します。
linuxの場合、chmod 755 copy2kintone で実行権限を先に付与する必要があります。
|
|
次のようにcrontabを編集します。
|
|
これで、毎日午前3時に前日分の同期処理が実行されます。
Windowsサーバーの場合はバッチファイルを作成してタスクスケジューラに登録することで同様のことが実現できます。
WindowsではShift-JISでCSVをインポート・エクスポートすることが多いため、必要に応じて文字コードの変換をしてください。
cronで動かしても実行結果が出ない場合、まず手元でシェルスクリプトを実行し動作確認をしてください。
linuxの場合、cronのログを /var/log/syslogで追うことができます。実行結果が出ない場合、ログを確認しましょう。
おわりに
いかがだったでしょうか。
cronとcli-kintoneとを組み合わせることで、最小限の手間でデータ同期を実現できることがおわかりいただけたかと思います。
これでこれまで埋もれていた社内のデータも有効活用できますね!
え、深夜に動かすサーバーがない?そんなときはAWSのlambda上でcli-kintoneを動かして定期実行させることもできます。こちらについてもまた機会があれば書いてみたいと思います。
関連Tips
Ver. 0.9.0 以降を利用する場合の注意事項(2018 年 1 月 18 日追記)
この記事で紹介している -fオプションのみ指定してインポートする方法は、2018年1月にリリースされるVersion 0.9.0以降では推奨しない方法です。
Version 0.9.0以降では、次のように --importオプションを指定する方法を推奨します。
|
|
現状は、-fオプションのみ指定する方法でも動作します。