cli-kintoneを使って複数アプリからデータをダウンロードする！

# はじめに
みなさん、**[cli-kintone](https://github.com/kintone/cli-kintone)** 使ってますか？？

kintoneに対する、データや添付ファイルの一括でのダウンロード・登録・更新・削除ができるツールです！！

CLIツール(コマンドラインツール)なので、開発者ではない人が使うにはちょっとハードルが高いかもですが、非常にパワフルなツールなので、これを機にぜひ使ってみてください！

しかも、v1.0.0からは、サイボウズ社が正式にサポートしてくれているので、使わない手はありませんね！！


# まずは cli-kintone の使い方を知ろう！
とりあえず、developer network内の記事の「**[kintone コマンドラインツール（cli-kintone）](https://cybozu.dev/ja/kintone/sdk/backup/cli-kintone/)**」を読もう！

cli-kintone のことについてメチャメチャ丁寧に書いてあるので、これを読んどけば、セットアップにしても使い方にしてもしっかり理解できるはずですっ！


# cli-kintoneの使い方は分かったぜ！だが…
**[devnet](https://cybozu.dev/ja/kintone/sdk/backup/cli-kintone/)** の記事読むと、「いやー、確かに記事の内容はメッチャ丁寧やし、使い方分かったぜ！(1つのアプリに対してだけどな！)」とはなるわけですよ。

ですが、**「複数のアプリのデータをまとめてダウンロードしたいよねー」** とか **「定期的にバックアップ取りたいよねー」** と思ったときに、**「どうやったらいいんやー！！」** となりませんか？？

そう！複数のアプリに対しての処理は意外にめんどくさいのですよ…。



# なので作ってみましたー
## 動作環境とか制限
* windows環境
* powershell
* cli-kintoneをインストールしておく



## 動作イメージはこんな感じ
![clikintone.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/f96f3fad-d85a-68a7-ff73-34cddb42c1b0.gif)



## セットアップ
* **[kintone2csv](https://github.com/j-kume/kintone2csv)** からダウンロード
* `src` 配下の `_config.json` `data_download.ps1` を任意のフォルダに配置する
* `_config.json` を自分の環境に合わせて記述する
* powershellで `data_download.ps1` を実行する


## _config.json の内容
### ポイント
* cli-kintone.exeの配置場所や出力先フォルダをパラメータ化して、汎用性を持たせている
* アプリ情報を配列で持たせている
* file_name を持たせたことで、生成されたCSVファイルをソートしやすくする
``` json
{
  "clikintone_path": "C:\\xxxxx\\xxxxx\\cli-kintone.exe",
  "output_dir": "C:\\xxxxx\\xxxxx\\xxxxx\\data_download\\",
  "base_url": "https://xxxxxxxxx.cybozu.com",
  "apps": [
    {
      "app_name": "顧客リスト",
      "id": 999,
      "token": "XXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "file_name": "F001_顧客リスト"
    },
    {
      "app_name": "問い合わせ管理",
      "id": 998,
      "token": "XXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "file_name": "F003_問い合わせ管理"
    },
    {
      "app_name": "案件管理",
      "id": 997,
      "token": "XXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "file_name": "F002_案件管理"
    }
  ]
}
```


## data_download.ps1 の内容
### ポイント
* 設定情報を別ファイルにすることで、汎用性を高めている
* 出力先フォルダに日時情報を持たせることで、履歴的として保存できる
* ファイル名に日時情報を持たせることで、誤って上書きしないようにしている
* Excelで開くことも多いかと思うので、文字コードをShift-jisにしている
``` powershell
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 定数
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$CONFIG = "_config.json"

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 設定情報の読み込み
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$setting_data = ConvertFrom-Json -InputObject(Get-Content -Raw -Encoding UTF8 $CONFIG -ErrorAction Stop)

Write-Output("[setting_data]")
Write-Output($setting_data.clikintone_path)
Write-Output($setting_data.output_dir)
Write-Output($setting_data.base_url)
Write-Output("")

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 出力先フォルダの生成
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$dir_output = $setting_data.output_dir + $(Get-Date -Format "yyyyMMdd_HHmm") + "\"
New-Item $dir_output -ItemType Directory | Out-Null

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# データ取得 & CSV生成
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
foreach ($app in $setting_data.apps) {
  $now = Get-Date -Format "yyyyMMddHHmmss"
  $target_id = $app.id
  $target_file = $app.file_name + "_" + $now + ".csv"
  Write-Output('####################################################')
  Write-Output("[EXPORT]   " + $app.app_name + " : " + $target_id + " -> " + $target_file)
  Write-Output("[start]    " + $(Get-Date -Format "yyyy/MM/dd HH:mm:ss"))
  Start-Process -FilePath $setting_data.clikintone_path -ArgumentList "record export --base-url $($setting_data.base_url) --app $($target_id) --api-token $($app.token) --encoding sjis" -Wait -NoNewWindow -RedirectStandardOutput $($dir_output + $target_file)
  Write-Output("[finished] " + $(Get-Date -Format "yyyy/MM/dd HH:mm:ss"))
  Write-Output("")
}
```



# 定期的にデータのバックアップするには…
`data_download.ps1`をタスクスケジューラー(下記画像参照)に登録することで、定期的なバックアップを実現することが出来ます。
ただし、タスクスケジューラーを実行する端末を起動しておかないといけない等、それなりに考慮しないといけない部分はありますが、費用的なコストを掛けずに実現できるので、ぜひチャレンジしてみてください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/15607939-a912-7c7c-fde1-c87e91ceb24b.png)



# 最後に
今回は、複数のアプリからのデータのダウンロードについて記事を書きましたが、一括での登録・更新・削除など、データ移行などの場面でめちゃくちゃ使えますので、本記事も参考にしていただきつつ、チャレンジしていただけると嬉しいです。

そして、もう一点。

データのダウンロードについては、kintone標準の「ファイルに書き出す」を使えば、一括でダウンロードすることが出来ますが、添付ファイルは一括でダウンロードできないんですよねー(怒)

もちろん外部サービスを使ったり、プログラムを書き書きすれば実現できますが、お金がかかったり、ちょっと難しかったりしますよね。

ちょっと大げさかもですが、添付ファイルを一括でダウンロードできるツールは、ほぼこれだけと言っても過言ではありません！

機会があれば、添付ファイルの一括ダウンロードについても記事書いてみます！(たぶん…)