【スケジューラ】環境省の環境データショーケースを利用してみる

今回は、環境省の環境データショーケースを[Sharperlight](https://sharperlight.jp/)を利用して取得、保存、レポート作成まで行っていこうと思います。
先ずは、[環境省の環境データショーケースのページ](https://showcase.env.go.jp/oas/)から必要な情報を得ます。

# データベースの準備 # 
初めに取得したデータを保管するデータベースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b476f88d-1c44-342b-618d-5425da41ec4c.png)
このようなデータベースとテーブルを準備します。環境省の環境データショーケースから取得したデータをここに保存してみます。
## 空データベースの作成 ##
Microsoft SQL Database Management Studioを使用して、お手持ちのデータベースサーバーに接続します。
新しいデータベースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/00117f75-7b3d-4ea7-ed0f-112647734163.png)
名称は"MinistryOfTheEnvironment"としました。
## テーブルの作成 ##
次にテーブルを今作成したデータベース内に作成します。
スキーマ情報が[環境省の環境データショーケースのページ](https://showcase.env.go.jp/oas/)に掲載されているので、それを利用します。
```
USE [MinistryOfTheEnvironment]
GO

/****** Object:  Table [dbo].[EnvironmentDataShowcase]    Script Date: 9/05/2023 3:49:30 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[EnvironmentDataShowcase](
	[Row_ID] [int] IDENTITY(1,1) NOT NULL,
	[bangou] [nvarchar](2000) NULL,
	[busshitsumei] [nvarchar](2000) NULL,
	[castourokubangou] [nvarchar](2000) NULL,
	[chosashurui] [nvarchar](2000) NULL,
	[jisshinendo_seireki] [nvarchar](2000) NULL,
	[jisshinendo_wareki] [nvarchar](2000) NULL,
	[kubun] [nvarchar](2000) NULL,
	[seibutsu_kairui_gyorui_chourui_purankuton_kenshutsuhani] [nvarchar](2000) NULL,
	[seibutsu_kairui_gyorui_chourui_purankuton_kenshutsukagenchi] [nvarchar](2000) NULL,
	[seibutsu_kentai_chousachitensuu] [nvarchar](2000) NULL,
	[seibutsu_kentai_kenshutsuchitensuu] [nvarchar](2000) NULL,
	[seibutsu_kentai_kenshutsusuu] [nvarchar](2000) NULL,
	[seibutsu_kentai_kentaisuu] [nvarchar](2000) NULL,
	[seibutsushu] [nvarchar](2000) NULL,
	[sokoshitsu(μg/g-dry)_kenshutsuhani] [nvarchar](2000) NULL,
	[sokoshitsu_chiten_chousachitensuu] [nvarchar](2000) NULL,
	[sokoshitsu_chiten_kenshutsuchitensuu] [nvarchar](2000) NULL,
	[sokoshitsu_kenshutsukagenchi] [nvarchar](2000) NULL,
	[sokoshitsu_kentai_kenshutsusuu] [nvarchar](2000) NULL,
	[sokoshitsu_kentai_kentaisuu] [nvarchar](2000) NULL,
	[sonota_kenshutsuhani] [nvarchar](2000) NULL,
	[sonota_kenshutsuhindo_chiten] [nvarchar](2000) NULL,
	[sonota_kenshutsuhindo_kentai] [nvarchar](2000) NULL,
	[sonota_kenshutsukagenchi] [nvarchar](2000) NULL,
	[suishitsu_chiten_chousachitensuu] [nvarchar](2000) NULL,
	[suishitsu_chiten_kenshutsuchitensuu] [nvarchar](2000) NULL,
	[suishitsu_kenshutsuhani] [nvarchar](2000) NULL,
	[suishitsu_kenshutsukagenchi] [nvarchar](2000) NULL,
	[suishitsu_kentai_kenshutsusuu] [nvarchar](2000) NULL,
	[suishitsu_kentai_kentaisuu] [nvarchar](2000) NULL,
	[taiki_chiten_chousachitensuu] [nvarchar](2000) NULL,
	[taiki_chiten_kenshutsuchitensuu] [nvarchar](2000) NULL,
	[taiki_kenshutsuhani] [nvarchar](2000) NULL,
	[taiki_kenshutsukagenchi] [nvarchar](2000) NULL,
	[taiki_kentai_kenshutsusuu] [nvarchar](2000) NULL,
	[taiki_kentai_kentaisuu] [nvarchar](2000) NULL,
 CONSTRAINT [PK_EnvironmentDataShowcase_Row_ID] PRIMARY KEY CLUSTERED 
(
	[Row_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
```

# Sharperlightコネクター(データモデル)の作成 #
Sharperlightとデータベースの会話を取持つコネクター(データモデル)を作成します。

Sharperlightアプリケーションメニューからスタジオを起動します。
新規アイコンをクリックして、新しいデータモデルを作成します。
`New Product`ダイアログが開くので、`Description`、`Unique Code`と`Target Platform`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/33134f03-a45d-f39e-d43a-1ebd1f8a8d23.png)
次に、データベース接続情報の入力ダイアログが表示されます。`サーバー名`、`初期カタログ名`を入力し、`接続テスト`ボタンで接続情報を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2e9844ca-0671-67b0-5a9f-edb8f9b76bc4.png)
接続が完了すると、”テーブルの情報をインポートしますか”という問い合わせダイアログが表示されるので、`Yes`で先に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/44668c29-e6a3-0052-14f4-b35899c2acba.png)
Import Objectsダイアログが表示されるので、`Get Tables`ボタンをクリックし、データベーススキーマの分析を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2dcc508d-40da-4876-e1df-f97a5b9eae86.png)
分析結果が表示されるので、必要な情報にはチェックを入れ`OK`ボタンでインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f2eeb7ed-0f86-3a26-e894-a45ee88c6089.png)
確認メッセージが表示されるので、`OK`ボタンで先に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d8bc6132-b256-f08a-0079-973f096ea4c7.png)
テーブルタブのテーブル情報が表示されるので、左端のテーブルツリーを編集します。
インポートしたテーブルが既定の`Other`フォルダーの下に作成されているので、`Table Display`直下に再配置したいと思います。
`Table Display`を選択し、右クリックメニューから**Move Tables**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/998af959-29ca-5a01-3313-1c16d580b935.png)
Tablesダイアログが表示されるので、対象テーブルにチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/99306f61-cf6e-8abb-4d63-f5ada4643b4c.png)
対象テーブルが`Table Display`直下に再配置されました。
`Other`フォルダーは必要なくなったので、右クリックメニューより**Delete Folder**を選択し削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/33e1c9c8-b1f9-3e22-98dd-92f38ef204df.png)
これでデータモデルの初期作成は終了。このような定義になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/96f5cedf-a531-d697-059d-e0eee93dfe4e.png)
保存アイコンで保存します。二つの注意事項が表示されますが`OK`ボタンで先に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c2a05f4f-b954-f2bb-66ea-19640a1ce538.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6c52d3d5-ac89-7149-d0ee-b1bdc1922721.png)
最後に、Sharperlightアプリケーションと作成したデータモデルさらにはデータベースの接続を設定しますかという問い合わせダイアログが表示されるので、`Yes`ボタンで許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9981f72c-59ef-9b87-7510-e8a57d98a09b.png)
**クライアントのセットアップ**ダイアログが起動するので、作成したデータモデル（ここではプロダクトと呼ぶ）と会話対象のデータベースの接続を完了させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ae7bdd5a-eb51-d6fc-ab48-270300cc1f7c.png)
以上で、Sharperlightコネクター（データモデル）の作成およびそれを介したSharperlightアプリケーション群とデータベースの接続設定が完了しました。

