GASで法人名からgbizを用いて法人番号等の法人データを一括取得する

法人名から法人番号や所在地等を一括で取得する必要があり、さすがに1000件超を手検索するのはだるかったので調べたところ官製の無料（ありがたい）APIを発見！GASから叩いてスプシに検索結果を貼り付けるツールを作りました。

# 官製APIについて
まったく知らない世界だったのですが、行政のAPIって意外とあるんですね。業務でリサーチとかでぼんぼんデータ使われたり、分析される方には役に立つものもあるのかも。

https://api-catalog.e-gov.go.jp/info/ja/apicatalog/list

## 「法人インフォメーションAPI」について
経産省が提供する法人情報を提供するAPIです。
以下が公式の説明。

> 法人インフォメーションが保有する法人情報・法人基本情報・法人活動情報について語彙に基づいた詳細項目を、SPARQLを用いることで検索・取得できるAPI

> 法人活動情報…政府が保有している届出認定情報、表彰情報、補助金情報、調達情報、特許情報、財務情報、職場情報。

https://info.gbiz.go.jp/api/index.html

法人番号自体は国税庁の法人番号公表サイトと連携して情報とってきているみたいです。財務情報とか取れるの熱い。

### 取得できるデータの一覧はこちら
届出認定情報、表彰情報、補助金情報、調達情報、特許情報、財務情報、職場情報等を取得できます。

https://info.gbiz.go.jp/common/data/resourceinfo.pdf

### トークンの取得
利用にはAPIのトークンが必要です。まずは自分の所属、連絡先や利用用途や利用頻度を入れます。個人でも利用可能です。申請を押すと秒で申請が通ってAPIのトークンが発行されます。特にリクエスト数に上限がないのも魅力。

https://info.gbiz.go.jp/hojin/api_registration/form

## いざ！GASを書く
検索したい法人名を用意してぼんぼこリクエストを出して叩いていきます。返しがJSONなので欲しい内容を配列に格納→スプシへ転記してみました。

### シートの用意
まずは以下のように入力シートと結果シートを用意します。
この例では2列目の企業名をもとに検索していきます。ドキュメントにも記載がありますが、部分一致になるので注意！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/7f7eb31f-7697-f7f7-7057-ef1387c8b39f.png)

### コードの用意

#### まずは秘匿情報をpropertiesにセットしておきます
```js:main.gs
function setProp() {
  //PropertiesServiceでユーザープロパティをセット
  // 利用するシートIDをセット
  PropertiesService.getUserProperties().setProperty('shID', '★スプシのID★');
  // gbizのAPIトークンをセット
  PropertiesService.getUserProperties().setProperty('APIToken', '★APIトークン★');
}
```

#### API叩くメインパート（書き方雑なのは許して…）

リクエストのパラメーターは親切なサイトを参考にすればめちゃくちゃ簡単に組めます。

https://info.gbiz.go.jp/hojin/swagger-ui.html#!/gBizINFO_REST_API/getWorkplaceInformationUsingGET

```js:main.gs
function fetchcompData() {

  //PropertiesServiceからユーザープロパティを取得
  const shtID = PropertiesService.getUserProperties().getProperty('shID')
  const Token = PropertiesService.getUserProperties().getProperty('APIToken')

  const sheet = SpreadsheetApp.openById(shtID).getSheetByName('入力');
  const resultsheet = SpreadsheetApp.openById(shtID).getSheetByName('結果');

  // 入力シートの値を取得
  const range = sheet.getDataRange();
  const values = range.getValues();


  // APIをたたく準備
  const url = "https://api.info.gbiz.go.jp/api/v1/hojin?name=";
  const options = {
    "method": "GET",
    "headers": {
      "Accept": "application/json",
      "X-hojinInfo-api-token": Token
    },
    "muteHttpExceptions": true
  };

  let compName = "";
  let jsonArray = []


  // 検索法人名ごとにAPI叩く
  for (let i = 1; i < values.length; i++) {

    let compTcode = values[i][0];
    let compName = values[i][1];
    let response = UrlFetchApp.fetch(`${url}${compName}&page=1&limit=1000`, options);
    let status = response.getResponseCode();
    let jsonResponse = JSON.parse(response);

    // console.log(jsonResponse)

    // 404エラーで帰ってこなければ戻り値を配列に格納、エラーの場合は「結果無し」を配列に格納
    if (status != "404") {
      for (j = 0; j < jsonResponse["hojin-infos"].length; j++) {
        jsonArray.push([
          compTcode,
          compName,
          jsonResponse["hojin-infos"][j]["corporate_number"],
          jsonResponse["hojin-infos"][j]["postal_code"],
          jsonResponse["hojin-infos"][j]["location"],
          jsonResponse["hojin-infos"][j]["name"]
        ])

      }
    } else {
      jsonArray.push([
        compTcode,
        compName,
        ["結果無し"],
        ["結果無し"],
        ["結果無し"],
        ["結果無し"]])
    };

    // console.log(jsonArray)

  }
  // 配列を一気に結果シートに書き込み
  resultsheet.getRange(2, 1, jsonArray.length, jsonArray[0].length).setValues(jsonArray);

}
```

### 結果

速攻でいい感じに出力されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/12013b16-96ee-f2e7-6be5-c6194e2f6366.png)