IT Hands-on Lab

小規模組織向けIT環境の構築・運用に役立つ情報を、ハンズオン形式で紹介しています。

【Power Apps】バーコード読込登録機能付き 書籍管理アプリ2

PowerApps バーコードリーダー読込登録機能付き書籍管理アプリ2

 

前の記事の続きになります。
Microsoft社が提供するローコード開発ツール「Power Platform」のアプリ機能(Power Apps)と、書籍検索APIの一つであるGoogle Books APIsを使用した、バーコードリーダーによる読込登録機能付き書籍管理アプリの作成例を紹介します。
  • 操作環境:
    • OS:Windows 11
    • Webブラウザー:Edge
  • 使用プラン:Microsoft 365 Business Premium(試用版)
  • アプリ使用環境:
    • OS:Android 14
    • アプリ:PowerApps

 

 

アプリ実装:編集画面:項目整備

必須項目の追加

左の[ツリービュー](下のツリーオブジェクトでもOK)より、[EditScreen1>EditForm1]を選択し、右の[プロパティ]の[ディスプレイ>フィールド]の[8件選択済み]を選択し、[フィールドの追加]を選択します。

図表5-1 編集画面の必要項目の追加

図表5-1 編集画面の必要項目の追加

 

[フィールドの選択]にて必要項目にチェックをつけ(この例では上の4項目)、[追加]を選択します。
項目が追加されたら、項目[memo]を展開し、[コントロールの種類]を[複数行テキストの編集]に変更します。

図表5-2 編集画面の必要項目の追加の続き,コントロールの種類変更

図表5-2 編集画面の必要項目の追加の続き,コントロールの種類変更

 

項目の非表示設定

アプリ内の処理で必要でも表示させたくない項目について、非表示にすることができます。
編集フォーム上の項目[ID]の全体領域を選択し、[ディスプレイ>表示]をオフに変更します。
このアプリで使用しない項目[タイトル]が表示されている場合も同じように設定します。
なお、不要項目は削除もできますが、エラーが出て扱いが面倒なので、非表示にした方が楽です。

図表5-3 編集画面の非表示項目の設定

図表5-3 編集画面の非表示項目の設定

 

項目の編集不可設定

編集画面で表示は必要でも編集させたくない項目について、編集不可にすることができます。
編集フォーム上の項目[borrower]のデータ領域で右クリックし、[ロック解除]を選択します。

図表5-4 編集画面の編集不可項目の設定

図表5-4 編集画面の編集不可項目の設定

 

[詳細設定>DisplayMode]を選択し、値に[.View]を追記します。
[ディスプレイ>色]の背景色のアイコンを選択し、パレットから薄い灰色を選択します。
同様に、項目[borrowed_date]も設定します。

*色は変更必須ではありませんが、編集不可項目であることを分かりやすくするため変更しました

図表5-5 編集画面の編集不可項目の設定の続き

図表5-5 編集画面の編集不可項目の設定の続き

 

ユーザーの表示形式変更

項目[borrower]はデータ上ユーザープリンシパルネーム(UPN)を格納しますが、アプリ上はdisplayNameを表示させます。
左メニューのデータアイコンを選択し、[データの追加]を選択し、[Office]でキーワード検索し、[Office 365 ユーザー]を選択します。
さらに、[接続の追加]と[接続]を選択し、Office365ユーザーが追加されることを確認します。

図表5-6 編集画面のユーザーの表示形式変更(データソース追加)

図表5-6 編集画面のユーザーの表示形式変更(データソース追加)

 

編集フォーム上の項目[borrower]のデータ領域を選択し、 [詳細設定>Default]を選択し、値を以下に変更します。

If(IsBlank(Parent.Default), "", Office365ユーザー.UserProfileV2(Parent.Default).displayName)
*値(UPN)がブランクの場合は空文字、そうでない場合は値(UPN)を表示名に変換します

図表5-7 編集画面のユーザーの表示形式変更(設定)

図表5-7 編集画面のユーザーの表示形式変更(設定)

 

