Workato：EDINETコードリストをWorkatoで活用する（Workatoの様々な機能を活用しながら）

# はじめに

EDINET（Electronic Disclosure for Investors' NETwork）は、金融庁が運営する「金融商品取引法に基づく有価証券報告書等の開示書類に関する電子開示システム」です。EDINETを利用すると、有価証券報告書のダウンロード（閲覧）を行うことが出来ます（APIも提供されていますが、ここでは触れません）。

また、EDINETでは上場企業や一部非上場企業の会社情報を「EDINETコードリスト」として提供しています。EDINETコードリストでは、企業の名称や所在地だけでなく、上場・非上場、資本金、決算日、業種、法人番号など、営業上非常に有益な情報を取得することができます。

Workatoを利用すると、非常に簡単かつ迅速に「EDINETコードリスト」と自社システムの連携を実現することができます。例えば、自社の顧客データベース（CRM等）を組み合わせることで、顧客データベースの価値をより高めていただけます。

今回は、サンプルレシピをもとにWorkatoを利用してEDINETコードリストを取得する手順を説明します。

また、このページでは
- 「HTTP」コネクタによるファイルダウンロード
- 「File tools by Workato」コネクタによるZIPファイルの展開（解凍）
-  関数（formula）による文字コード変換とCSV加工（不要なヘッダ行の除外）
-  「SQL Collection by Workato」による一時テーブルの作成とSQL実行による効率的なデータ処理
- Whileループによる効率的なループ処理

にも触れていますので、これらの機能や手順に関心のある方も是非参考としていただければ幸いです。


# 手順

## 1. EDINETコードリストのCSVダウンロード先URLの確認

EDINETコードリストのCSVダウンロード先URLは、以下のPDFより確認することが出来ます。
静的なURLが提供されていますので、そちらのURLを利用することで簡単にダウンロードして利用することが可能です。（P21に記載されています）

https://disclosure2dl.edinet-fsa.go.jp/guide/EFT013/230501K0001/2/%E8%AA%AC%E6%98%8E%E4%BC%9A%E8%B3%87%E6%96%99.pdf

EDINETコードリストのCSVダウンロード方法については、Google等で検索すると、RPAやブラウザオートメーション（SeleniumやPuppeteerなど）を利用してダウンロードする方法を多く見かけますが、**RPAやブラウザオートメーションによるダウンロードは不要です。**

なお、EDINETで公開されている情報は、利用規約に沿った利用であれば、商用・非商用いずれも自由に利用可能とされています。

https://disclosure2dl.edinet-fsa.go.jp/guide/static/submit/WZEK0030.html

## 2.　レシピ作成

EDINETコードリストの内容をWorkatoのLookup Tablesへセットする（実行ごとにLookup TablesはTruncateして初期化する）レシピを作成してみました。作成したレシピの内容は、次の通りとなります。

:::note warn
結果セット先のLookup tablesは予め用意されていることを前提とします。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/787775f7-aa36-081f-f602-3e075c84c23b.png)


### Step 1：スケジュール実行

「Scheduler by Workato」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/44611902-50a6-c05e-279b-73aab2f2ae6d.png)

毎週日曜日 0:00（日本時刻）に実行する場合は、次のような設定になります。

::: note warn
予期しない時刻に実行されないよう、Timezoneを `Asia/Tokyo` に設定することを強く推奨します。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c65753c6-9b56-65b4-d14d-00ab1387df7e.png)

### Step 2：ファイルダウンロード

「HTTP」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/7018663e-05c2-0cac-2814-29cdf392921a.png)

「Send request」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b4f5b41a-460d-88fb-e79d-03b2571780ca.png)

以下の項目を設定します。（それ以外はデフォルトのままとします）
- Request name：任意の名称
- Request
  - Method：GET
  - Request URL：EDINETコードリスト（CSVファイル）のURL
- Response
  - Response content type：Binary


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/fbc25302-ee44-96ab-5b3f-4cf75d6bfb56.png)

### Step 3：ZIPファイルを展開（解凍）

「File tools by Workato」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b213cebb-d026-3a21-47a5-5fc49ab011b6.png)

「Uncompress a file」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8b15a7c1-41ba-3bff-b3a6-1551cf75236d.png)

以下の項目を設定します。（それ以外はデフォルトのままとします）
- Compression format：Zip
- File contents：Step2の `<Body>`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ae3ab54a-bebe-e22b-48a1-bca46375fd0b.png)

### Step 4：CSVファイルの整形（不要行の削除）

「Variables by Workato」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/08dda41d-eec2-5913-6f66-db73b9a93e01.png)

「Create variable」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8d2060f1-b4f7-e76e-bd91-68359a564983.png)

「csv」というString型のフィールドを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e875a5aa-1e49-ef6e-e862-3a7a43241d89.png)


Variables に以下の値をセットします。
`<File Contents>` には、Step3の `File contents` をセットします。

