技術情報ブログ
Power Platform
2025.04.30

Power Apps, Power Automate で作る NFC タグを活用したアプリ例

Power Apps, Power Automate で作る NFC タグを活用したアプリ例
みやみや

こんにちは、みやみやです。

普段は「バス予報」という弊社サービスのシステム開発のマネジメントをしているのですが、時々現実逃避して別の部署のやってみて遊んでいて、本記事も業務では使っていない技術を試してみた系の記事になります

前回、Power AppsでNFCタグを使ってみるという記事を書きました

前回の経験を踏まえて、「こういうのを作れるんじゃないのかな?」っと思ったので、今回の本題は、「思いついたフローを作ってみて体験してみた」というものです
アプリを作る丁寧なチュートリアルではありません
(2024 年 12 月現在作成)

想定は下図の感じです

想定されるフロー

例えば、こういうシチュエーションを想像しています

  • 機器の定期点検のとき、機器に貼られている NFC タグを読み込んで、エビデンス(証拠、根拠)の写真と共にコメントを記載してデータをサーバーに保存
  • 夏休みの宿題で植物の生育状況を記録 (手書きしろと怒られそうな気がする)

 

前提

  • ある程度、SharePoint , Power Apps , Power Automate を知っている方向けとなります
  • Microsoft 365 の SharePoint , Power Apps, Power Automate を使います

 

1. データの保存場所を作成

データを保存する場所は、みんな大好き SharePoint のリストにします

  • リスト名: GeneralReports

内部列名

表示列名

種類

備考

Title

タイトル

1 行テキスト

最初からある列

Place

場所

1 行テキスト

&nbsp

Evidence

エビデンス

イメージ

写真の画像を保存する

Remark

メモ

複数行テキスト

書式なしテキスト

作成後、リストの設定画面を開き、URL から リスト ID を把握します

URLのリストIDの部分

%7B%7Dの間がリストIDです

リスト ID を把握したら、画像を保存する場所を作ります

※最近、イメージ列の保存先の仕様が変わったらしいですが、記事の本筋から逸れるので突っ込まないでください🙏

サイトコンテンツから、サイトのリソースファイルを開き、Listsフォルダを作成します

その後、Listsフォルダの中に、先ほど把握したリスト ID と同名のフォルダを作成します

Listsフォルダの場所

 

2. イメージ列のフィールド ID を把握

フローで使うので、イメージ列のフィールド ID を先に把握しておきます

とても雑な方法ですが、まず、下記の URL をブラウザで開きます

https://<organization name>.sharepoint.com/sites/<site name>/_api/Web/Lists/getbytitle('GeneralReports')?$select=schemaXml

Ctrl+Fでページ内検索を行い、エビデンスという文字を探し、その右側にあるID=”{xxxxxxxxxx}”という xxxxxxxxxx の部分がフィールド ID ですので、フィールド ID 控えておきます

エビデンス検索結果

 

3. データの保存フローを作成

本題はここじゃないので、サクッと雑に作ります

