はじめに
先日、下記の記事を拝読し、
Kindleってデスクトップアプリを入れると、xmlで書籍データが蓄積されるんだ!
と衝撃を受けました。
記事では
-
Python
でXML
をパース -
Power BI
で可視化
というアプローチをとっています。
私はPower Apps Lover
として、Power Apps
で表現する方法を考えてみました。
1. 書籍データを取得する(XMLのパース)
詳しくは紹介した記事を是非読んでいただきたいです。
Kindleのデスクトップアプリをインストールすると、\AppData\Local\Amazon\Kindle\Cache\
にXML
ファイルが自動保存されます。
C:\Users\user_name\AppData\Local\Amazon\Kindle\Cache\KindleSyncMetadataCache.xml
こちらをPower BI Desktop
でパースします。
標準でXML
はデータとして読み込むことができます。
- 本のタイトル
- 著者
- 出版社
- 購入日
- 出版日
- データのタイプ
読み込むと上記のようなデータが取れるようです。
Power Query式で下記のように読み込みます。
let
// XMLファイルをテーブルに読み込む
Source = Xml.Tables(File.Contents("C:\Users\{user_name}\AppData\Local\Amazon\Kindle\Cache\KindleSyncMetadataCache.xml")),
// "add_update_list"列を展開して"meta_data"を含める
ExpandedAddUpdateList = Table.ExpandTableColumn(Source, "add_update_list", {"meta_data"}, {"meta_data"}),
// "meta_data"列を展開して各種の詳細を含める
ExpandedMetaData = Table.ExpandTableColumn(ExpandedAddUpdateList, "meta_data", {"ASIN", "title", "authors", "publishers", "publication_date", "purchase_date", "textbook_type", "cde_contenttype", "content_type", "origins"}, {"ASIN", "title", "authors", "publishers", "publication_date", "purchase_date", "textbook_type", "cde_contenttype", "content_type", "origins"}),
// "title", "authors", "publication_date"などのネストされた列をさらに展開
ExpandedTitle = Table.ExpandTableColumn(ExpandedMetaData, "title", {"Element:Text", "Attribute:pronunciation"}, {"Title_Text", "Title_Pronunciation"}),
ExpandedAuthors = Table.ExpandTableColumn(ExpandedTitle, "authors", {"author"}, {"Author"}),
ExpandedPublicationDate = Table.ExpandTableColumn(ExpandedAuthors, "publication_date", {"Element:Text"}, {"PublicationDate"}),
ExpandedPublishers = Table.ExpandTableColumn(ExpandedPublicationDate, "publishers", {"publisher"}, {"Publisher"}),
ExpandedPurchaseDate = Table.ExpandTableColumn(ExpandedPublishers, "purchase_date", {"Element:Text"}, {"PurchaseDate"}),
ExpandedTextbookType = Table.ExpandTableColumn(ExpandedPurchaseDate, "textbook_type", {"Element:Text"}, {"TextbookType"}),
ExpandedOrigins = Table.ExpandTableColumn(ExpandedTextbookType, "origins", {"origin"}, {"Origin"}),
ExpandedOriginType = Table.ExpandTableColumn(ExpandedOrigins, "Origin", {"type"}, {"OriginType"}),
// 最終出力用に必要な列だけを選択
SelectedColumns = Table.SelectColumns(ExpandedOriginType,{"ASIN", "Title_Text", "Title_Pronunciation", "Author", "Publisher", "PublicationDate", "PurchaseDate", "content_type", "OriginType"}),
SelectRows = Table.SelectRows(SelectedColumns, each ([Title_Text] <> "" and [Title_Text] <> "---------------" and [ASIN] <> "B003ODIZL6")),
// 日付列のデータ型を正確な処理のためにdatetimeに変更
ChangedType = Table.TransformColumnTypes(SelectRows,{{"PublicationDate", type datetime}, {"PurchaseDate", type datetime}, {"ASIN", type text}, {"Title_Text", type text}, {"Title_Pronunciation", type text}, {"Publisher", type text}, {"content_type", type text}, {"OriginType", type text}}),
ReplaceErrorValues = Table.ReplaceErrorValues(ChangedType, {{"OriginType", null}})
in
ReplaceErrorValues
その他、データを整形するとこのようにできます。
ビューの作成であれば、Power BIで全て完結します。
スキーマの設定やビューの作成は、この記事では取り扱いません。
一旦ここまでで、発行
を実行します。
2. Power Appsで書籍データを取得する
Power BI(SaaS)に発行されたデータセットは、Power Appsで直接取得することができます。
データの接続
からPowerBI
を選択します。
PowerBIコネクタから直接テーブルを取得し、テーブル
やギャラリー
のデータソースとすることはできないので、一度ボタンクリックを通じて、コレクションとして評価します。
活用するアクションはPowerBI.ExecuteDatasetQuery
です。
面白い
Power BIのデータセットを読み込む
// 1. Set Context
UpdateContext(
{
GroupID: "---",
DatasetID: "---",
Query: "EVALUATE 'Main'" // 先は全行抽出するDAXクエリ式
}
);
// 2. Evalute query
ClearCollect(queryResults,
ForAll(PowerBI.ExecuteDatasetQuery(GroupID,DatasetID,Query).firstTableRows,
{
ASIN: Text(ThisRecord.Value.'Main[ASIN]'),
Title: Text(ThisRecord.Value.'Main[Title_Text]'),
Publisher: Text(ThisRecord.Value.'Main[Publisher]'),
PublicationDate: DateTimeValue(ThisRecord.Value.'Main[PublicationDate]'),
PurchaseDate: DateTimeValue(ThisRecord.Value.'Main[PurchaseDate]'),
OriginType: Text(ThisRecord.Value.'Main[OriginType]'),
Authors: Text(ThisRecord.Value.'Main[Authors]')
}
);
);
アプリを作り上げる
こんな感じでレイアウトを整えます。
モダンコントロールのテーブルを採用していますが、そちらについては下記の記事が参考になります。
Power AppsのスクリーンのOnVisible
でデータの取得を実施
UpdateContext(
{
varSortOrder: SortOrder.Ascending
}
);
// 1. Set Context
UpdateContext(
{
GroupID: "---",
DatasetID: "---",
Query: "EVALUATE 'Main'"
}
);
// 2. Evalute query
ClearCollect(queryResults,
ForAll(PowerBI.ExecuteDatasetQuery(GroupID,DatasetID,Query).firstTableRows,
{
ASIN: Text(ThisRecord.Value.'Main[ASIN]'),
Title: Text(ThisRecord.Value.'Main[Title_Text]'),
Publisher: Text(ThisRecord.Value.'Main[Publisher]'),
PublicationDate: DateTimeValue(ThisRecord.Value.'Main[PublicationDate]'),
PurchaseDate: DateTimeValue(ThisRecord.Value.'Main[PurchaseDate]'),
OriginType: Text(ThisRecord.Value.'Main[OriginType]'),
Authors: Text(ThisRecord.Value.'Main[Authors]')
}
);
);
モダンコントロールのテーブルのItems
プロパティは、条件に応じて値の表示を変化させます。
Sort(
Search(
If(
And(!IsBlank(cmbPublisher.Selected.Value),!IsBlank(cmbOriginType.Selected.Value)),
Filter(queryResults,
Publisher=cmbPublisher.Selected.Value,
OriginType=cmbOriginType.Selected.Value
),
!IsBlank(cmbPublisher.Selected.Value),
Filter(queryResults,Publisher=cmbPublisher.Selected.Value),
!IsBlank(cmbOriginType.Selected.Value),
Filter(queryResults,OriginType=cmbOriginType.Selected.Value),
queryResults
),
inpSearch.Value,"Title"
),
PurchaseDate,
varSortOrder
)
これで、それらしいビューはできます。
Power BIでできることをわざわざAppsでやっているだけで本当に意味はないです。
【応用】Power Appsならでは!を加える
Kindle for desktop
で作成されるXMLでは、読み込めるデータに限りがあります。
- ASINコード
- 本のタイトル
- 著者
- 出版社
- 購入日
- 出版日
- データのタイプ
そしてXML
のデータを読み込んで、Power Appsで表示するだけでは芸がない。
せっかくなので画像や詳細をAPI経由で集めたい!
その方法を模索していこうと思います。
ASINコードを使うハードルが高い…
XMLでASINコード
を取得できています。
ASINコード(Amazon Standard Identification Number) は、Amazonが商品識別に使用するコードとのこと。
Amazonのコードなので、Amazon Product Advertising API 5.0が使えそう!
と思いましたが、何やら利用のハードルが高く、私は今、使用する条件が満たせませんでした(´;ω;`)
本の検索で対処してみる
今回はKindle本なので、本を検索するAPIであれば対処できるのでは!?と思い、Google Books APIを使ってみることにしました。
本の情報検索のみであれば認証も不要のAPIです!
過去にもトライしていました。
カスタムコネクタ
を作って、Power Apps
からAPI
を使えるようにします。
カスタムコネクタの作成
カスタムコネクタの概要は下記をご覧ください。
今回は本の検索機能に絞って作成します。
- Power Automate > カスタムコネクタ
- 「一から作成」を選択
- コネクタ名を設定(好きな名前をつけてください)
- ホスト名とベースURLを設定
- セキュリティは認証なし
- 定義はアクション名とイコールです。
GetBooksData
とつけました
7.「要求」の設定
要求はサンプルからのインポート
で実施します。
動詞はGET
URLに下記を設定します。
https://www.googleapis.com/books/v1/volumes?q=夏目漱石&maxResults=10&startIndex=0
この画面になっていればOK!!
8. テスト
Power Appsにカスタムコネクタ機能を加える
準備ができたので、モダンコントロールのテーブル
でOnSelect
を実施したレコードで、Google Books APIを実施し、検索結果を表示する画面を作ります。
👆こんなイメージ
紹介したようせいさんのブログにも記載がありますが、モダンコントロールのテーブルのOnSelectが不安定です
安定的に動かしたいときは、ギャラリーコントロールが無難かもしれません
一旦うまくいくレコードで実行した例を紹介します。
カスタムコネクタを追加・実行
[データ] > [+ データの追加] > カスタムコネクタを追加します。
これによって、Power Apps
からカスタムコネクタで定義したアクションが実行できます。
カスタムコネクタの呼び出しは、OnSelect
で検索結果画面に行った後、検索結果画面のOnVisible
で下記を実行します。※ここら辺は好きな形で書いてください。
If(!IsBlank(ResultTable.Selected),
ClearCollect(colGoogleBooks,
Table(
GoogleBooksSearch.GetBooksData({q:ResultTable.Selected.Title,maxResults:10,startIndex:0}).items)
)
);
結果は赤枠のギャラリーに格納します。
ギャラリーに配置するコントロールのプロパティ
カスタムコネクタで取得したデータを配置するために、タイトル
、サブタイトル
、イメージコントロール
は下記の通り設定しています。
- タイトル
Text(ThisItem.Value.volumeInfo.infoLink)
- サブタイトル
Text(ThisItem.Value.volumeInfo.publisher)
- イメージコントロール
Text(ThisItem.Value.volumeInfo.imageLinks.thumbnail)
型の評価が曖昧になっているからですね…。
カスタムコネクタによって、Google Booksの検索結果のURL
やISBNコード
も取得できるので、私が使っている読書管理アプリに登録するにも一役買いそうです。
APIを縦横無尽に楽しむうえではPower Platformはやはり最高のツール。検証が止まりません。
おわりに
今回はPower Apps
で無理やり表現しましたが、Power BIでできることはPower BIでやったほうがスマートです。
こんな感じで映えます。
あくまでPower Appsでも表現できるんだなーくらいに見てもらえれば幸いです。