# 環境データショーケースからのデータの取得 #
データはREST APIにて提供されています。先ずAPIキーを[この](https://showcase.env.go.jp/opendata-api/)ページから申請しましょう。
また、[オープンデータAPI](https://showcase.env.go.jp/oas/)のページでは使用方法を確認できます。
今回は、JavaScriptを利用してREST APIサービスへのアクセス、データの取得およびデータベースへの保存を実行しようと思います。
そのJavaScriptコードは、Sharperlightスケジューラのタスクとして定義してみようと思います。
## Sharperlightスケジューラ ##
Sharperlightアプリケーションメニューからスケジューラを起動します。
### タスクの定義 ###
スケジューラダイアログの`新規`ボタンで新しいタスクの作成を始めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cf6ffa10-6dfb-8194-8382-88d330e142e5.png)
タスクダイアログが開いたら、**コード**、**グループ**および**説明**を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/579fe389-e55d-bdfe-c7ad-535817e36373.png)
更に、このタスクで使用する作業用フォルダを指定します。`{_Folder.Temp}`はSharperlightによって準備される作業用フォルダを参照するコントロールタグです。ここではタスクのパラメータ**WorkFolder**として作業用フォルダパスを渡しています。
ここで設定したタスクのパラメータは、後に定義する`アクション群`から参照できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/da9458c8-dc62-489c-b869-bc10b6939843.png)
### アクションの定義 ###
`アクション`タブに移動して実際に行う処理を定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5b02bd08-a502-3411-21e6-ead0ff6dc523.png)
右端に並んでいるアイコンから`新規`アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4805abab-2f2c-fa46-9460-111f5075158b.png)
#### JavaScriptアクションの作成 ####
アクション選択リストが表れるので、**JavaScript**アクションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5d26f09e-f1c1-fe0b-7ad2-a692f600e19f.png)
**JavaScript**アクションがこのように追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/65de9bc7-3f80-14ca-a32e-4f6f65e84c42.png)
`アクション`タブの下部にはスクリプトを記述するフィールドがこのように表示されます。
ここにJavaScriptでAPIサービスをコールし、取得したデータをデータベースに保存するコードを記述していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d99913c8-1850-cbd7-ef32-8b5453b8aafd.png)
直接記述するとこのような感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/43e6b67a-4e28-38c3-3b14-20e2ac09da64.png)
または、Visual Studio Codeなどのエディタでコードを記述してJSファイルとして保存します。
保存したJSファイルを`リソース`として読込み、そのリソースを参照することでJavaScriptコードをアクションに埋め込むことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/72920132-1028-a2d3-fef7-b052a9802e7e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/aebd2384-1b06-1f50-4c6e-0a1e7cce7ad3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8c3d8fe5-9713-0067-fdd4-d3d1d73f84f1.png)
#### テーブルをクリアするアクションの追加 ####
今回のデータに一意のコードを見つけることができなかったので、毎回タスクが実行される時には毎回データをテーブルから削除して、再度挿入するといった流れにします。よってJavaScriptアクションの前にテーブルをクリアするアクションを追加します。
このアクションには**SQLステートメント**アクションを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4938af90-ff4f-08f3-f5d4-b825481bd8ab.png)
**SQLステートメント**アクションの接続オプションには、クライアントのセットアップで定義した本データモデルと対象データベースの接続を使用するので、本データモデルのコード名を選択します。
又、実行するSQLステートメントを記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ec459e7f-0b08-ec64-d309-afa19b9ed7b2.png)
### タスクのテスト ###
以上で、アクションの作成は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7dbb591c-f78e-263b-4c32-37c2d38df9e2.png)
JavaScriptアクション単独のテスト及びデバッグを行いたい場合は、作成したJavaScriptアクションを選び、`接続テスト`ボタンでJavaScriptコードを実行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/29512e33-08c5-a01f-7c4b-35db944ce34f.png)
専用パネルが表示され、console.log('xxxx')コマンドの結果等を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/307ba38f-57ef-24c0-abab-9e9770c80d3a.png)
又、タスク全体のテストを行う場合は、タスクを`OK`ボタンで保存します。
スケジューラダイアログ上で本タスクを選択し、右クリックメニューから`実行`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/22471fb0-ef69-b762-cbbf-69febdd76a31.png)
実行中はこのようなメッセージが表示され、終了時に消えます。エラーが発生すると、エラーメッセージが表示されタスクの実行は中断されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8932df17-4de7-01b9-cfe9-c084abde91e1.png)
JavaScriptコード内で下記のようなSharperlight標準関数を利用してタスクの履歴を残すこともできます。
```
lib_task.LogMessage('ERROR',value);
lib_task.LogMessage('INFO',value);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e00879e8-3a11-bda3-6224-517b82c415ec.png)
### タスクのスケジューリング ###
提供されるデータが常に更新されているようであれば、タスクをスケジューリングすることで、データベース内のデータを常に最新のデータに更新することができます。デルタ更新等のテクニックを使用して無駄なく更新することもできます。
タスクの`トリガー`タブでスケジューリングを行います。
この例では、毎月1日にこのタスクを実行するようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/54d67621-ff31-16c2-2e1e-2aea57490dcc.png)
# データの確認 #
データは、指定したデータベースにこのように保存されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/860d3ff2-a077-dea5-1c8c-13adffc7ee71.png)
# レポーティング #
データモデルも作成済み、データはデータベースに保存済みということでSharperlightパブリッシャーやSharperlight Excelアドインを利用してレポートを作成してみます。
Excelの場合は、Sharperlightリボンのテーブル式アイコンでクエリビルダを起動してクエリを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b7a0cd80-49c3-bc62-7b36-0328627f7dcb.png)
実行するとシートに結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/53415b3d-7442-5619-bad1-4b9b8f01c22c.png)
更に、`Busshitsumei`でクエリ結果を絞り込めるように`Busshitsumei`をフィルターとして使用できるようにクエリーを更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/32535770-304c-2a13-8e6a-eb767840f09e.png)
こうすることでセルE2が`Busshitsumei`フィルターとして働くようになり、セルE2をクリックすると検索ウインドウが開きフィルター値を選べるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d67b2c53-45fb-5abf-f08d-828976ecf3d5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b4932a81-cfb8-0327-050f-6490e8e1cfe4.png)
# 日本語化 #
今のところクエリビルダに表示されるフィールド名は全てローマ字表記なので、データモデルのスキーマ定義を編集し、それらを日本語化します。
Sharoerlightアプリケーションメニューからスタジオを起動し、対象データモデルを開きます。
テーブル定義を開き、いくつかのフィールドの`Description`属性を日本語にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/36b58373-2ac2-37c6-ba46-47563db98ff9.png)
データモデルを保存し、再度Sharperlight Excelアドインにログインします。
クエリビルダを開き確認します。上手く日本語になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9bf9a18e-d8f5-521e-8f06-3e685160fc07.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ef935074-478d-b3c9-ad4a-a261e8cecb04.png)

参考：JavaScript 全コード
```
//***********************************************************************************
// API Request Header
// API リクエスト用のヘッダーを定義
const connections_url = "https://api.data.env.go.jp/api.rsc/kurohon/";
const headers = {
       'x-cdata-authtoken': 'ここにAPIキーを記述します',
       'Content-Type': 'application/json'  
};

