LoginSignup
1
2

More than 3 years have passed since last update.

ISBNの書かれたテーブルにPower Queryのカスタム関数で書誌情報を追加する

Last updated at Posted at 2020-05-17

はじめに

下の図のようにISBNコードが書かれたテーブルに対して、タイトル、著者、出版社などの書誌情報を Power Query で追加することができました
このカスタム関数を使う方法に気づくまでは Python を使っていたのですが json の構造をたどって欲しい情報を選ぶのに苦労していました。 Power Query だとローコード(コードを触ったのは3か所だけ!)で実現できるし json から欲しい情報を選ぶのも超簡単です!
image.png

Power Query で openBD の書誌情報を読み込んでみる

書誌情報の取得には openBD を使わせていただきました
openBD の API では isbn= の後にISBNコードをカンマ区切りで並べて書くことで複数の書誌情報を一度に取得できます。

実装上の要点
• なるべくまとめて取得する(HTTPのペイロードを減らす)

openBDセミナーのプレゼン資料に書かれていたので複数のISBNコードが書かれたテーブルから上記のようなURLを一つだけ作成して一気に取得する方法にしています

まずはこのURLをPower Queryで読み込んでみます
Power Query の新しいクエリで 「Web から」の URL に先ほどの URL を入力して OK をクリック
image.png

テーブルへの変換をクリック
image.png

そのままで OK をクリック
image.png

展開するボタンをクリックし、summaryの列を選択し、元の列名を~のチェックを外してOKをクリック
image.png

展開するボタンをクリックし、全ての列を選択してOKをクリック
image.png

書誌情報をまとめて取得できました
image.png

このクエリをカスタム関数に置き換える

つぎにこのクエリをISBNコードをパラメータとした関数に置き換えます

詳細エディタを開く
image.png

let の上に (IsbnList as text) => と入力する(コードを触る1か所目)
image.png

URL の中のISBNコードの数字部分を下記のように変更する(コードを触る2か所目)
image.png

変更後のコード

(IsbnList as text) =>
let
    ソース = Json.Document(Web.Contents("https://api.openbd.jp/v1/get?isbn="& IsbnList)),
    テーブルに変換済み = Table.FromList(ソース, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"展開された Column1" = Table.ExpandRecordColumn(テーブルに変換済み, "Column1", {"summary"}, {"summary"}),
    #"展開された summary" = Table.ExpandRecordColumn(#"展開された Column1", "summary", {"isbn", "title", "volume", "series", "publisher", "pubdate", "cover", "author"}, {"isbn", "title", "volume", "series", "publisher", "pubdate", "cover", "author"})
in
    #"展開された summary"

詳細エディタの完了を押すとこのように関数に変換されるので関数名 getBookInfo としておく
image.png

カスタム関数の動作テストをしてみます
IsbnListの部分に 9784899774921,9784802511025,9784802511216,9784798055909,9784798059822 と入力して呼び出しをクリック
image.png

カスタム関数で5冊分の書誌情報が取得できました
image.png

ISBNコードが書かれたテーブルからカスタム関数を呼び出す

このようなテーブルを元にしてに先ほどのカスタム関数で書誌情報をとってみます
image.png

型の変換でテキストになっているか確認します
image.png

行と列とを入れ替えます
image.png

全ての列を選択して列のマージを行います。区切り文字はコンマを選んでOKをクリック
image.png

列のマージを行う際に {"Column1", "Column2", "Column3", "Column4", "Column5"} とコラム名が指定されていますがISBNデータの個数が変わったときにこのままではうまく動かなさそうなので・・・
image.png
Table.ColumnNames(転置されたテーブル) に書き換えます(コードを触る3か所目)
image.png

列の追加タブのカスタム関数の呼び出しをクリックし、ダイアログで関数クエリに getBookInfo を選び、IsbnList に結合済みの列を選択してOKをクリック
image.png

展開するボタンをクリックし、すべての列を選択してOKをクリック
image.png

「結合済み」の列を削除します
image.png

Power Queryでの作業完了です
image.png

まとめ

この方法に気づくまでは Python を使っていて json の構造をたどってほしい情報を選ぶのに苦闘していました。 Power Query だとローコード(コードを触ったのは3か所だけ!)で json の構造を追うのも超簡単に同じことを実現できました!
ISBNコードの行数が増えた時も更新ボタン一発です。openBD で情報が見つからない場合もエラーで途中終了したりしないで空白行で返ってくるのも助かります!
Power Query のカスタム関数は超便利&超強力ですね!!
image.png

参考

カスタム関数の作成についてはこちらのページを参考にさせていただきました
[Power BI / Excel] 複数にまたがる Web ページからデータを取得する

1
2
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
1
2