【非エンジニア向け】KintoneのレコードをKintone APIを利用して一括取得するまでのメモ

## 0.背景
所属部門が利用している各種サービスへの支払い先一覧の作成を依頼されました。
Kintoneのレコードを一つ一つ開いて、コピペをすることもできるのですが、
ヒューマンエラーを極力避けたいと思ったので、APIを利用してエンジニアリングすることにしました。


## 1. APIで取得したいレコード
1.　Kintoneアプリ内の作成したフィールドから特定の項目で絞り込む
例：支出部門というフィールドの「開発部」という項目で絞り込みたい

2.　レコード作成日が最新から500件

## 2.トークンを作成する
APIからデータを取得する際には、トークンが必要なので、管理アカウントでトークンを発行します。上長に確認を取るといいでしょう。（[トークンの作成方法(cybozu)](https://developer.cybozu.io/hc/ja/articles/202463840-API%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)）

## 3. APIのURI・アプリ・パラメータの確認

・URIはこちら
https://(サブドメイン名).cybozu.com/k/v1/records.json

・アプリのIDの確認
　1. Kintoneのアプリを開く
　2. 開発者ツールでconsoleを開く
　3. 以下のコードを実行する
``` javascript
const appId = kintone.app.getId();
console.log(appId);
``` 
![スクリーンショット 2022-06-27 12.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614869/86368b02-74dc-4f41-3268-99a3b6106d22.png)
　4.表示されたアプリIDを後ほど、繋げます 
　　詳細は、公式ドキュメントをご覧ください（[cybozu](https://developer.cybozu.io/hc/ja/articles/202166300-%E3%82%A2%E3%83%97%E3%83%AAID%E5%8F%96%E5%BE%97)）

・リクエストパラメータを指定します。詳細はこちら→（[cybozu](https://developer.cybozu.io/hc/ja/articles/202331474-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8F%96%E5%BE%97-GET-)）

|  パラメータ名 |  指定する値  | 必須  |  説明  |
| ---- | ---- | ---- | ---- |
|  fields  |  文字列の配列  |省略可  |  レスポンスに含めるフィールドコードを指定します。省略した場合は、閲覧権限を持つすべてのフィールドの値が返されます。  |
|  app  |  数値又は文字列  |必須  |  アプリのID を指定します。  |
|  query  |  文字列  |省略可  |  レスポンスに含めるレコードの条件を指定するクエリ文字列です。 クエリ文字列内では、後述の演算子とオプションが使用できます。省略した場合は、閲覧権限を持つすべてのレコードが返されます。  |
|  totalCount  |  真偽値又は文字列  |省略可  |  「query」パラメータで指定した条件にあてはまるレコードの件数を取得する場合、「true」を指定します。 指定を省略した場合、レスポンスにはtotalCountの値としてnullが返されます。  |						

### パラメータメモ
`%%20desc%20limit%20500`　→５００件のレコードを降順で取得
`%E6%94%AF%E5%87%BA%E9%83%A8%E9%96%80+in+%28%22%E9%96%8B%E7%99%BA%E9%83%A8%22%29"`  　→支出部門というフィールドで、開発部を指定

わからなくなったら、エンコードしてくれるサイトを利用する（[エンコード⇄デコード](https://tech-unlimited.com/urlencode.html)）

## 4.　パラメータを繋げて、APIからデータを取得する	

``` bash
apykey=XXXXXXXXXXXX ##作成したトークンを入れています

curl -H "X-Cybozu-API-Token: $apikey" "https://サブドメイン.cybozu.com/k/v1/records.json?app=XXX&query=XXXXX%20desc%20limit%20500" |jq . > kintone500 
 # 一度、ファイルに吐き出します
```
## 5. 取得したデータを確認する
一部、わかりやすいようにテストデータをいじってます。
``` json
{
  "records": [
    {
      "支払先": {
        "type": "SINGLE_LINE_TEXT",
        "value": "ABC会社"
      },
      "レコード番号": {
        "type": "RECORD_NUMBER",
        "value": "1234"
      },
      "支払方法": {
        "type": "RADIO_BUTTON",
        "value": "クレジットカード"
      },
      "作成日時": {
        "type": "CREATED_TIME",
        "value": "2022-06-14T23:12:00Z"
      },
      "請求書データ": {
        "type": "FILE",
        "value": [
          {
            "fileKey": "abcdefg",
            "name": "請求書.pdf",
            "contentType": "application/pdf",
            "size": "100000"
          }
        ]
      },
      #中略
}

```

## 6. recordsだけを剥いて、別ファイルにする

``` bash
jq .records[] kintone500>records500
```

## 7. shellscriptを作成して、一覧を作る

簡単ですが、jsonで保存したレコードの`length`分回して、欲しいデータを変数に入れて、
最後に、`echo`して、`,(カンマ)`でつないでCSVデータにします。


```bash　Payment.sh
length=$(jq length records500)
nums=$(seq 0 $length)

for num in $nums
do
        payOption=$(jq .[$num].'"支払方法".value' records500)
        payReason=$(jq .[$num].'"支払内容".value' records500 )
        payTo=$(jq .[$num]'."支払先".value' records500 )
        invoice=$(jq .[$num]'."請求書データ".value[].name' records500 )
        dateReceived=$(jq .[$num]'. "請求書受領日".value' records500 )
        accountType=$(jq .[$num]'."勘定科目".value' records500 )

echo ${payTo},${payReason},${dateReceived},${payOption},${accountType},${invoice}>>payment.csv
done

```

## 8. 終わりに
今回は、パラメータのエンコードとデコードに混乱してしまいました。
ドキュメントに書かれているパラメータを、デコードしてから追加したいパラメータを作成する作業に骨が折れました。
しかし、普段使っている検索行為も、検索ワードがエンコードされてから検索されているという、インターネットの世界を垣間見れるいい勉強になりました。