また、今回フローを作成するに際して、新しいデザイナーを使いません

  1. インスタントクラウドフローを作成、下記のように設定
  2. インスタントクラウドフロー
    • フロー名: カメラアプリからのデータ登録フローサンプル
    • トリガー: Power Apps がフローを呼び出したとき (V2)
  3. 右上のトグルボタンをクリックして、新しいデザイナーを解除
  4. Power Apps アプリから受け取る値を下記のように設定
  5. PowerAppsで受け取る値の設定
  6. 新しいステップを追加し、SharePoint コネクタから、SharePointにHTTP要求を送信しますを選択し、下記のように設定
  7. SharePointにHTTP要求を送信するコネクタ
    • サイトのアドレス: 手順 1 のリストがあるアドレスを選択
    • URI:
    • _api/web/SiteUsers/getByEmail('@{triggerBody()['text_3']}')?$select=Id
  8. 新しいステップを追加し、変数コネクタから、変数を初期化するを選択し、下記のように設定
  9. ユーザーIDを保持する変数
    • 名前: UserId
    • 種類: 文字列
    • 値:
    • body('ユーザーの検索')?['d']?['Id']
  10. 新しいステップを追加し、SharePoint コネクタから、ファイルの作成を選択し、下記のように設定
  11. ファイルの作成
    • サイトのアドレス: 手順 1 のリストがあるアドレスを選択
    • フォルダーのパス: 右のフォルダマークをクリックして、SiteAsests -> Lists -> リスト IDを選択する
    • ファイル名: 動的コンテンツからタイトルを選び、その直後に.jpgと記載する
    • ファイルコンテンツ: 動的コンテンツからエビデンスを選択
  12. 新しいステップを追加し、変数コネクタから、変数を初期化するを選択し、下記のように設定
  13. 変数を初期化するコネクタ
    • 名前: temp
    • 種類: 文字列
    • 値:
    • \"type\":\"thumbnail\",\"fileName\":\"@{triggerBody()['text']}.jpg\",\"nativeFile\":{},\"fieldName\":\"Evidence\",\"serverUrl\":\"https://<organization name>.sharepoint.com\",\"fieldId\":\"<field id>\",\"serverRelativeUrl\":\"/sites/<site name>@{outputs('ファイルの作成')?['body/Path']}\",\"id\":\"@{slice(outputs('ファイルの作成')?['body/ETag'],add(indexOf(outputs('ファイルの作成')?['body/ETag'], '{'),1),indexOf(outputs('ファイルの作成')?['body/ETag'], '}'))}\"

      ※ ‹ organization name › , ‹ site name › , ‹ field id ›はそれぞれ適宜置き換える

  14. 新しいステップを追加し、SharePoint コネクタから、SharePointにHTTP要求を送信しますを選択し、下記のように設定
  15. SharePointにHTTP要求を送信
    • サイトのアドレス: 手順 1 のリストがあるアドレスを選択
    • 方法: POST
    • URI:
    • _api/web/lists/GetByTitle('GeneralReports')/items
    • ヘッダー:
    • {
        "Accept": "application/json;odata=verbose",
        "Content-Type": "application/json;odata=verbose"
      }
    • ボディ:
    • {
        '__metadata': {'type': 'SP.Data.GeneralReportsListItem'},
        'Title': '@{triggerBody()['text']}',
        'Place': '@{triggerBody()['text_1']}',
        'Evidence': '{@{variables('temp')}}',
        'Remark': '@{triggerBody()['text_2']}',
        'AuthorId':@{variables('UserId')},
        'EditorId': @{variables('UserId')}
      }

 

4. Power Apps アプリを作成

ここも本題じゃないので、できるだけ雑にサクッといきます
レイアウトなどの参考はこちら

