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


はじめに

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

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

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

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

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

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

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

そのままで OK をクリック

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

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

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

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

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

詳細エディタを開く

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

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

変更後のコード

(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 としておく

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

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

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

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

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

行と列とを入れ替えます

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

列のマージを行う際に {"Column1", "Column2", "Column3", "Column4", "Column5"} とコラム名が指定されていますがISBNデータの個数が変わったときにこのままではうまく動かなさそうなので・・・

Table.ColumnNames(転置されたテーブル) に書き換えます(コードを触る3か所目)

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

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

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

Power Queryでの作業完了です

まとめ

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

参考

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