[FileMaker Pro]法人の真正を確認する

 インボイス制度が始まり、取引相手の法人が真正であるか（商業法人登記されていて実在するのか）ということが重要になってきました。また、その他の契約、EC での BtoB その他の取引で相手の真正を確認したい場面は多々あります。そこで、国税庁の**法人番号システム Web-API** を使おうという発想です。
 
 また、インボイスの適格事業者登録番号は、法人番号の先頭に `T` が付くだけですし、法務省の商業登記会社番号は、国税庁の法人番号の先頭の一桁を取り除けばいいだけなので、取引先の各種番号を調べるということにも使用できます。
 
 今回は、FileMaker Pro で、法人検索を行なって、Google Map で本店所在地を表示するということをやってみたいと思います。

## 法人番号システム Web-API の使用

 法人番号システム Web-API の使用する場合、アプリケーション ID の取得が必要になります。インボイス制度開始後、従来の法人番号システムWeb-API アプリケーション ID と、新たにインボイス Web-API のアプリケーション ID の発行が開始されています。
 今回は、インボイス Web-API ではなく、法人番号システムWeb-API アプリケーション ID を使用します。

 申請〜取得には、結構、時間がかかりますが、[適格請求書発行事業者公表システムWeb-API機能](https://www.invoice-kohyo.nta.go.jp/web-api/index.html#cmsprereg) に申請手順が書かれているので、アプリケーション ID を取得してください。

 何らかの事情で、アプリケーション ID が取得できない場合は、前月末までのデータをダウンロードして利用することができます。（[基本３情報ダウンロード](https://www.houjin-bangou.nta.go.jp/download/) ）
 こちらを利用して、法人検索をすることも可能です。

## 計画
![スクリーンショット 2025-03-08 8.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833520/9d1ae418-49d8-42cc-835b-95edc1833633.png)

 今回は、簡単に、以下のような構成にしたいと思います。
 - 検索キーワードを入力するフィールド
 - 結果を表示するポータル
 - ポータルから1行を選択して表示する Web ビューアを使った Google Map

 ## テーブル

  これだけなら、１テーブルで可能ですが、将来の拡張を考えて、テーブルを２つに分けておきます。

  FileMaker Pro のグローバルフィールドは、どこに存在していても見えるわけですが、あるテーブルに存在しなければならないものを除いて、ユーティリティテーブルにまとめておいた方が管理しやすいですが、ユーティリティテーブルは非関連テーブルで、個人的にレイアウトモードで思考の妨げになるので、固定の ID を振ってしまって、関連テーブルにしてしまっています。
  今回はやりませんが、この関連したユーティリティテーブルは、他の用途にも使えるので、普段の私のスタイルで作ってしまうことを予めご了承ください。

  ユーティリティテーブルは以下のようにします。
<table>
    <caption>Sessions</caption>
    <thead>
    <tr>
        <th scope="col">フィールド名</th>
        <th scope="col">フィールドタイプ</th>
        <th scope="col">式/入力オプション</th>
    </tr>
    </thead>
    <tbody>
        <tr>
          <td>Session_uuid</td>
          <td>テキスト</td>
          <td>自動入力「F979243B-5F9C-4F7C-BF5C-6294FDC9AFFB」, 自動入力データの変更禁止,空欄不可, ユニークな値</td>
        </tr>
        <tr>
          <td>g_GoogleMapAddress</td>
          <td>テキスト</td>
          <td>グローバル</td>
        </tr>
        <tr>
          <td>g_GoogleMapKeyword</td>
          <td>テキスト</td>
          <td>グローバル</td>
        </tr>
        <tr>
          <td>g_TemporaryText</td>
          <td>テキスト</td>
          <td>グローバル</td>
        </tr>
    </tbody>
</table>

 ここで、今回のシステムに本当に必要なのは、g_GoogleMapAddress、g_GoogleMapKeyword、g_TemporaryText だけです。
 Session_uuid の値は、何でも構いませんが、ユーティリティテーブルと関連させたいテーブルには、どちらかを同じ値で持っておく必要があります。

  検索結果を一時的に保存するテーブルは以下のようにします。
<table>
    <caption>TemporaryCorporate</caption>
    <thead>
    <tr>
        <th scope="col">フィールド名</th>
        <th scope="col">フィールドタイプ</th>
        <th scope="col">式/入力オプション</th>
    </tr>
    </thead>
    <tbody>
        <tr>
          <td>TemporaryCorporate_uuid</td>
          <td>テキスト</td>
          <td>Get( UUID ), 既存値を置き換え, 自動入力データの変更禁止, 空欄不可, ユニークな値</td>
        </tr>
        <tr>
          <td>Session_uuid</td>
          <td>テキスト</td>
          <td>自動入力「F979243B-5F9C-4F7C-BF5C-6294FDC9AFFB」,自動入力データの変更禁止, 空欄不可</td>
        </tr>
        <tr>
          <td>CorporateNumber</td>
          <td>テキスト</td>
          <td>国税庁法人番号</td>
        </tr>
        <tr>
          <td>CorporateNameRaw</td>
          <td>テキスト</td>
          <td>法人名（国税庁形式）</td>
        </tr>
        <tr>
          <td>CorporateNameCustomApp</td>
          <td>テキスト</td>
          <td>法人名（カスタム App用）</td>
        </tr>
        <tr>
          <td>CorporateKind</td>
          <td>テキスト</td>
          <td>法人種別</td>
        </tr>
        <tr>
          <td>PrefectureName</td>
          <td>テキスト</td>
          <td>都道府県</td>
        </tr>
        <tr>
          <td>CityName</td>
          <td>テキスト</td>
          <td>市区町村</td>
        </tr>
        <tr>
          <td>StreetNumber</td>
          <td>テキスト</td>
          <td>番地</td>
        </tr>
        <tr>
          <td>PrefectureCode</td>
          <td>テキスト</td>
          <td>地方公共団体コード（都道府県コード）</td>
        </tr>
        <tr>
          <td>CityCode</td>
          <td>テキスト</td>
          <td>地方公共団体コード（市区町村コード）</td>
        </tr>
        <tr>
          <td>PostalCode</td>
          <td>テキスト</td>
          <td>郵便番号</td>
        </tr>
        <tr>
          <td>Furigana</td>
          <td>テキスト</td>
          <td>ふりがな</td>
        </tr>
    </tbody>
</table>

 テーブルオカレンスとリレーションシップグラフは、最初にできているものを複製し、以下のようにします。
![スクリーンショット 2025-03-08 9.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833520/c92ff2e0-d6a1-4830-b81c-b2c5296dfc97.png)

 テーブルオカレンス `_CORPORATESEARCH` のベーステーブルは、`Sessions` です。

## レイアウト

 レイアウトは、お好みのものを作成すれば良いですが、以下のようにしました。
![スクリーンショット 2025-03-08 9.27.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833520/d82c15d1-f3cf-4670-8096-8ed3df9de904.png)

  レイアウトのテーブルオカレンスは、`_CORPORATESEARCH` です。すなわち、`Sessions` です。

 `Sessions` のグローバルフィールド `g_TemporaryText` を検索キーワード用にして、スクリプトトリガ `OnObjectSave` で、検索用のスクリプトを起動するようにしています。
 このとき、引数として、検索キーワードを持たせています。
```.calc:オプションのスクリプト引数
JSONSetElement (
	"{}" ;
	[ "searchString" ; _CORPORATESEARCH::g_TemporaryText ; JSONString ]
)

```

　ポータルのテーブルオカレンスは、`_TEMPORARYCORPORATE` で、`TemporaryCorporate` がベーステーブルです。
 ここでは、法人番号、カスタム App 用法人名、都道府県、市区町村のみを配しました。各行に、「地図」ボタンを置いて、こちらはアクションで Google Map 用のスクリプトが起動するようにします。
 ボタンには、引数で、都道府県、市区町村、番地、カスタム App 用法人名を持たせています。
```.calc:オプションのスクリプト引数
JSONSetElement (
	"{}" ;
	[ "address" ; _TEMPORARYCORPORATE::PrefectureName &
				 _TEMPORARYCORPORATE::CityName &
				 _TEMPORARYCORPORATE::StreetNumber ; JSONString ] ;
	[ "keyword" ; _TEMPORARYCORPORATE::CorporateNameCustomApp ; JSONString ]
)
```

 今回は、Google Map にしましたが、このようにボタンで、検索した情報を選択し、情報を渡せるわけですから、会社情報を、テンポラリーじゃないテーブルにコピーすることもできます。その際、会社情報に法人番号を含めておけば重複チェックもできるということになります。

 Web ビューアは、Google Map を選択し、以下のように入力します。
```.calc:Web アドレス
"http://local.google.co.jp/maps?" & "q=" & /*住所=*/ _CORPORATESEARCH::g_GoogleMapAddress & " " & /*キーワード=*/ _CORPORATESEARCH::g_GoogleMapKeyword
```

 また、レイアウトには、グローバル変数 `$$RESULT_MESSAGE` を配置しています。これは、検索用スクリプトからのメッセージを表示するためのものです。

 レイアウトの最背面には、透明な長方形オブジェクトを上下左右ロックして配置しています。

## Google Map 用スクリプト

 今回のスクリプトは２つですが、まず簡単な方から。
 ボタンによって渡された住所とキーワード（会社名）を Web ビューアが見ているグローバルフィールドにセットするスクリプトです。
```.calc:CopyAddress
変数を設定 [ $JSON ; 値: Get ( スクリプト引数 ) ]
変数を設定 [ $ADDRESS ; 値: JSONGetElement ( $JSON ; "address" ) ]
変数を設定 [ $KEYWORD ; 値: JSONGetElement ( $JSON ; "keyword" ) ]
# 
フィールド設定 [ _CORPORATESEARCH::g_GoogleMapAddress ; $ADDRESS ]
フィールド設定 [ _CORPORATESEARCH::g_GoogleMapKeyword ; $KEYWORD ]
レコード/検索条件確定 [ ダイアログあり: オフ ]
# 
現在のスクリプト終了 [ テキスト結果: True ]

```

## 法人検索スクリプト

 まず、全文を表示して、簡単に説明しますが、カスタム関数を使用していますので、逐次、それを含めて説明します。

```.calc:CorporateSearch
# CorporateSearch in file CorporateNumberSearch

変数を設定 [ $JSON ; 値: Get ( スクリプト引数 ) ]
変数を設定 [ $SEARCH_STRING ; 値: JSONGetElement ( $JSON ; "searchString" ) ]
変数を設定 [ $IS_CORPORATE_NUMBER ; 値: Is13DigitNumber ( $SEARCH_STRING ) ]
# 
変数を設定 [ $$RESULT_MESSAGE ; 値: NULL ]
フィールド設定 [ _CORPORATESEARCH::g_GoogleMapAddress ; NULL ]
フィールド設定 [ _CORPORATESEARCH::g_GoogleMapKeyword ; NULL ]
レコード/検索条件確定 [ ダイアログあり: オフ ]
# 
変数を設定 [ $HOST_NAME ; 値: "https://api.houjin-bangou.nta.go.jp" ]
変数を設定 [ $VERSION ; 値: 4 // バージョン ]
変数を設定 [ $APPLICATION_ID ; 値: "（取得したアプリケーション ID）" // アプリケーション ID ]
# 
If [ $IS_CORPORATE_NUMBER ]
	# 法人番号で検索
	変数を設定 [ $REQUEST_TYPE ; 値: "num" // 商号又は名称 ]
	変数を設定 [ $NUMBER ; 値: Left ( SanitizeNumericAsText ( $SEARCH_STRING ) ; 13 ) ]
	変数を設定 [ $TYPE ; 値: "02" // 応答形式 ]
	変数を設定 [ $HISTORY ; 値: "0" // 応答形式 ]
	# 
	変数を設定 [ $ENDPOINT ; 値: $HOST_NAME & "/" & $VERSION & "/" & $REQUEST_TYPE & "?id=" & $APPLICATION_ID & "&number=" & $NUMBER & "&type=" & $TYPE & "&history=" & $HISTORY ]
Else
	# 商号又は名称で検索
	変数を設定 [ $REQUEST_TYPE ; 値: "name" // 商号又は名称 ]
	変数を設定 [ $NAME ; 値: GetAsURLEncodedNTAName ( $SEARCH_STRING ) ]
	変数を設定 [ $TYPE ; 値: "02" // 応答形式 ]
	変数を設定 [ $MODE ; 値: 2 // 商号又は名称検索方式 ]
	変数を設定 [ $TARGET ; 値: 1 // 商号又は名称検索対象 ]
	# 
	変数を設定 [ $ENDPOINT ; 値: $HOST_NAME & "/" & $VERSION & "/" & $REQUEST_TYPE & "?id=" & $APPLICATION_ID & "&name=" & $NAME & "&type=" & $TYPE & "&mode=" & $MODE & "&target=" & $TARGET ]
End If
# 
URL から挿入 [ 選択 ; ダイアログあり: オフ ; ターゲット: $$g_RESPONSE ; $ENDPOINT ]
# 
変数を設定 [ $COUNT ; 値: GetNTAResponseBodyCount ( $$g_RESPONSE ) ]
If [ $COUNT < 1 ]
	変数を設定 [ $$RESULT_MESSAGE ; 値: "入力された条件に該当するデータが存在しません。入力条件を確認・変更の上、再検索してください。" ]
Else
	変数を設定 [ $$RESULT_MESSAGE ; 値: $COUNT & " 件見つかりました。" ]
	変数を設定 [ $i ; 値: 1 ]
	# 
	ウインドウの固定
	レイアウト切り替え [ 「_TEMPORARYCORPORATE」 (_TEMPORARYCORPORATE) ; アニメーション: なし ]
	# 
	全レコードを表示
	対象レコード削除 [ ダイアログあり: オフ ]
	# 
	Loop [ フラッシュ: 常に ]
		Exit Loop If [ $i > $COUNT ]
		変数を設定 [ $LINE_ITEM ; 値: GetValue ( $$g_RESPONSE ; $i + 1 ) ]
		変数を設定 [ $LISTIFY ; 値: CSVLine2ValueList ( $LINE_ITEM ) ]
		# 
		新規レコード/検索条件
		# 
		変数を設定 [ $SEQUENCE_NUMBER ; 値: GetValue ( $LISTIFY ; 1 ) // 一連番号 ]
		変数を設定 [ $CORPORATE_NUMBER ; 値: GetValue ( $LISTIFY ; 2 ) // 法人番号 ]
		フィールド設定 [ _TEMPORARYCORPORATE::CorporateNumber ; $CORPORATE_NUMBER ]
		変数を設定 [ $CORPORATE_NAME_RAW ; 値: TrimQuote ( GetValue ( $LISTIFY ; 7 ) ) // 法人名称 ]
		変数を設定 [ $CORPORATE_NAME_CUSTOM_APP ; 値: NTAName2CustomAppName ( GetValue ( $LISTIFY ; 7 ) ) // 法人名称 ]
		フィールド設定 [ _TEMPORARYCORPORATE::CorporateNameRaw ; $CORPORATE_NAME_RAW ]
		フィールド設定 [ _TEMPORARYCORPORATE::CorporateNameCustomApp ; $CORPORATE_NAME_CUSTOM_APP ]
		変数を設定 [ $CORPORATE_KIND ; 値: GetValue ( $LISTIFY ; 9 ) // 法人種別 ]
		フィールド設定 [ _TEMPORARYCORPORATE::CorporateKind ; $CORPORATE_KIND ]
		変数を設定 [ $PREFECTURE_NAME ; 値: TrimQuoteArrageText ( GetValue ( $LISTIFY ; 10 ) ) // 国内所在地（都道府県） ]
		フィールド設定 [ _TEMPORARYCORPORATE::PrefectureName ; $PREFECTURE_NAME ]
		変数を設定 [ $CITY_NAME ; 値: TrimQuoteArrageText ( GetValue ( $LISTIFY ; 11 ) ) // 国内所在地（市区町村） ]
		フィールド設定 [ _TEMPORARYCORPORATE::CityName ; $CITY_NAME ]
		変数を設定 [ $STREET_NUMBER ; 値: TrimQuoteArrageText ( GetValue ( $LISTIFY ; 12 ) ) // 国内所在地（丁目番地等） ]
		フィールド設定 [ _TEMPORARYCORPORATE::StreetNumber ; $STREET_NUMBER ]
		変数を設定 [ $PREFECTURE_CODE ; 値: GetValue ( $LISTIFY ; 14 ) // 都道府県コード ]
		フィールド設定 [ _TEMPORARYCORPORATE::PrefectureCode ; $PREFECTURE_CODE ]
		変数を設定 [ $CITY_CODE ; 値: GetValue ( $LISTIFY ; 15 ) // 市区町村コード ]
		フィールド設定 [ _TEMPORARYCORPORATE::CityCode ; $CITY_CODE ]
		変数を設定 [ $POSTAL_CODE ; 値: GetValue ( $LISTIFY ; 16 ) // 郵便番号 ]
		フィールド設定 [ _TEMPORARYCORPORATE::PostalCode ; $POSTAL_CODE ]
		変数を設定 [ $FURIGANA ; 値: NTAName2CustomAppName ( Hiragana ( GetValue ( $LISTIFY ; 29 ) ) ) // ふりがな ]
		フィールド設定 [ _TEMPORARYCORPORATE::Furigana ; $FURIGANA ]
		# 
		レコード/検索条件確定 [ ダイアログあり: オフ ]
		# 
		変数を設定 [ $i ; 値: $i + 1 ]
	End Loop
End If
# 
レイアウト切り替え [ 元のレイアウト ; アニメーション: なし ]
ウインドウ内容の再表示 []
# 
現在のスクリプト終了 [ テキスト結果: True ]

```

 順番に見ていきます。

```
変数を設定 [ $JSON ; 値: Get ( スクリプト引数 ) ]
変数を設定 [ $SEARCH_STRING ; 値: JSONGetElement ( $JSON ; "searchString" ) ]
変数を設定 [ $IS_CORPORATE_NUMBER ; 値: Is13DigitNumber ( $SEARCH_STRING ) ]
```

 スクリプトトリガで起動した時に、検索キーワードを受け取ります。検索は、商号または名称、法人番号のどちらでも検索できるようにしています。
 単純にキーワードが、13桁の数字であった場合、法人番号での検索を行います。

　ここで、カスタム関数を使っています。
　カスタム関数は、複雑なものを作るよりも、単純なものを組み合わせて作る方が良いと思います。ここでも２つのカスタム関数で構成しています。
```.calc:SanitizeNumericAsText
// 全角英数字を半角英数字に変換し、数字のみに変換する。

// Required: (none)
// Parameters: Text

Filter ( RomanHankaku ( Text ) ; "0123456789" )
```

```.calc:Is13DigitNumber
// 数字13桁なら真

// Required: SanitizeNumericAsText
// Parameters: NumberAsText

Evaluate ( Length ( SanitizeNumericAsText ( NumberAsText ) ) = 13 )
```

　キーワードを半角数字のみに変換（SanitizeNumericAsText）し、それが13桁か（Is13DigitNumber）調べています。

```
変数を設定 [ $$RESULT_MESSAGE ; 値: NULL ]
フィールド設定 [ _CORPORATESEARCH::g_GoogleMapAddress ; NULL ]
フィールド設定 [ _CORPORATESEARCH::g_GoogleMapKeyword ; NULL ]
レコード/検索条件確定 [ ダイアログあり: オフ ]
```

 メッセージ用グローバル変数と Google Map 用の情報をクリアしています。ここでもカスタム変数を使っています。
```.calc:NULL
""
```

 単に空白を返すカスタム関数を `NULL` と命名して使うとスクリプトや計算式がより直感的になると思います。正確には FileMaker Pro は NULL ではなく空白ですが、コードが見やすくなります。

```
変数を設定 [ $HOST_NAME ; 値: "https://api.houjin-bangou.nta.go.jp" ]
変数を設定 [ $VERSION ; 値: 4 // バージョン ]
変数を設定 [ $APPLICATION_ID ; 値: "（取得したアプリケーション ID）" // アプリケーション ID ]
```

　Web-API のリクエストに必要な情報を変数にセットしています。

```
If [ $IS_CORPORATE_NUMBER ]
	# 法人番号で検索
	変数を設定 [ $REQUEST_TYPE ; 値: "num" // 商号又は名称 ]
	変数を設定 [ $NUMBER ; 値: Left ( SanitizeNumericAsText ( $SEARCH_STRING ) ; 13 ) ]
	変数を設定 [ $TYPE ; 値: "02" // 応答形式 ]
	変数を設定 [ $HISTORY ; 値: "0" // 応答形式 ]
	# 
	変数を設定 [ $ENDPOINT ; 値: $HOST_NAME & "/" & $VERSION & "/" & $REQUEST_TYPE & "?id=" & $APPLICATION_ID & "&number=" & $NUMBER & "&type=" & $TYPE & "&history=" & $HISTORY ]
Else
	# 商号又は名称で検索
	変数を設定 [ $REQUEST_TYPE ; 値: "name" // 商号又は名称 ]
	変数を設定 [ $NAME ; 値: GetAsURLEncodedNTAName ( $SEARCH_STRING ) ]
	変数を設定 [ $TYPE ; 値: "02" // 応答形式 ]
	変数を設定 [ $MODE ; 値: 2 // 商号又は名称検索方式 ]
	変数を設定 [ $TARGET ; 値: 1 // 商号又は名称検索対象 ]
	# 
	変数を設定 [ $ENDPOINT ; 値: $HOST_NAME & "/" & $VERSION & "/" & $REQUEST_TYPE & "?id=" & $APPLICATION_ID & "&name=" & $NAME & "&type=" & $TYPE & "&mode=" & $MODE & "&target=" & $TARGET ]
End If
```

 カスタム関数 `Is13DigitNumber` で調べた結果が真ならば、法人番号で検索、そうでなければ、商号または名称で検索します。
 `変数を設定 [ $NUMBER ; 値: Left ( SanitizeNumericAsText ( $SEARCH_STRING ) ; 13 )` は必要ありませんが、元のロジックを変更した場合に備えて、冗長ですが入れておきました。

　商号または名称検索で、名称を URL エンコードするカスタム関数を使用しています。
 この処理は、カスタム関数にするほどではないですけど、カスタム関数にした方が、他で同様の処理をするときの一貫性や、やろうとしていることが明示的になるので、カスタム関数を活用した方がいいのではないかと思います。
 
```.calc:GetAsURLEncodedNTAName
// 国税庁法人番号検索用法人名の URL エンコードを行う

// Required: (none)
// Parameters: CorporateName

// 国税庁法人番号検索用法人名 URL エンコード

GetAsURLEncoded ( RomanZenkaku ( CorporateName ) )
```

 リクエストの形式は、どちらの検索でも変数 `$ENDPOINT` にセットされます。
 リクエストの設定とレスポンスの形式は、資料「[Web-API（Ver.4.0）のリクエストの設定方法及び提供データの内容について](https://www.houjin-bangou.nta.go.jp/pc/webapi/images/k-web-api-kinou-ver4.pdf)」を参照してください。

```
URL から挿入 [ 選択 ; ダイアログあり: オフ ; ターゲット: $$g_RESPONSE ; $ENDPOINT ]
```

 セットした `$ENDPOINT` で、リクエストを行い結果をグローバル変数 `$$g_RESPONSE` に格納しています。

```
変数を設定 [ $COUNT ; 値: GetNTAResponseBodyCount ( $$g_RESPONSE ) ]
```

 カスタム関数を使って、レスポンスの件数を取得しています。
 
```.calc:CSVLine2ValueList
// CSV の１行の各要素を値一覧に変換する

// Required: (none)
// Parameters: CSVLine

Substitute ( CSVLine ; "," ; ¶ )
```

```.calc:GetNTAResponseBodyCount
// 国税庁法人番号検索の法人名検索結果件数を得る。

// Required: CSVLine2ValueList
// Parameters: ResponseCSV

GetAsNumber ( GetValue ( CSVLine2ValueList ( GetValue ( ResponseCSV ; 1 ) ) ; 2 ) )
```

 レスポンスの１行目を取り出し、それを、値一覧（改行区切りリスト）にして、2番目の要素を取り出しています。レスポンスの１行目はヘッダ情報となっていて、２番目の要素は総件数になっているので、これを見ているということです。

```
If [ $COUNT < 1 ]
	変数を設定 [ $$RESULT_MESSAGE ; 値: "入力された条件に該当するデータが存在しません。入力条件を確認・変更の上、再検索してください。" ]
```

 総件数が１未満なら、結果がないということで、メッセージをセットしています。

```
Else
	変数を設定 [ $$RESULT_MESSAGE ; 値: $COUNT & " 件見つかりました。" ]
	変数を設定 [ $i ; 値: 1 ]
	# 
	ウインドウの固定
	レイアウト切り替え [ 「_TEMPORARYCORPORATE」 (_TEMPORARYCORPORATE) ; アニメーション: なし ]
	# 
	全レコードを表示
	対象レコード削除 [ ダイアログあり: オフ ]
```

 そうでなければ（結果があれば）、件数をメッセージにセットして、ループに入る準備をしています。
 $i に 1 をセットしています。他のプログラミング言語ですと、0 にセットしたいところですが、FileMaker Pro の場合、繰り返しフィールド（配列）も 1から始まるので、インデックスは 1 から始めるように統一しておいた方が、バグが潜む危険性を回避できると思います。
 
 テンポラリーなテーブルなので、前回結果をここで全件削除しています。

```
	Loop [ フラッシュ: 常に ]
		Exit Loop If [ $i > $COUNT ]
```

 ループを開始します。終了条件は、$i が、総件数を上回るです。

```
		変数を設定 [ $LINE_ITEM ; 値: GetValue ( $$g_RESPONSE ; $i + 1 ) ]
		変数を設定 [ $LISTIFY ; 値: CSVLine2ValueList ( $LINE_ITEM ) ]
```

 １行のデータをレスポンスから取得しています。1行目はヘッダ情報なので、現在の $i + 1 が現在行になります。これを、値一覧に変換しています。

```
		新規レコード/検索条件
```

 `_TEMPORARYCORPORATE` に新規レコードを作成します。

 以降、値を取り出し、変数にセット、必要なものをフィールドにセットという処理になります。

```
		変数を設定 [ $SEQUENCE_NUMBER ; 値: GetValue ( $LISTIFY ; 1 ) // 一連番号 ]
		変数を設定 [ $CORPORATE_NUMBER ; 値: GetValue ( $LISTIFY ; 2 ) // 法人番号 ]
		フィールド設定 [ _TEMPORARYCORPORATE::CorporateNumber ; $CORPORATE_NUMBER ]
```

```
		変数を設定 [ $CORPORATE_NAME_RAW ; 値: TrimQuote ( GetValue ( $LISTIFY ; 7 ) ) // 法人名称 ]
		変数を設定 [ $CORPORATE_NAME_CUSTOM_APP ; 値: NTAName2CustomAppName ( GetValue ( $LISTIFY ; 7 ) ) // 法人名称 ]
		フィールド設定 [ _TEMPORARYCORPORATE::CorporateNameRaw ; $CORPORATE_NAME_RAW ]
		フィールド設定 [ _TEMPORARYCORPORATE::CorporateNameCustomApp ; $CORPORATE_NAME_CUSTOM_APP ]
```

 この部分では、カスタム関数を使っています。
```.calc:TrimQuote
 // 引用符を取り除く

// Required: (none)
// Parameters: QuotedText

Let (
	[
		~text	= Left ( QuotedText ; Length ( QuotedText ) - 1 ) ;
		~text	= Right ( ~text ; Length ( ~text ) - 1 )
	] ;

	~text
)
```

```.calc:NTAName2CustomAppName
// 国税庁法人番号検索法人名の形式からカスタム App の形式に変換する。

// Required: (none)
// Parameters: NTAName

Let (
	[
		~name	= Left ( NTAName ; Length ( NTAName ) - 1 ) ;
		~name	= Right ( ~name ; Length ( ~name ) - 1 )
	] ;

	RomanHankaku ( ~name )
)
```

　国税庁の商号または法人名は、アルファベット、数字が全角になっているので、これを半角に変換しています。ちなみにカスタム関数名の `2` は、to の意味です。同様に `4` を for の意味で使っている場合もあります。

```
		変数を設定 [ $CORPORATE_KIND ; 値: GetValue ( $LISTIFY ; 9 ) // 法人種別 ]
		フィールド設定 [ _TEMPORARYCORPORATE::CorporateKind ; $CORPORATE_KIND ]
```

 法人の種別は、3桁で次のようになっています。
 <table>
    <caption>法人種別</caption>
    <thead>
    <tr>
        <th scope="col">コード</th>
        <th scope="col">項目値名称</th>
    </tr>
    </thead>
    <tbody>
        <tr>
          <td>101</td>
          <td>国の機関</td>
        </tr>
        <tr>
          <td>201</td>
          <td>地方公共団体</td>
        </tr>
        <tr>
          <td>301</td>
          <td>株式会社</td>
        </tr>
        <tr>
          <td>302</td>
          <td>有限会社</td>
        </tr>
        <tr>
          <td>303</td>
          <td>合名会社</td>
        </tr>
        <tr>
          <td>304</td>
          <td>合資会社</td>
        </tr>
        <tr>
          <td>305</td>
          <td>合同会社</td>
        </tr>
        <tr>
          <td>399</td>
          <td>その他の設立登記法人</td>
        </tr>
        <tr>
          <td>401</td>
          <td>外国会社等</td>
        </tr>
        <tr>
          <td>499</td>
          <td>その他</td>
        </tr>
    </tbody>
</table>

 蛇足ですが、ユーザが法人名称を入力するようなソリューションを作る場合、法人種別の手入力はさせない UI/UX にした方が良いでしょう。
 手入力させると、データが揺らいでしまいます。例えば、株式会社を、「株式会社」、「㈱」、「（株）」、「(株)」、「（株)」、「(株）」というように様々なパターンで入力されて、データが汚れます。同様のことがアルファベット、数字、記号の全角半角にも言えますが、データ入力がある場面では、計算式で整えることが必要だと思います。

```
		変数を設定 [ $PREFECTURE_NAME ; 値: TrimQuoteArrageText ( GetValue ( $LISTIFY ; 10 ) ) // 国内所在地（都道府県） ]
		フィールド設定 [ _TEMPORARYCORPORATE::PrefectureName ; $PREFECTURE_NAME ]
		変数を設定 [ $CITY_NAME ; 値: TrimQuoteArrageText ( GetValue ( $LISTIFY ; 11 ) ) // 国内所在地（市区町村） ]
		フィールド設定 [ _TEMPORARYCORPORATE::CityName ; $CITY_NAME ]
		変数を設定 [ $STREET_NUMBER ; 値: TrimQuoteArrageText ( GetValue ( $LISTIFY ; 12 ) ) // 国内所在地（丁目番地等） ]
		フィールド設定 [ _TEMPORARYCORPORATE::StreetNumber ; $STREET_NUMBER ]
```

 ここでもカスタム関数を使っています。
```.calc:TrimAllAndFormatRemove
// 余分な空白を取り除き、テキストのスタイルを取り除く

// Required: (none)
// Parameters: Text

TextFormatRemove ( TrimAll ( Text ; 1 ; 1 ) )
```

```.calc:ArrangeText
// テキストの英数字を半角に変換し、余分な空白をとテキストのスタイルを取り除く

// Required: TrimAllAndFormatRemove
// Parameters: Text

TrimAllAndFormatRemove ( RomanHankaku ( Text ) )
```

```.calc:TrimQuoteArrageText
// 国税庁法人番号検索の住所形式からカスタム App の形式に変換する。

// Required: ArrangeText
// Parameters: QuotedText

Let (
	[
		~text	= Left ( QuotedText ; Length ( QuotedText ) - 1 ) ;
		~text	= Right ( ~text ; Length ( ~text ) - 1 )
	] ;

	ArrangeText ( ~text )
)
```

 `ArrangeText` と `TrimAllAndFormatRemove` はデータ入力の際に、汎用的に使用できます。`TrimAllAndFormatRemove` は、余分な空白を取り除き、コピー＆ペーストされた際の、フォントのスタイルを取り除き、レイアウトで指定したスタイルに統一します。それに加えて、全角から半角の変換が必要なら、`ArrangeText` の方を使います。

```
		変数を設定 [ $PREFECTURE_CODE ; 値: GetValue ( $LISTIFY ; 14 ) // 都道府県コード ]
		フィールド設定 [ _TEMPORARYCORPORATE::PrefectureCode ; $PREFECTURE_CODE ]
		変数を設定 [ $CITY_CODE ; 値: GetValue ( $LISTIFY ; 15 ) // 市区町村コード ]
		フィールド設定 [ _TEMPORARYCORPORATE::CityCode ; $CITY_CODE ]
		変数を設定 [ $POSTAL_CODE ; 値: GetValue ( $LISTIFY ; 16 ) // 郵便番号 ]
		フィールド設定 [ _TEMPORARYCORPORATE::PostalCode ; $POSTAL_CODE ]
```

 コードと郵便番号をセットします。市区町村コードは、総務省の Web-API を応用することで、市区町村名に変換できますが、今回は割愛します。

```
		変数を設定 [ $FURIGANA ; 値: NTAName2CustomAppName ( Hiragana ( GetValue ( $LISTIFY ; 29 ) ) ) // ふりがな ]
		フィールド設定 [ _TEMPORARYCORPORATE::Furigana ; $FURIGANA ]
```

 既出の `NTAName2CustomAppName` カスタム関数を使っています。

```
		レコード/検索条件確定 [ ダイアログあり: オフ ]
		# 
		変数を設定 [ $i ; 値: $i + 1 ]
	End Loop
End If
```

 レコード確定し、`$i` をインクリメントして、ループの初めに戻って終了条件になれば、ループを抜け、If スクリプトステップを抜けます。

```
レイアウト切り替え [ 元のレイアウト ; アニメーション: なし ]
ウインドウ内容の再表示 []
# 
現在のスクリプト終了 [ テキスト結果: True ]
```

 元のレイアウトに戻らなくても、元のレイアウトですが、将来の改変に備えて入れてあります。
 ウインドウ内容の再表示をして、スクリプトを終了します。

 このリクエストで、法人番号、名称、種別、所在地を取得できるので、応用範囲は広いと思います。データ入力面では、先ほど挙げた法人種別や、法人名、所在地の文字形式の統一に役立ちますし、現在、インボイス制度があるので、支払先の適格事業者登録番号は必須です。法人番号で検索することで、提供された適格事業者登録番号の真正確認も可能になります。