kintone REST APIから取得したJSONデータをCSV化してみる。

## はじめに
kintoneアプリの仕様書の作成時、アプリの編集画面の内容を目で拾ってExcelで仕様書に起こすと、入力ミス対策の確認や純粋に手作業での手間が増えてしまいます。kintone REST APIを使用するとkintoneアプリの各種情報を拾えるらしいので、どうせならExcelで読み込めるCSVファイル(文字コード：SJIS)に変換できるまで頑張ってみましょう。

## 用意する環境
この記事ではWindow10の環境でREST API呼び出しにpython3.*とrequestsパッケージを使用します。
また、JSONデータの変換にgitbash、jq、文字コード変換にnkfを使用します。

pythonインストールと初期設定については適当にググってください。requestsも同様です。
git_bashについてはgit for Windows導入時に一緒に入るので以下の記事を参考に導入してください。
[Git for Windowsの入手とインストール]
(https://qiita.com/elu_jaune/items/280b4773a3a66c7956fe)

jqとnkfは簡単に導入方法を説明しますが、詳細は先人の方の記事を参考にしてください。
[jq コマンドを使う日常のご紹介](https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)
[Windows10にnkfコマンドをインストールする方法](https://qiita.com/ponsuke0531/items/d0b6d743a70c624a1ba7)

## kintone REST APIからデータをゲットする。

ご利用の環境に合わせて下記のコードを変更し、文字コードUTF-8で「getKintoneRestAPI.py」として任意のフォルダ（例「c:\kintone」）に保存します。コード内で変更するところは3点です。
###①呼び出すREST APIのURL
　　ソース内のコメントを参考にドメイン名、パス、アプリIDを変更してください。
###②認証情報
　　アクセス対象のkintoneアプリの管理者権限ユーザのID:パスワードを設定してください。
###③出力するJSONファイル名 
　　任意のファイル名を設定してください。
　　サンプルではaacl(アプリのアクセス権)396{アプリID)_サンプルアプリ(_アプリ名).jsonとしています。


```python:getKintoneAPI.py

# coding: utf-8
#使用方法
#  必要に応じてコード中の　①呼び出すRESTAPI、②認証情報、③出力するJSONファイル名 を変更してください。
#  python3.x系で実行してください。

import requests
import json
import base64 


#①呼び出すREST APIのURL(exsample部分をご利用のドメイン名に変更してください。)
URL = "https://exsample.cybozu.com/k/v1/app/acl.json?app=396"
#kintone REST API別の呼び出し例("?app=20"の「20」部分は取得対象のアプリIDに書き換えてください。)
#(アプリの設定の取得URL例)
#"https://exsample.cybozu.com/k/v1/app/form/fields.json?app=20"
#(アプリの権限URL例)
#"https://exsample.cybozu.com/k/v1/app/acl.json?app=20"
#(レコードの権限URL例)
#"https://exsample.cybozu.com/k/v1/record/acl.json?app=20"
#(フィールドの権限URL例)
#"https://exsample.cybozu.com/k/v1/field/acl.json?app=20"
#(一覧の設定の取得URL例)
#"https://exsample.cybozu.com/k/v1/app/views.json?app=20"

#②認証情報（アクセス権の取得APIはAPIトークンでは呼び出せないため、ログインID:PWで認証する）
#変数strに「ユーザ名:パスワード」の文字列を設定してください。
str = 'user:password'

#③出力ファイル名
#任意のファイル名を指定します。
filename = "aacl396_サンプルアプリ.json"

#REST API呼び出し関数
def get_kintone(url, xc_auth):
    headers = {"X-Cybozu-Authorization": xc_auth}
    resp = requests.get(url, headers=headers)
    return resp


#main関数
def main():       
        
    #「ユーザ名:パスワード」の文字列をUTF8としてBase64エンコードした値で認証する。
    XC_AUTH_b = base64.b64encode(str.encode('utf-8'))
    #(base64エンコードの戻り値のバイト型変数をstring型にデコードしている。)
    XC_AUTH = XC_AUTH_b.decode()
    #base64エンコード後の文字列
    print(XC_AUTH)
    
    
    #REST API呼び出し(URL,Base64円コードした認証情報)、JSON形式のデータを取得
    RESP = get_kintone(URL, XC_AUTH)
    FtdJ = json.dumps(json.loads(RESP.text) , ensure_ascii=False, indent="\t")

    #指定されたファイル名でJSON形式のテキストを書き出す。
    f = open(filename, "w")
    f.write(FtdJ)
    f.close()
    print('JSONファイルを出力しました。') 

#メイン関数呼び出し(エントリポイント)
main()
```

以下のように実行します。
```
C:\kintone>python getKintoneRestAPI.py
```
実行後、出力されたファイル(例では「aacl396_サンプルアプリ.json」)は以下のようになっています。

```aacl396_サンプルアプリ.json
{
	"rights": [
		{
			"entity": {
				"type": "GROUP",
				"code": "Administrators"
			},
			"includeSubs": false,
			"appEditable": true,
			"recordViewable": true,
			"recordAddable": true,
			"recordEditable": true,
			"recordDeletable": true,
			"recordImportable": true,
			"recordExportable": true
		},
		{
			"entity": {
				"type": "ORGANIZATION",
				"code": "監査部_mF7iz0"
			},
			"includeSubs": false,
			"appEditable": true,
			"recordViewable": true,
			"recordAddable": true,
			"recordEditable": true,
			"recordDeletable": true,
			"recordImportable": true,
			"recordExportable": true
		},
		{
			"entity": {
				"type": "ORGANIZATION",
				"code": "営業部_jXNHtD"
			},
			"includeSubs": true,
			"appEditable": false,
			"recordViewable": true,
			"recordAddable": true,
			"recordEditable": true,
			"recordDeletable": true,
			"recordImportable": true,
			"recordExportable": true
		},
		{
			"entity": {
				"type": "ORGANIZATION",
				"code": "購買部_IIwO3j"
			},
			"includeSubs": false,
			"appEditable": false,
			"recordViewable": true,
			"recordAddable": false,
			"recordEditable": false,
			"recordDeletable": false,
			"recordImportable": false,
			"recordExportable": false
		},
		{
			"entity": {
				"type": "GROUP",
				"code": "everyone"
			},
			"includeSubs": false,
			"appEditable": false,
			"recordViewable": false,
			"recordAddable": false,
			"recordEditable": false,
			"recordDeletable": false,
			"recordImportable": false,
			"recordExportable": false
		}
	],
	"revision": "14"
}

```

※上記JSONデータの元となったアプリのアクセス権設定は以下のようになっています。
<img width="900" alt="アクセス権.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/355999/1982722a-b276-5904-1fb6-cb0ee6d0131a.png">


##JSONの文字コードをUTF-8に変更します。
jqコマンドで受け付けられる日本語文字コードはUTF-8のみとなります。
コマンドプロンプトからpythonを実行すると出力ファイルの文字コードがSJISになるので、nkf(ネットワーク漢字フィルタ)を使用して、UTF-8に変更する必要があります。

###nkfを入手
[Vectorのnkfダウンロードページ]
(https://www.vector.co.jp/soft/dl/win95/util/se295331.html)からnkfwin.zip ダウンロードし、解凍すると生成されるファイルの内、nkfwin32.exeを任意の場所の保存してパスを通すか、面倒なら処理対象のJSONファイルを同じフォルダ（例ではc:\kintone）に保存します。

###文字コードをUTF-8に変換する。
nkfは入力ファイルの文字コードは自動判定されるので出力ファイルのみ、文字コード：UTF-8(BOM無し）を「-w」オプションで指定します。
入力ファイルはここまでのサンプルの「aacl396_サンプルアプリ.json」、出力ファイルはわかりやすいように「aacl396_サンプルアプリ_UTF8.json」とします。

```
C:\kintone>nkfwin32 -w aacl396_サンプルアプリ.json > aacl396_サンプルアプリ_UTF8.json
```

##JSONをCSVに変換します。
JSONデータ形式のままではExcelに読み込めないので、jqコマンドを使用してCSVファイルっぽく成形します。


###まずはjqをゲット
[jq公式サイト](https://stedolan.github.io/jq/)にアクセスし、「Download jq1.*」のボタンをクリックしすると、プラットフォーム選択リストが表示されるのでWindows(64bit)を選択すると「jq-win64.exe」がダウンロードされるので、任意の場所の保存してパスを通すか、面倒なら処理対象のjsonファイルを同じフォルダ（例ではc:\kintone）に保存します。

###JSONからCSV形式に変換するためのシェルスクリプトを作成
jqコマンドの書式指定で多用する、「'」、「"」などの記号は、Windowsのコマンドプロンプト（バッチファイル）では扱い辛いため、以下のようにシェルスクリプトを作成しました。ついでにExcelで開けるよう最終行でnkfを使用して文字コードをSJISに変換しています。
以下の内容を文字コードUTF-8のテキストファイルとして"json2csv.sh"いうファイル名で、作業フォルダ（例「c:\kintone」）に保存します。

```sh:json2csv.sh
#!/usr/bin/bash
# 実行方法
# gitbash上で以下のように実行
# $ ./json2csv.sh 
filename="aacl396_サンプルアプリ.csv"
strCSV="設定対象,アプリの管理,レコードの閲覧,レコードの追加,レコードの編集,レコードの削除,ファイルの読み込み,ファイルの書き出し,下位組織に継承\\n"
strCSV+=$(cat aacl396_サンプルアプリ_UTF8.json | ./jq-win64 -r '.rights[]|"\(.appEditable),\(.entity.code),\(.recordViewable),\(.recordAddable),\(.recordEditable) ,\(.recordDeletable),\(.recordImportable),\(.recordExportable),\(.includeSubs)"')
echo -e "$strCSV"
echo -e "$strCSV" >tempUTF8.csv
./nkfwin32 -sLw-c < tempUTF8.csv > $filename

```

###git bashでシェルスクリプトを実行し、JSONファイルをCSV化する
シェルスクリプトの実行には、git bashを使用します。git bashを起動するには、以下の画面のように作業フォルダを右クリックして”Git Bash Here"をクリックします。
<img width="422" alt="bash.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/355999/a4f8e775-38ab-28ae-ec53-30d6a3789359.jpeg">


git bashが起動したら、以下のようにシェルスクリプトを実行します。

```shell_session
$ ./json2csv.sh
```

シェルスクリプトの実行後、以下のような内容で「aacl396_サンプルアプリ.csv」が生成されます。
文字コードはSJISになっているので、そのままExcelで開いて加工することができます。

```csv:aacl396_サンプルアプリ.csv
設定対象,アプリの管理,レコードの閲覧,レコードの追加,レコードの編集,レコードの削除,ファイルの読み込み,ファイルの書き出し,下位組織に継承
true,Administrators,true,true,true ,true,true,true,false
true,監査部_mF7iz0,true,true,true ,true,true,true,false
false,営業部_jXNHtD,true,true,true ,true,true,true,true
false,購買部_IIwO3j,true,false,false ,false,false,false,false
false,everyone,false,false,false ,false,false,false,false

```

以上でkintoneのREST APIから取得したJSONデータのCSVファイル化が完了となります。