0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GAS】GoogleAppsScriptを使って法令APIからランダムに法令を取得してみる

Posted at

はじめに

皆様ご機嫌よう、黄瀬のん(Xenon_ura118)です。

e-Gov法令検索という、色々な法令データを閲覧できるサイトがあることは、皆様ご存じかと思います。
https://laws.e-gov.go.jp/

こちらのサイトには、ランダムで法令を表示するような機能はありません。(Wikipediaのおまかせ表示のようなイメージ)
ので、GASで自作してみました。

作成にあたり、e-Gov法令検索の法令API Version1を利用しました。
https://laws.e-gov.go.jp/apitop/

作成物の概要

「法令をランダムで表示」ボタンを押下すると、e-Gov法令検索のAPIから情報を取得し、ランダムに法令のURLを表示します。

law.PNG

スクリプトの内容

「天気を表示」ボタンに割り当てているスクリプトは以下の通りとなります。

randomLaw.gs
function randomLaw() {
  //スプレッドシートの定義
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const sheet = ss.getSheetByName("ツール")

  //HTTP APIを呼び出して法令名一覧をxml形式で取得
  const url = "https://laws.e-gov.go.jp/api/1/lawlists/1"
  const xml = UrlFetchApp.fetch(url).getContentText()
  const document = XmlService.parse(xml)

  //取得したxmlから法令リストを取得
  let lawList = document.getRootElement().getChildren("ApplData")[0].getChildren("LawNameListInfo")
  let listLength = lawList.length

  //乱数で要素番号を生成(0~法令リストの数-1 の範囲)
  let rand = Math.random()
  let num = Math.floor(rand * listLength)

  //要素番号を使用し、法令リストより法令IDを取得、URLにセット
  let lawId = lawList[num].getChild("LawId").getText()
  let eGovUrl = "https://laws.e-gov.go.jp/law/"+lawId

  //スプレッドシートに書き出し
  sheet.getRange("E2").setValue(eGovUrl)

}

各箇所について説明していきます。

①法令名一覧をxml形式で取得し、法令リストを取得する

  //HTTP APIを呼び出して法令名一覧をxml形式で取得
  const url = "https://laws.e-gov.go.jp/api/1/lawlists/1"
  const xml = UrlFetchApp.fetch(url).getContentText()
  const document = XmlService.parse(xml)

  //取得したxmlから法令リストを取得
  let lawList = document.getRootElement().getChildren("ApplData")[0].getChildren("LawNameListInfo")
  let listLength = lawList.length

法令API Version1において、法令一覧を取得するリクエストURIは以下の通りになっています。(仕様書参照)
https://laws.e-gov.go.jp/api/1/lawlists/1

上記のリクエストを発行するとxml形式の法令一覧が取得できます。
それを配列に入れています。
また、配列の要素番号を取得するために、配列の要素数も取得しておきます。

参考: https://teratail.com/questions/66zttacl8yd97k

②乱数で要素番号を生成、法令IDを取得する

  //乱数で要素番号を生成(0~法令リストの数-1 の範囲)
  let rand = Math.random()
  let num = Math.floor(rand * listLength)

  //要素番号を使用し、法令リストより法令IDを取得、URLにセット
  let lawId = lawList[num].getChild("LawId").getText()
  let eGovUrl = "https://laws.e-gov.go.jp/law/"+lawId

先ほど取得した配列の要素数を使用し、要素番号をランダム生成しています。
ランダムについては、過去記事をご覧ください。
https://qiita.com/Xenon_ura118/items/5dda7165e85c0f280756

要素番号を生成後、配列からデータを取得し、法令IDを取得します。その法令IDをURLに埋め込みすれば、法令のページに飛ぶことができます。

APIを呼び出して法令一覧を取得する処理が重めなのであまり連打することはオススメできませんが、「へぇ~、こんな法令があったんだ!」というものを発見できるので面白いです。
法令については全くの素人なのですが、小切手法とか好きです。まだ大日本帝󠄁國が生きているやつ。
https://laws.e-gov.go.jp/law/308AC0000000057

おわりに

前回の記事ではJSON方式で取得しましたが、今回はxml形式となりました。xml形式についても知識が浅いので苦労しました。プログラミング難しいね。
毎回のことですが、記事内に誤りがありましたら、コメントでご指摘いただけるとありがたいです。

以上です。お読みいただきありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?