//***********************************************************************************
// Prepare Working folder path
// 作業用フォルダパスの準備
const filePath = lib_task.ParamGet("WorkFolder");	    // 作業用フォルダパスをタスクのパラメータから取得する
filePath = filePath + "kankyo.json";                    // ファイル名を付加する
console.log(filePath);                                  
lib_task.LogMessage('INFO',"File Path: " + filePath);   // タスク履歴への出力


//***********************************************************************************
// Template of SQL Statement
// SQL INSERT文のテンプレート
var insertStatement = "insert into [dbo].[EnvironmentDataShowcase] (\r\n \
            [bangou], \r\n \
            [busshitsumei], \r\n \
            [castourokubangou], \r\n \
            [chosashurui], \r\n \
            [jisshinendo_seireki], \r\n \
            [jisshinendo_wareki], \r\n \
            [kubun], \r\n \
            [seibutsu_kairui_gyorui_chourui_purankuton_kenshutsuhani], \r\n \
            [seibutsu_kairui_gyorui_chourui_purankuton_kenshutsukagenchi], \r\n \
            [seibutsu_kentai_chousachitensuu], \r\n \
            [seibutsu_kentai_kenshutsuchitensuu], \r\n \
            [seibutsu_kentai_kenshutsusuu], \r\n \
            [seibutsu_kentai_kentaisuu], \r\n \
            [seibutsushu], \r\n \
            [sokoshitsu(μg/g-dry)_kenshutsuhani], \r\n \
            [sokoshitsu_chiten_chousachitensuu], \r\n \
            [sokoshitsu_chiten_kenshutsuchitensuu], \r\n \
            [sokoshitsu_kenshutsukagenchi], \r\n \
            [sokoshitsu_kentai_kenshutsusuu], \r\n \
            [sokoshitsu_kentai_kentaisuu], \r\n \
            [sonota_kenshutsuhani], \r\n \
            [sonota_kenshutsuhindo_chiten], \r\n \
            [sonota_kenshutsuhindo_kentai], \r\n \
            [sonota_kenshutsukagenchi], \r\n \
            [suishitsu_chiten_chousachitensuu], \r\n \
            [suishitsu_chiten_kenshutsuchitensuu], \r\n \
            [suishitsu_kenshutsuhani], \r\n \
            [suishitsu_kenshutsukagenchi], \r\n \
            [suishitsu_kentai_kenshutsusuu], \r\n \
            [suishitsu_kentai_kentaisuu], \r\n \
            [taiki_chiten_chousachitensuu], \r\n \
            [taiki_chiten_kenshutsuchitensuu], \r\n \
            [taiki_kenshutsuhani], \r\n \
            [taiki_kenshutsukagenchi], \r\n \
            [taiki_kentai_kenshutsusuu], \r\n \
            [taiki_kentai_kentaisuu]) \r\n \
        VALUES (\r\n \
            '<<bangou>>', \r\n \
            '<<busshitsumei>>', \r\n \
            '<<castourokubangou>>', \r\n \
            '<<chosashurui>>', \r\n \
            '<<jisshinendo_seireki>>', \r\n \
            '<<jisshinendo_wareki>>', \r\n \
            '<<kubun>>', \r\n \
            '<<seibutsu_kairui_gyorui_chourui_purankuton_kenshutsuhani>>', \r\n \
            '<<seibutsu_kairui_gyorui_chourui_purankuton_kenshutsukagenchi>>', \r\n \
            '<<seibutsu_kentai_chousachitensuu>>', \r\n \
            '<<seibutsu_kentai_kenshutsuchitensuu>>', \r\n \
            '<<seibutsu_kentai_kenshutsusuu>>', \r\n \
            '<<seibutsu_kentai_kentaisuu>>', \r\n \
            '<<seibutsushu>>', \r\n \
            '<<sokoshitsu(μg/g-dry)_kenshutsuhani>>', \r\n \
            '<<sokoshitsu_chiten_chousachitensuu>>', \r\n \
            '<<sokoshitsu_chiten_kenshutsuchitensuu>>', \r\n \
            '<<sokoshitsu_kenshutsukagenchi>>', \r\n \
            '<<sokoshitsu_kentai_kenshutsusuu>>', \r\n \
            '<<sokoshitsu_kentai_kentaisuu>>', \r\n \
            '<<sonota_kenshutsuhani>>', \r\n \
            '<<sonota_kenshutsuhindo_chiten>>', \r\n \
            '<<sonota_kenshutsuhindo_kentai>>', \r\n \
            '<<sonota_kenshutsukagenchi>>', \r\n \
            '<<suishitsu_chiten_chousachitensuu>>', \r\n \
            '<<suishitsu_chiten_kenshutsuchitensuu>>', \r\n \
            '<<suishitsu_kenshutsuhani>>', \r\n \
            '<<suishitsu_kenshutsukagenchi>>', \r\n \
            '<<suishitsu_kentai_kenshutsusuu>>', \r\n \
            '<<suishitsu_kentai_kentaisuu>>', \r\n \
            '<<taiki_chiten_chousachitensuu>>', \r\n \
            '<<taiki_chiten_kenshutsuchitensuu>>', \r\n \
            '<<taiki_kenshutsuhani>>', \r\n \
            '<<taiki_kenshutsukagenchi>>', \r\n \
            '<<taiki_kentai_kenshutsusuu>>', \r\n \
            '<<taiki_kentai_kentaisuu>>');";


        
