前回の「kintoneコマンドラインツールでサブテーブルを操作してみた」では、サブテーブル付きのkintoneアプリからデータを書き出すことをしてみました。今回は、kintoneの異なるアプリのデータを定期的に別のアプリにコピーする方法を紹介したいと思います。しかし、データをコピーするシーンってどんな時でしょうかね。
- 運用中のアプリをバックアップしたい
- 必要なデータのみを別のアプリで管理したい
- 情報管理の都合上、別会社(ドメイン)へデータを同期して活用したい
など、もっとあるかもしれませんが、その中でも「情報管理の都合上、別会社(ドメイン)へデータを同期して活用したい」を試してみたいと思います。
イメージ
次の処理をシェルスクリプトで実現してみます。
- アプリAから条件を絞り込んでCSVに出力する
- 出力したCSVのフィールドコードをアプリBに合わせる
- アプリBに登録する
kintoneコマンドラインツールを取得する
「kintoneコマンドラインツール」を使います
次のようなことが Windows, Linux, Macからできるコマンドツールです。
データの取得方法は「kintoneコマンドラインツールでサブテーブルを操作してみた」で記載していますので、ご覧ください。
2つのアプリを用意する
異なるドメインでkintoneアプリをそれぞれ 1つずつ用意します。
kintoneの環境を持っていない!という方、cybozu.com developer networkで無償の開発者ライセンスを取得しておきましょう。
アプリの構成
アプリA
| フィールドコード | フィールドタイプ |
|:-----------|:------------|
| TitleA | 文字列(1行)|
| NumberA | 数値 |
アプリB
| フィールドコード | フィールドタイプ |
|:-----------|:------------|
| TitleB | 文字列(1行)|
| NumberB | 数値 |
レコード登録画面
(フィールド名とフィールドコードを同じにしています)
アプリA
アプリB
kintoneコマンドラインツールに必要な情報
アプリA
| パラメータ | 値 |ここで実験する値 |
|:----------|:----------------|:------------|
| -a | アプリID |85 ※IDはURLに表示されています。 |
| -d | サブドメイン名 |sample1.cybozu.com ※サブドメイン名は各自異なります。
| -t | APIトークン |De5Xb3TM1TDccdqEM20eP1dpesjuBLckOx6AyM4n ※アプリの管理画面から発行できます。|
アプリB
| パラメータ | 値 |ここで実験する値 |
|:----------|:----------------|:------------|
| -a | アプリID |822 ※IDはURLに表示されています。 |
| -d | サブドメイン名 |sample2.cybozu.com ※サブドメイン名は各自異なります。
| -t | APIトークン |BoNFRmX0oDoKQMSrTiZC7hbEmb9QaZa1vYVfnyD4 ※アプリの管理画面から発行できます。|
それぞれの値は環境によって異なります。
いよいよ本題!シェルスクリプトを実行してみよう
Linux環境の場合、次のシェルスクリプトをUTF-8で保存しましょう。
ここでのファイル名は「import.sh」にしておきます。
説明
-
--- self setting ---
で囲まれた部分の変更のみです。 -
# APP_ID_A
内の変数にアプリAの情報を設定-
QUERY_A
は必要に応じてクエリーで絞り込む クエリー記法はこちら
-
-
# APP_ID_B
内の変数にアプリBの情報を設定 -
# Mapping
内の変数にコピー元のフィールド:コピー先のフィールドを設定- TitleAからTitleBにコピーする際には、
TitleA:TitleB
と書きます -
$id
など「$
」を使う際にはエスケープしましょう - コピーするフィールドに応じて増やしましょう
- TitleAからTitleBにコピーする際には、
プログラム
#!/bin/bash
# --- self setting ---
# character encoding
OUTPUT_TYPE="sjis"
#OUTPUT_TYPE="utf-8"
# APP_A
APP_ID_A="85"
SUB_DOMAIN_A="sample1"
API_TOKEN_A="De5Xb3TM1TDccdqEM20eP1dpesjuBLckOx6AyM4n"
QUERY_A="Created_datetime = THIS_MONTH()" #"$id < 100 and Created_datetime = TODAY()"
# APP_B
APP_ID_B="822"
SUB_DOMAIN_B="sample2"
API_TOKEN_B="BoNFRmX0oDoKQMSrTiZC7hbEmb9QaZa1vYVfnyD4"
# Mapping
declare -a ARR_MAPPING=()
ARR_MAPPING+=("TitleA:TitleB") #sample:\$id,Title,Number,...
ARR_MAPPING+=("NumberA:NumberB")
# --- self setting ---
# set cli-kintone files
CLI_FILES="cli-kintone"
BASE_DIR=$(cd $(dirname $0); pwd)
if [ ! -f "$BASE_DIR/$CLI_FILES" ]; then
echo "Not found $CLI_FILES files."
exit 1
fi
# set header fields
declare -a ARR_FIELDS_A=()
declare -a ARR_FIELDS_B=()
for i in "${ARR_MAPPING[@]}"
do
ARR_FIELDS_A+=(`echo $i | cut -d":" -f1 | cut -d":" -f1`)
strB=\"`echo $i | cut -d":" -f2 | cut -d":" -f1`\"
ARR_FIELDS_B+=($strB)
done
OUTPUT_FIELDS="$(IFS=,; echo "${ARR_FIELDS_A[*]}")"
INPUT_FIELDS="$(IFS=,; echo "${ARR_FIELDS_B[*]}")"
# set datetime file
DATETIME=`date +%Y%m%d%H%M%S.%2N`
OUTPUT_FILE="output$DATETIME.csv"
OUTPUT_PATH=$BASE_DIR/$OUTPUT_FILE
# excute output file
./$CLI_FILES -a $APP_ID_A -d $SUB_DOMAIN_A -t $API_TOKEN_A -e $OUTPUT_TYPE -c "$OUTPUT_FIELDS" -q "$QUERY_A" >> $OUTPUT_PATH
# change csv header
IMPORT_FILE="Import$DATETIME.csv"
find . -name "$OUTPUT_FILE" | sed -i -e "1,1d" $OUTPUT_FILE
find . -name "$OUTPUT_FILE" | sed -i -e "1i $INPUT_FIELDS" $OUTPUT_FILE
find . -name "$OUTPUT_FILE" | mv "$OUTPUT_FILE" "$IMPORT_FILE"
echo "Import file: $IMPORT_FILE"
# excute import file
./$CLI_FILES -a $APP_ID_B -d $SUB_DOMAIN_B -t $API_TOKEN_B -e $OUTPUT_TYPE -f "$IMPORT_FILE"
echo "Finished."
シェルスクリプトを実行してみる
$ ./import.sh
コピーできた!!
インポート対象のファイルは、import~.csv というファイルで、保存するようにしています。
さいごに
いかがでしたでしょうか。kintoneコマンドラインツールとシェルスクリプトを使うと 定期的に、別会社(ドメイン)へデータを同期して活用 することができます。お試しください。