項目の新規登録時の初期値設定

新規登録時に項目の初期値を設定することができます。
編集フォーム上の項目[status]のデータ領域で右クリックし、[ロック解除]を選択します。 [詳細設定>DefaultSelectedItems]を選択し、値を以下に変更します。

If(EditForm1.Mode = FormMode.New, Choices([@書籍管理].status, "貸出可"), ThisItem.status)
*新規登録時は"貸出可"、変更時は既存の値を選択状態にします

図表5-8 編集画面の項目の初期値設定(status)

図表5-8 編集画面の項目の初期値設定(status)

 

同じ初期値の設定でも、項目の種類によって設定するプロパティ名が変わります。
編集フォーム上の項目[borrowed_date]のデータ領域を選択し、 [詳細設定>DefaultDate]を選択し、値を以下に変更します。

If(EditForm1.Mode=FormMode.New, Blank(), Parent.Default)
*新規登録時はブランク、変更時は既存の値を表示します。なお、日付項目を未設定にしたい場合は、Blank()を使います

プロパティの少し下にある[InputTextPlaceholder]の値も以下の通り変更します。

If(IsBlank(Self.SelectedDate), Text(Blank(), Self.Format, Self.Language))

図表5-9 編集画面の項目の初期値設定(borrowed_date)

図表5-9 編集画面の項目の初期値設定(borrowed_date)

 

項目値の変数渡し

以下項目はバーコード読込や書籍情報取得でデータ授受を行うため、変数を定義して値を渡す形にします。

  • バーコード読込:isbn_code
  • 書籍情報取得:published_date、book_name、author、publisher、memo、thumbnail

まずはこれらの変数を定義します。
左のツリービューで[EditScreen1]を選択し、[OnVisible]プロパティを選択し、以下の通り設定します。

UpdateContext({
  locIsbnCode:"", locBookName:"", locAuthor:"",
  locPublishedDate:Today(),
  locPublisher:"", locMemo:"", locThumbnail:""
});
*変数は以下の2種類あり、今回はすべて編集画面内で使用するためコンテキスト変数としています
  • グローバル変数:画面間で使用
  • コンテキスト変数:画面内で使用

図表5-10 編集画面の項目値の変数渡し(コンテキスト変数設定)

図表5-10 編集画面の項目値の変数渡し(コンテキスト変数設定)

 

編集フォーム上の項目[isbn_code]のデータ領域で右クリックし、[ロック解除]を選択します。[詳細設定>Default]を選択し、値を以下に変更します。

If(EditForm1.Mode=FormMode.New, locIsbnCode, Parent.Default)
*新規登録時は変数(初期値は空文字)、変更時は既存の値を表示します

同様に、項目[book_name]、[author]、[publisher]、[memo]、[thumbnail]も設定します(変数はそれぞれのものを使用します)。

図表5-11 編集画面の項目値の変数渡し(isbn_code)

図表5-11 編集画面の項目値の変数渡し(isbn_code)

 

[published_date]については、データの種類が日付型のため、設定が若干異なります。
編集フォーム上の項目[published_date]のデータ領域で右クリックし、[ロック解除]を選択します。[詳細設定>DefaultDate]を選択し、値を以下に変更します。

If(EditForm1.Mode=FormMode.New, locPublishedDate, Parent.Default)
*新規登録時は変数(初期値は今日)、変更時は既存の値を表示します

プロパティの少し下にある[InputTextPlaceholder]の値も以下の通り変更します。

If(IsBlank(Self.SelectedDate), Text(locPublishedDate, Self.Format, Self.Language))

図表5-12 編集画面の項目値の変数渡し(published_date)

図表5-12 編集画面の項目値の変数渡し(published_date)

 

項目のレイアウト調整