レイアウトなどの参考
  1. 空のキャンバスプリを作成します
    • アプリ名: Report App Example
    • 形式: 電話
  2. 四角を追加してヘッダー部を作ります
    • BorderColor: RGBA(99, 139, 44, 1)
    • BorderThickness: 1
    • Fill: RGBA(232, 244, 217, 1)
  3. テキストラベルを追加してタイトルを作ります
    • Align: Align.Center
    • Color: RGBA(99, 139, 44, 1)
    • Font: “‘Helvetica Neue’,Arial,’Hiragino Kaku Gothic ProN’,’Hiragino Sans’,’BIZ UDPGothic’,Meiryo,sans-serif”
    • FontWeight: FontWeight.Bold
    • Text: “Report App Example”
  4. カメラとドロップダウンを追加します
    • ドロップダウンの設定
      • BorderColor: RGBA(99, 139, 44, 1)
      • BorderThickness: 1
      • ChevronBackground: RGBA(127, 178, 57, 1)
      • Font: “‘Helvetica Neue’,Arial,’Hiragino Kaku Gothic ProN’,’Hiragino Sans’,’BIZ UDPGothic’,Meiryo,sans-serif”
      • Items: Camera1.AvailableDevices
      • ※カメラを追加していないと設定できません

      • SelectionFill: RGBA(127, 178, 57, 1)
      • Size: 18
    • カメラの設定
      • BorderColor: RGBA(99, 139, 44, 1)
      • BorderThickness: 3
      • Camera: Dropdown1.Selected.Id
      • ※ドロップダウンを追加していないと設定できません

  5. テキストラベルを追加して説明を追加します
    • Font: “‘Helvetica Neue’,Arial,’Hiragino Kaku Gothic ProN’,’Hiragino Sans’,’BIZ UDPGothic’,Meiryo,sans-serif”
    • Size: 18
    • Text: “カメラをタップして写真を撮ることができます”
  6. テキスト入力を追加してメモ入力欄を作ります
    • BorderColor: RGBA(99, 139, 44, 1)
    • BorderStyle: BorderStyle.Dotted
    • Default: ヒントだけ出したいので空にする
    • Font: “‘Helvetica Neue’,Arial,’Hiragino Kaku Gothic ProN’,’Hiragino Sans’,’BIZ UDPGothic’,Meiryo,sans-serif”
    • HintText:
    • “例:プリンターが壊れています
      例:トナーの在庫がありません”

    • Mode: TextMode.MultiLine
  7. ボタンを追加します
    • BorderColor: RGBA(99, 139, 44, 1)
    • Color: RGBA(99, 139, 44, 1)
    • Fill: RGBA(232, 244, 217, 1)
    • Font: “‘Helvetica Neue’,Arial,’Hiragino Kaku Gothic ProN’,’Hiragino Sans’,’BIZ UDPGothic’,Meiryo,sans-serif”
    • Text: “送信”

次に、写真を撮れるようにします

  • カメラを選択して、下記のプロパティを書き換えます
    • OnSelect: UpdateContext({Picture: {Date: Now(), Photo: Camera1.Photo}})
    • Visible: If(IsBlank(Picture), true, false)

タップすると写真を撮って、撮ったらカメラは非表示にすることをやっています

次に、撮った写真を表示、不要なら削除できるようにします

  1. 画像を追加して、カメラと全く同じ大きさで配置します
  2. アイコンから(キャンセル) を追加してカメラの右上に配置します
    ここまででこういう配置です
  3. レイアウトの参考の続き
  4. 画像を選択して、下記のプロパティを書き換えます
    • Image: Picture.Photo
    • Visible: If(IsBlank(Picture), false, true)
  5. アイコンを選択して、下記プロパティを書き換えます
    • Color: RGBA(99, 139, 44, 1)
    • Fill: RGBA(255, 255, 255, 0.51)
    • OnSelect: UpdateContext({Picture: Blank()})
    • Visible: If(IsBlank(Picture), false, true)

次に、NFC タグに設定するリンクに場所のパラメーターを埋め、読み込んだ NFC タグによって場所を判定しようと考えているので、場所をパラメーターから取得できるようにします

  • App の OnStart に下記のように記述します
Set(Place, Param("Place"))

次に、前もって作ってある Power Automate を Power Apps から利用できるようにします

  1. 左にあるアプリ作成メニューから、Power Automateをクリックします
  2. ツリービュー
  3. フローの追加をクリックし、先に作ったカメラアプリからのデータ登録フローサンプルを選択します
フローの追加

次に、送信ボタンを押すことで、Power Apps から Power Automate を呼び出します

  • ボタンを選択して、下記のプロパティを書き換えます
    • OnSelect:
    • カメラアプリからのデータ登録フローサンプル.Run(Picture.Date, Place, TextInput1.Text, User().Email, {file:
        {
          contentBytes:Picture.Photo,
          name:""
        }
      })

最後に、公開を行い準備完了です

 

5. 検証する

まずは、NFC タグ 2 枚に、それぞれ下記情報を書き込みます ※リンクの作成方法は、前記事前記事 を御覧ください

1 枚目 (部屋の棚1)

ms-apps:///providers/Microsoft.PowerApps/apps/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx?tenantId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&restartApp=true&Place=部屋の棚1

2 枚目 (部屋の棚2)

ms-apps:///providers/Microsoft.PowerApps/apps/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx?tenantId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&restartApp=true&Place=部屋の棚2

