---
title: カスタム処理を利用して、CSV出力されるデータ構造を変更する
category: オペレーション
weight: 1
---

## 概要
カスタム処理を使用して、APIが標準で出力するデータを加工できます。
今回は、CSV形式で出力される記事一覧データに管理画面編集ページへのURLを追加します。
![Image from Gyazo](https://t.gyazo.com/teams/diverta/a0d1d3b99b1a62aa587fb09570461c03.png)

### 学べること
APIを利用したCSV出力を以下の手順で加工します。
- [カスタム処理を作成する](#カスタム処理を作成する)
- [エンドポイントにカスタム処理を登録する](#エンドポイントにカスタム処理を登録する)

### 前提条件
このチュートリアルでは、コンテンツ一覧のエンドポイントに後処理でカスタム処理を適用し、対象のエンドポイントがCSV形式でレスポンスを返した場合にカスタム処理を実行します。  
エンドポイントからCSV形式でレスポンスを得る方法は以下のドキュメントを参照ください。  
- [APIをJSON以外のフォーマットでレスポンスできますか？](/ja/docs/faq/how-can-i-response-csv-format)

## カスタム処理を作成する
それではカスタム処理を作成します。

### 1. カスタム処理の一覧画面を表示する  
メニューの[オペレーション] -> [カスタム処理] をクリックします。 
![Image from Gyazo](https://t.gyazo.com/teams/diverta/05fc571fc550915a05f0c13d0508e9f6.png)

### 2. カスタム処理の編集画面を表示する 
カスタム処理一覧画面の右上の [追加] をクリックします。 
![Image from Gyazo](https://t.gyazo.com/teams/diverta/9998b0797d2ae3e08dd1c0ffde72420c.png)

すると、カスタム処理編集画面が表示されます。 
![Image from Gyazo](https://t.gyazo.com/teams/diverta/fcc8d76f9247345f734858139362b6cf.jpg)

![Image from Gyazo](https://t.gyazo.com/teams/diverta/ce36fad667a7f35efa0bc8d5f6dc3e74.jpg)

### 3. タイトル・識別子を記入する
それではカスタム処理を作成していきます。  
まずはタイトルと識別子に記入します。今回は下記のように記入します。

- タイトル：コンテンツCSV編集
- 識別子：sample1_postprocess
- トリガー: 未指定

:::tip
タイトル・識別子は他のカスタム処理と重複できません。
実装対象のエンドポイント名など、他と重複しない内容で記入してください。
:::

![Image from Gyazo](https://t.gyazo.com/teams/diverta/316c33b217f6cb89e108821fb74f25e8.png)

### 4. データ操作処理を記述する
次に、実際の処理を記述します。

エディタ内にデータを追加する処理を記述していきます。

**コンテンツIDを取得する処理を記述する**  
まずは、コンテンツIDを取得するためにヘッダー行を読み取ります。  

利用できる変数は下記となります。

| 変数名 | 型 | 説明
| :--- | :--- | :--- |
|$json.csv_data |object |コンテンツデータ|

エディタに下記記入します。

```smarty
{assign_array var=processed_list values=""}

{* CSVの場合 *}
{if $json.csv_data}
    {foreach from=$json.csv_data item=row name=csv_data}
        {if $smarty.foreach.csv_data.index eq 0}{* ヘッダー行 *}
            {foreach from=$row item=header_title name=header_data}
                {if $header_title eq 'コンテンツID'}
                    {* コンテンツID列を取得 *}
                    {assign var=contents_id_col_index value=$smarty.foreach.header_data.index}
                {/if}
            {/foreach}
            {append var=row value="編集ページURL"}
        {else}{* データ *}
            {assign var=url value=$smarty.const.ROOT_MNG_URL|cat:'/management/topics/topics_edit/?topics_id='|cat:$row.$contents_id_col_index}
            {append var=row value=$url}
        {/if}
        {append var=processed_list value=$row}
    {/foreach}
    {assign var=json.csv_data value=$processed_list}
{/if}
```

![Image from Gyazo](https://t.gyazo.com/teams/diverta/e6c4bb3a588384b6af520717d4f4206e.png)

**編集したデータを出力する**  

| 変数名 | 型 | 説明
| :--- | :--- | :--- |
|$processed_json |object |コンテンツデータ|

```smarty
{assign var=processed_json value=$json}
```

![Image from Gyazo](https://t.gyazo.com/teams/diverta/96daec2f0dfa4d15f8511b0081babba7.png)

### 6. カスタム処理を保存する 
処理の記述が完了したら、[追加する] ボタンをクリックして保存します。  

![Image from Gyazo](https://t.gyazo.com/teams/diverta/2c408c383626b5ed0fe76e0ff3ee90b5.png)
以上でカスタム処理の完成です。

## エンドポイントにカスタム処理を登録する
作成したカスタム処理をエンドポイントの後処理に追加します。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/acfbbdf901602d7c17f523da04f43867.png)

詳しくは、[API後処理](/ja/docs/management/api-postprocessing/)を参照してください。

## 動作確認
以下の手順で動作確認をします。  

### 1. CSVファイルをダウンロードする。  
設定したカスタム処理はCSVで出力した場合に動作するので、`_output_format=csv`のクエリパラメータを付けてエンドポイントにアクセスします。
上記でカスタム処理を登録したAPIエンドポイントへアクセスし、CSVファイルをダウンロードします。
`https://[サイトキー].g.kuroco.app/rcms-api/**/topics/download?topics_group_id=**&_output_format=csv`  

以下3点はご自身のサイトのものを入力してください。  
- `https://[サイトキー].g.kuroco.app`  
  サイトのAPIドメインを入力して下さい。  
  [環境設定] > [アカウント設定]の画面で確認ができます。
  ![Image from Gyazo](https://t.gyazo.com/teams/diverta/1a2ad3982ce6e56971e74c63c3d717e0.png)

- `/rcms-api/**/topics/download`  
  [エンドポイントにカスタム処理を登録する](#エンドポイントにカスタム処理を登録する)のステップでカスタム処理を登録したAPIエンドポイントを入力して下さい。  

- `topics_group_id=**`  
  一覧にしたいコンテンツ定義のIDを`**`に入力して下さい。IDはコンテンツ定義一覧の画面から確認できます。
  ![Image from Gyazo](https://t.gyazo.com/teams/diverta/724b673e5e6e60d55c26525a08b7d4c2.png)

### 2. ファイルの内容を確認する。
CSVがUTF-8で保存されるので、メモ帳で開く、もしくはエクセルでインポートして、「編集ページURL」の列が追加されていることを確認します。  
![Image from Gyazo](https://t.gyazo.com/teams/diverta/2ccf5352ffa8a65d3512eb62669b8187.jpg)

![Image from Gyazo](https://t.gyazo.com/teams/diverta/ceba2a9e334b5057b28fa3fda9ca03a1.png)

以上で本チュートリアルは完了です。

## 注意点
出力するデータが大きくなる場合、メモリオーバーエラーやタイムアウトの発生する可能性があります。
この場合はバッチ処理化をご検討ください。

## 関連ドキュメント
- [API後処理](/ja/docs/management/api-postprocessing/)
- [バッチ処理を使用して、CSVで日次データを保存する](/ja/docs/tutorials/how-to-implement-batch-function-exports-csv/)
- [APIをJSON以外のフォーマットでレスポンスできますか？](/ja/docs/faq/how-can-i-response-csv-format)