少々扱いに癖がありますが、詳細設定の下の方にある[Height]、[Width]、[X]、[Y]に値設定すると意図したレイアウトになります。

  • 0行目:category(幅370),status(幅270)
  • 1行目:borrower(幅320),borrowd_date(幅320)
  • 2行目:isbn_code(幅320),published_date(幅320)
  • 3行目:book_name(幅640)
  • 4行目:author(幅640)
  • 5行目:publisher(幅640)
  • 6行目:memo(幅640,高さ215)
  • 7行目:thumbnail(幅640)

図表5-13 編集画面の項目レイアウト変更

図表5-13 編集画面の項目レイアウト変更

 

 

 

アプリ実装:編集画面:バーコード読込・情報取得機能

コンテナーの追加

バーコード読込機能と情報取得機能は新規登録時しか表示しないため、それを制御するためのコンテナーを追加します。
上メニューの[挿入>レイアウト>コンテナー]を選択します。
コンテナーの幅をアプリの幅(640)に広げ、位置をアプリタイトル領域のすぐ下に移動します。
なお、コンテナーの表示/非表示制御は後で設定します(設定途中で非表示になると作業しにくいため)。

図表6-1 編集画面のバーコードリーダー用コンテナー追加

図表6-1 編集画面のバーコードリーダー用コンテナー追加

 

バーコードリーダーの追加

コンテナー内の[+]アイコンを選択し、[メディア>バーコードリーダー]を選択します。
追加されたバーコードリーダーの幅と位置を適宜調整します。

図表6-2 編集画面のコンテナー内へのバーコードリーダー追加

図表6-2 編集画面のコンテナー内へのバーコードリーダー追加

 

追加したバーコードリーダーを選択した状態で、[ディスプレイ]の下記設定を変更します。

  • テキスト:クリックして書籍のバーコードを読み込む
  • 色関連:このアプリのテーマの色(この例では緑系)

図表6-3 編集画面のバーコードリーダー設定

図表6-3 編集画面のバーコードリーダー設定

 

さらにそのままバーコードリーダーを選択した状態で、 [詳細設定>OnScan]を選択し、値を以下に変更します。

UpdateContext({  locIsbnCode:Last(BarcodeReader1.Barcodes).Value  });
*最後に読み込んだバーコードの値をisbn_code用の変数に格納します
*バーコードリーダーは連続読込に対応するため、複数の値を格納できるようになっています。今回は最後に読み込んだ値を取得する仕様としています

図表6-4 編集画面のバーコードリーダー設定の続き

図表6-4 編集画面のバーコードリーダー設定の続き

 

情報取得ボタンの追加

コンテナーを選択し、上メニューの[挿入>ボタン]を選択します
追加されたボタンの幅と位置を適宜調整します。

図表6-5 編集画面の情報取得ボタン追加

図表6-5 編集画面の情報取得ボタン追加

 

追加されたボタンを選択した状態で、 [詳細設定]の下記設定を変更します。

  • Text: "ISBNコードから書籍情報を取得する"
  • RadiusBottomLeft、RadiusBottomRight、 RadiusTopLeft、RadiusTopRight:10
  • Size:20

なお、OnSelectについては、次の工程で作成するフローを呼び出してデータを授受するため、その後に設定します。

図表6-6 編集画面の情報取得ボタンの設定

図表6-6 編集画面の情報取得ボタンの設定

 

アプリ実装:書籍検索フロー

左メニューのフローアイコンを選択し、[フローを新規作成する]を選択します。
[+ 一から作成]を選択します。
[+ 入力の追加]を選択し、以下の通り設定します。

  • 種類:テキスト
  • 入力名:req-isbn-code

[新しいステップ]を選択します。

図表7-1 PowerAutomateフローの追加,設定(PowerAppsからの引数)

図表7-1 PowerAutomateフローの追加,設定(PowerAppsからの引数)

 

[変数>変数を初期化する]を選択し、以下の通り設定します。

  • 名前:arrayAuthors
  • 種類:アレイ
    *著者は複数値を保持しているため、一旦アレイ型でデータを受け取り、アプリに返すときに[、]区切りのテキスト型に変換します

[新しいステップ]を選択し、[組み込み>HTTP>HTTP]を選択します。