```ruby
<File Contents>.as_string('cp932').split("\n").drop(1).drop(2).join("\n").strip
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0f88baf6-8b2e-c362-b198-d9766b433b25.png)

### Step 5：CSVを一時DBにセット

「SQL Collection by Workato」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/90059f09-0757-8e8a-3a0d-abd77069e2c1.png)

「Create list from CSV file」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/873aaed7-d739-5570-ce11-96aaaea68b03.png)

以下の項目を設定します。（それ以外はデフォルトのままとします）

- CSV source：Step 4の `<CSV>` 
- List name：edinet　※ここでセットした値はSQL実行時のテーブル名となります
- File encoded type：UTF-8
- Column names：以下のフィールドを追加（全てString型、この順番でセット）
  - edinet_code　→ＥＤＩＮＥＴコード
  - filer_type　→提出者種別
  - listed_unlisted　→上場区分
  - consolidation_basis　→連結の有無
  - capital_stock　→資本金
  - fiscal_year_end　→決算日
  - name　→提出者名
  - name_en　→提出者名（英字）
  - name_kana　→提出者名（ヨミ）
  - location　→所在地
  - industry　→提出者業種
  - security_code　→証券コード
  - corporate_number　→提出者法人番号
- Ignore CSV header row：false
- Column delimiter：comma

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c2614c6f-566e-6d3d-dfe9-91aa588e3b01.png)


### Step 6：変数を初期化、初期値セット

「Variables by Workato」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/08dda41d-eec2-5913-6f66-db73b9a93e01.png)

「Create variable」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8d2060f1-b4f7-e76e-bd91-68359a564983.png)

以下のフィールドを追加します。（全てinteger型）

- page_current
- page_total
- offset

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/89780568-4b4e-83b3-9cdd-aa56752e2e3d.png)


Variables に以下の値をセットします。

- page_current： 0
- page_total： formulaモードに切り替え、 `(<Row count> / 10000).ceil`をセット　※`<Row count>`はStep 5より選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d14f33b9-c664-56b0-366e-ef11ad1b0834.png)

### Step 7,8：Lookup TablesのTruncate

「Lookup tables by Workato」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/92568b67-84df-e30e-6039-4fab11c94410.png)

「Truncate table」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/271fb159-2387-94f4-4fba-e132b17d5199.png)

Truncateするテーブルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/48c3069b-3ddc-d19e-e50f-8527e65e8d22.png)

### Step 9：Whileループを追加

::: note info
Workatoでは、2024年2月にWhileループに対応しました。これまではForEachループのみの対応でしたが、Whileループの対応により、特定の条件に応じてループを抜けるという処理が実装できるようになりました。
:::

https://www.linkedin.com/pulse/workato-repeat-while-loop-yathi-raj-koppisetty-2rs3f/

https://docs.workato.com/recipes/loops.html

WorkatoのBatchで処理可能なレコード数は最大10,000件です。しかし、EDINETコードリストは10,000件を超えるCSVファイルであるため、そのままLookup tablesへ追加しようとするとエラーになります。よって、1回の追加処理が最大10,000件となるように、CSVのレコードを分割で取得しながらLookup tablesにその結果を追加していく必要があります。

全ての件数の処理が完了するまでループさせたい場合は、最近追加されたWhileループを活用すると、簡単かつ効率的なループ処理を実装することができます。

「＋」アイコンをクリックし、「Repeat while」をクリックします。

![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f689cfd7-b42b-08bb-e34d-a4be0720bef6.gif)

### Step 10：SQL実行

「SQL Collection by Workato」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/90059f09-0757-8e8a-3a0d-abd77069e2c1.png)

「Query lists」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/682047a3-63ab-da10-18cb-5570d818ee20.png)


以下の項目を設定します。（それ以外はデフォルトのままとします）
- SQL query: `select * from edinet limit 10000 offset <offset>` ※`<offset>`は、Step 6より選択します
- Output list schema：Step 5のColumn namesと同じ設定を行います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b1e6614c-732d-8229-22d1-150242328b8e.png)

### Step 11：変数の更新

「Variables by Workato」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/08dda41d-eec2-5913-6f66-db73b9a93e01.png)

「Update variables」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/df90158f-469e-6d22-3912-dca3fbd42879.png)

Variable nameをクリックし、「page_current」と「offset」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9a9ea496-e5c3-533d-4c00-dd51fc6d2feb.png)

「page_current」と「offset」をformulaモードに切り替え、次の通り設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0c2f57e5-f329-9c16-d69e-1438abf7a170.png)

- page_current： `<page_current> + 1` ※page_currentはStep 6より選択
- offset： `<offset> + 10000` ※offsetはStep 6より選択


### Step 12, 13：Lookup tablesへの追加

「Lookup tables by Workato」コネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/92568b67-84df-e30e-6039-4fab11c94410.png)

「Add entries」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/35ce581a-78e5-d2b7-b19e-1d31e62869e8.png)

「Entries source type」へ、Step 10の「Rows」をセットします。

「Entry fields」へ、Step 10の各項目より対応するものをセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/437180e8-f216-5fc1-4a39-baf2ccf73385.png)


### Step 14：Whileループの条件設定

次の通り設定します。

- Data field： `<page_current>` ※Step 6の「page_current」
- page_total： `<page_total>` ※Step 6の「page_total」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6c995cd6-caff-c6ea-9f02-12c519387e9c.png)

# 実行結果の例

このレシピを実行すると、Lookup tablesに次のような形で結果がセットされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d0fa5ba8-40ba-5ef3-6c97-49fee940aeca.png)