kintoneコマンドラインツールでデータ登録してみた

前回の「[kintoneコマンドラインツールでサブテーブルを操作してみた](http://qiita.com/ushiron/items/f7f66632710b9b0834c5)」では、サブテーブル付きのkintoneアプリからデータを書き出すことをしてみました。今回は、kintoneの異なるアプリのデータを定期的に別のアプリにコピーする方法を紹介したいと思います。しかし、データをコピーするシーンってどんな時でしょうかね。

1. 運用中のアプリをバックアップしたい
2. 必要なデータのみを別のアプリで管理したい
3. 情報管理の都合上、別会社（ドメイン）へデータを同期して活用したい

など、もっとあるかもしれませんが、その中でも「**情報管理の都合上、別会社（ドメイン）へデータを同期して活用したい**」を試してみたいと思います。

# イメージ
![img20160205-104244no-00.png](https://qiita-image-store.s3.amazonaws.com/0/100494/2cdd6102-f5ed-5b15-4c4e-e15b94fa528d.png)

次の処理をシェルスクリプトで実現してみます。
1. アプリAから条件を絞り込んでCSVに出力する
2. 出力したCSVのフィールドコードをアプリBに合わせる
3. アプリBに登録する

# kintoneコマンドラインツールを取得する
「[kintoneコマンドラインツール](https://cybozudev.zendesk.com/hc/ja/articles/202708214)」を使います
次のようなことが Windows, Linux, Macからできるコマンドツールです。
データの取得方法は「[kintoneコマンドラインツールでサブテーブルを操作してみた](http://qiita.com/ushiron/items/f7f66632710b9b0834c5)」で記載していますので、ご覧ください。

# 2つのアプリを用意する
異なるドメインでkintoneアプリをそれぞれ 1つずつ用意します。
kintoneの環境を持っていない！という方、[cybozu.com developer network](https://cybozudev.zendesk.com/hc/ja)で無償の開発者ライセンスを取得しておきましょう。


### アプリの構成
#### アプリA

>| フィールドコード | フィールドタイプ |
|:-----------|:------------|
| TitleA      | 文字列（1行）|
| NumberA     | 数値        |

#### アプリB

>| フィールドコード | フィールドタイプ |
|:-----------|:------------|
| TitleB      | 文字列（1行）|
| NumberB     | 数値        |

### レコード登録画面
（フィールド名とフィールドコードを同じにしています）
アプリA
>![img_20160203095822.png](https://qiita-image-store.s3.amazonaws.com/0/100494/c1313229-a499-e88e-ba22-79b66667e464.png)

アプリB
>![img_20160203095924.png](https://qiita-image-store.s3.amazonaws.com/0/100494/936b9a49-cf94-3203-3c30-ac80630fe447.png)

### 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```は必要に応じてクエリーで絞り込む [クエリー記法はこちら](https://cybozudev.zendesk.com/hc/ja/articles/202331474#step2)
 - ```# APP_ID_B```内の変数にアプリBの情報を設定
 - ```# Mapping``` 内の変数にコピー元のフィールド:コピー先のフィールドを設定
    - TitleAからTitleBにコピーする際には、```TitleA:TitleB``` と書きます
    - ```$id```など「`$`」を使う際にはエスケープしましょう
    - コピーするフィールドに応じて増やしましょう    

## プログラム

```bash:
#!/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."

```

## シェルスクリプトを実行してみる

```bash:
$ ./import.sh
```

**コピーできた！！**
インポート対象のファイルは、import~.csv というファイルで、保存するようにしています。
![img_20160203171507.png](https://qiita-image-store.s3.amazonaws.com/0/100494/0ede2aac-fa3f-1747-d65e-53c230ee68fe.png)


## さいごに
いかがでしたでしょうか。kintoneコマンドラインツールとシェルスクリプトを使うと **定期的に、別会社（ドメイン）へデータを同期して活用** することができます。お試しください。