*[HTTP]はプレミアムコネクタのため、365 Business Premiumのライセンスですと、別料金が必要となります(ただし、試用期間中は無料で使用できます)

図表7-2 PowerAutomateフロー設定(変数初期化,HTTP追加)

図表7-2 PowerAutomateフロー設定(変数初期化,HTTP追加)

 

[HTTP]は以下の通り設定します。

  • 方法:GET
  • URI:https://www.googleapis.com/books/v1/volumes?q=isbn:[req-isbn-code](項目)
*URIはGoogle Books APIのボリューム検索を使用しています。アプリから受け取ったISBNコードの値を使って書籍検索APIに検索をかけているイメージです

【2024/11/07追記】
URI内のパラメーターについて、[q=isbn:xxxx]と記述していますが、2024/11/07確認時点で、isbnをISBNと大文字で記載しないと動作しませんでした。エラーが出る場合は大文字に変更して試してください。

[新しいステップ]を選択します。

図表7-3 PowerAutomateフロー設定(HTTP設定)

図表7-3 PowerAutomateフロー設定(HTTP設定)

 

[変数>変数の設定]を選択し、以下の通り設定します。

  • 名前:arrayAuthors
  • 値(式):body('HTTP')?['items']?[0]?['volumeInfo']?['authors']

[新しいステップ]を選択します。

*値の式は書籍検索APIの検索結果であるJSON型の階層構造からauthorsの値を取り出すための記述になります

図表7-4 PowerAutomateフロー設定(変数設定)

図表7-4 PowerAutomateフロー設定(変数設定)

 

[Power Apps>Power Appまたはフローに応答する]を選択します。
[+ 出力追加]を選択し、以下の通り設定します。

  • 種類:テキスト
  • 出力名:res-book-name
  • 出力値(式): body('HTTP')?['items']?[0]?['volumeInfo']?['title']

図表7-5 PowerAutomateフロー設定(PowerAppsへの応答)

図表7-5 PowerAutomateフロー設定(PowerAppsへの応答)

 

同様に[+出力追加]を選択し、以下の通り他の項目も設定します。

種類 出力名 出力値
テキスト res-author join(variables('arrayAuthors'),'、')
日付 res-published-date body('HTTP')?['items']?[0]?['volumeInfo']?['publishedDate']
テキスト res-publisher body('HTTP')?['items']?[0]?['volumeInfo']?['publisher']
テキスト res-memo body('HTTP')?['items']?[0]?['volumeInfo']?['description']
テキスト res-thumbnail body('HTTP')?['items']?[0]?['volumeInfo']?['imageLinks']?['thumbnail']
図表7-6 PowerAutomateフロー設定(PowerAppsへの応答の引数設定)

 

一通り設定ができました。
左上のフロー名を分かりやすい名称に変更し、[保存>×]を選択し、アプリの作成画面に戻ります。

図表7-7 PowerAutomateフローの概観

図表7-7 PowerAutomateフローの概観

 

Postmanについて(参考)

APIを使用したアプリ開発を行う場合、「Postman」というツールを使うと、データ構造が分かり便利です。
無料でサインアップでき、設定がサインアップ時のアカウントに紐づくため、別PCにPostmanを移行した場合もそのアカウントで設定を引き継ぐことができます。

図表8-1 Postmanの入手

図表8-1 Postmanの入手

 

画面はPostmanで書籍検索APIのボリューム検索を実施した結果です。画面下部に検索結果が表示され、データ構造が分かるようになっています。

【2024/11/07追記】
URL欄のパラメーターについて、[q=isbn:xxxx]と記述していますが、2024/11/07確認時点で、isbnをISBNと大文字で記載しないと動作しませんでした。エラーが出る場合は大文字に変更して試してください。

図表8-2 Postman 書籍検索

図表8-2 Postman 書籍検索

 

次の記事に続きます。

 

 

当ブログ内の連載記事

elmgrn.hatenablog.com

elmgrn.hatenablog.com

elmgrn.hatenablog.com