そして、NFC タグをそれぞれ読み込んで撮影して、SharePoint リストを確認すると成功していました!

GeneralReports

 

考察

思ったより長い記事になってしまいましたが、最初に思い描いていた通りの結果になり、とても満足でした

今回はカメラをつかいましたが、チェックリストを作って、場所ごとにチェック漏れをなくすアプリとかも簡単に作れますし、アイディアやストーリー次第のところはありますが、Power Apps を使ったレクレーション的なこともできそうです

miyamiya

みやみや

ビジュアル系プログラマー、ビジュアル系 PM を自称して 20 年近くが経ちました

弊社 MaaS 製品全般で、開発・運用側のマネジメントをしながら、時々開発もしています

シェアする
記事カテゴリ
最新記事
2025.05.13

元自治体職員(地方公務員)がCopilot Studioを使って業務に役立つエージェント活用を考えてみた

2025.05.07

SharePointでスライドショーを実装したい!効果的な3つの方法を解説

2025.04.30

Power Apps, Power Automate で作る NFC タグを活用したアプリ例

2025.04.16

Power Apps で NFC タグを使ってみる

2025.04.02

Copilot Studioで作成したコパイロットをTeams に追加する方法

データ構造.Net Core Test Explorerレスポンシブ技術カスタマイズ委任自動化したクラウド フロー運用開発環境filter query管理システム列X-SPNFCタグモデル駆動型アプリSortByColumns関数Dataverse for Teams入門ItcomponentVBAフローの種類選択肢列環境sortガバナンス登録日StylePowerAutomatePower AppsTypeScriptitem関数初心者情報技術ダイアログエラーインスタント クラウド フロー参照列本番環境ソートerror notification更新者StudioX-SP DesignPower PlatformHTMLGoogle Maps中級者メッセージIDコンポーネントエクセルスケジュール済みクラウド フローChatGPTライセンスmultiple itemエラー通知更新日AIスライドショーSharePointEF CoreMarker Clustererキャンバスアプリメールdialogerrorレスポンシブ レイアウトOpenAI環境構築手順複数項目削除変更生成系AISlide showExcelマイグレーションRANK()関数DatePickerfirst()関数Tips復元responsive layoutオープンAIpipelineシェアポイントフォルダ外部DBCopilot比較Power AutomateFramework CoreDynamics 365 SalesDropdownnest新機能restoreデータ行の制限チャットGPTCI/CD便利機能ゴミ箱連携license地方自治体C#Attribute directivesMicrosoft Translatorview入れ子変数Power BI引き継ぎgalleryパイプラインカレンダー完全削除接続添付ファイルコントロールCopilot StudiotattributeO/Rマッパーマーカークラスタリングライブラリビュー動的リスト検索個人列退職ギャラリーDevOpsCalendarモデル駆動型データフローファイルサイズ自治体DXvalidationazure sql databasetailwindcssアクセス制限collectionMicrosoft 365グループユーザー列所有者を変更スクロールMicrosoft 365Teamsセキュリティロールrecycle binフルリモートワーク生成AI自治体ローコードCase式マルチテナント承認コレクションセキュリティグループSharePoint Online異動コンテナ簡易在庫管理ローコード開発ビジネスルールごみ箱アーティサン事例AngularHTTP Requestドロップダウンメニューリマインド複数の添付ファイル送信元リストLoopショートカットキー時間外非エンジニアDataverseアクセス許可Artisan活用AccessCSSBreakpointObserverSet承認フローメールの送信非表示Microsoftshortcut key通知体験談JavaScriptSharePoint Framework転職InfoPathxUnitメディアクエリForAllform差出人アプリdesignconcat関数ファイル勉強表示SPFx主キーMatTable.Net Core 3.1スマホUpdateContextエクスポートインスタントクラウドフロー[市民開発者JSON文字制限フィルター クエリ内製化切替サンプルCopilot StudioAngular MaterialVSCodePCロードマップインポート自動化したクラウドフロー構築デザインフロー実行ドキュメント ライブラリ市民開発登録者samplePowerApps
PageTop
ページトップに戻る