//***********************************************************************************
// Making Request to the API
// API リクエスト
var response = lib_sys.urlContent.Get(connections_url, '', headers);    // Sharperlight標準関数を使用する
lib_sys.io.file.WriteAllText(filePath, response);                       // 結果をファイルの保存


//***********************************************************************************
// Saving the fetched data to the database
// 保存したファイルを読んで、データをデータベースに書き込む
// 保存したファイルの読込
var fileReady = true;
try {
    var file = lib_sys.io.file.ReadAllText(filePath);                   // Sharperlight標準関数を使用する
} catch (err) {
    console.log("Error: Couldn't read the file");
    lib_task.LogMessage('ERROR',"Couldn't read the file");              // タスク履歴への出力
    fileReady = false;
}


//***********************************************************************************
// データベースへの書込み
if (fileReady){
    var fileContent = JSON.parse(file);
    var recs = fileContent["value"];

    for (var r=0; r<recs.length; r++){
        console.log("bangou: " + recs[r].bangou);
        if (lib_task.state.abort ) { break; }

        var sqlStatement = '';
        
        var ins = insertStatement.replace('<<bangou>>', recs[r].bangou);
        ins = ins.replace('<<busshitsumei>>', recs[r].busshitsumei.replace(/[&<>"'\/]/g));
        ins = ins.replace('<<castourokubangou>>', recs[r].castourokubangou);
        ins = ins.replace('<<chosashurui>>', recs[r].chosashurui);
        ins = ins.replace('<<jisshinendo_seireki>>', recs[r].jisshinendo_seireki);
        ins = ins.replace('<<jisshinendo_wareki>>', recs[r].jisshinendo_wareki);
        ins = ins.replace('<<kubun>>', recs[r].kubun);
        ins = ins.replace('<<seibutsu_kairui_gyorui_chourui_purankuton_kenshutsuhani>>', recs[r].seibutsu_kairui_gyorui_chourui_purankuton_kenshutsuhani);
        ins = ins.replace('<<seibutsu_kairui_gyorui_chourui_purankuton_kenshutsukagenchi>>', recs[r].seibutsu_kairui_gyorui_chourui_purankuton_kenshutsukagenchi);
        ins = ins.replace('<<seibutsu_kentai_chousachitensuu>>', recs[r].seibutsu_kentai_chousachitensuu);
        ins = ins.replace('<<seibutsu_kentai_kenshutsuchitensuu>>', recs[r].seibutsu_kentai_kenshutsuchitensuu);
        ins = ins.replace('<<seibutsu_kentai_kenshutsusuu>>', recs[r].seibutsu_kentai_kenshutsusuu);
        ins = ins.replace('<<seibutsu_kentai_kentaisuu>>', recs[r].seibutsu_kentai_kentaisuu);
        ins = ins.replace('<<seibutsushu>>', recs[r].seibutsushu);
        ins = ins.replace('<<sokoshitsu(μg/g-dry)_kenshutsuhani>>', recs[r]['sokoshitsu(μg/g-dry)_kenshutsuhani']);
        ins = ins.replace('<<sokoshitsu_chiten_chousachitensuu>>', recs[r].sokoshitsu_chiten_chousachitensuu);
        ins = ins.replace('<<sokoshitsu_chiten_kenshutsuchitensuu>>', recs[r].sokoshitsu_chiten_kenshutsuchitensuu);
        ins = ins.replace('<<sokoshitsu_kenshutsukagenchi>>', recs[r].sokoshitsu_kenshutsukagenchi);
        ins = ins.replace('<<sokoshitsu_kentai_kenshutsusuu>>', recs[r].sokoshitsu_kentai_kenshutsusuu);
        ins = ins.replace('<<sokoshitsu_kentai_kentaisuu>>', recs[r].sokoshitsu_kentai_kentaisuu);
        ins = ins.replace('<<sonota_kenshutsuhani>>', recs[r].sonota_kenshutsuhani);
        ins = ins.replace('<<sonota_kenshutsuhindo_chiten>>', recs[r].sonota_kenshutsuhindo_chiten);
        ins = ins.replace('<<sonota_kenshutsuhindo_kentai>>', recs[r].sonota_kenshutsuhindo_kentai);
        ins = ins.replace('<<sonota_kenshutsukagenchi>>', recs[r].sonota_kenshutsukagenchi);
        ins = ins.replace('<<suishitsu_chiten_chousachitensuu>>', recs[r].suishitsu_chiten_chousachitensuu);
        ins = ins.replace('<<suishitsu_chiten_kenshutsuchitensuu>>', recs[r].suishitsu_chiten_kenshutsuchitensuu);
        ins = ins.replace('<<suishitsu_kenshutsuhani>>', recs[r].suishitsu_kenshutsuhani);
        ins = ins.replace('<<suishitsu_kenshutsukagenchi>>', recs[r].suishitsu_kenshutsukagenchi);
        ins = ins.replace('<<suishitsu_kentai_kenshutsusuu>>', recs[r].suishitsu_kentai_kenshutsusuu);
        ins = ins.replace('<<suishitsu_kentai_kentaisuu>>', recs[r].suishitsu_kentai_kentaisuu);
        ins = ins.replace('<<taiki_chiten_chousachitensuu>>', recs[r].taiki_chiten_chousachitensuu);
        ins = ins.replace('<<taiki_chiten_kenshutsuchitensuu>>', recs[r].taiki_chiten_kenshutsuchitensuu);
        ins = ins.replace('<<taiki_kenshutsuhani>>', recs[r].taiki_kenshutsuhani);
        ins = ins.replace('<<taiki_kenshutsukagenchi>>', recs[r].taiki_kenshutsukagenchi);
        ins = ins.replace('<<taiki_kentai_kenshutsusuu>>', recs[r].taiki_kentai_kenshutsusuu);
        ins = ins.replace('<<taiki_kentai_kentaisuu>>', recs[r].taiki_kentai_kentaisuu);

        sqlStatement = ins;
        try{
            lib_app.sql.Execute(lib_task.UserSessionIdGet(),'MOEJP', sqlStatement); // Sharperlight標準関数を使用する
        }catch (err){
            console.log(err.message);
            lib_task.LogMessage('ERROR',"SQL: " + err.message); // タスク履歴への出力
        }
    }
}
```