6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerAppsでNFCタグを読み込む(ReadNFC関数の利用と実装例)

6
Last updated at Posted at 2025-12-14

初めに

この記事は、Power Apps Advent Calendar 2025 12月15日 担当分の記事です。

対象読者

 PowerAppsを利用している中で「アプリ内でNFCタグを読み取りたいな」と思った方

NFCカードを読もうと思ったきっかけ

システム開発をしていく中で、個人的な興味からPowerAppsでNFCタグって読めるのかなーというところが気になったからです。
本人の認証として皆さんがぶら下げている社員証などのICカードで利用できると便利では?というところもあり、今回調査してみることにしました。

readNFC関数 とは?

公式ドキュメントは下記の通り。

この関数を呼び出すとNFCを利用してNFCタグの識別子や内容を読み取ることができます。
ただし、実装には下記の制限があるため注意が必要です。

  • iOSやAndroidなど、スマートフォンでないと動きません。
  • Webブラウザーからアプリを開くと使用できません。(アプリ版からの実行が必要です。)
  • 読み取りは可能ですが、書き込みはできません。
  • 識別子は複製可能な情報のため、セキュリティ要件が高い用途ではお勧めできません。
    • あるいは、識別子以外の情報も読み取って管理することが重要だと思います。

デバックや開発中の場合は、ReadNFC関数を呼び出すタイミングでテストデータを自動でセットしてくれます。
そのため、都度発行して実機テストして・・・という手間を省くことができます。
image.png

実装手順

// powerFXは qiita では利用できないので、javaのシンタックスハイライトを利用しています。
UpdateContext({locNFC: ReadNFC()});
Set(NFCid, locNFC.Identifier);

手順ですが、変数「locNFC」に読み取り値のデータテーブルをセットします。
ReadNFC関数の帰り値はデータテーブルで帰ってきます。

変数「NFCid」に先の変数「locNFC」の識別子を格納することで識別子の値をテキストで保持します。
※ほかにもっと効率の良い取得方法があるかもしれませんが・・・手軽さを求めて簡単な方法を利用しています。

作ってみたアプリの一例

ICカードを利用した入退場の管理アプリになります。
実際はICカードではなくNFCタグ情報の管理なのですがイメージわくのがICカードだったのでそのように表現させていただいております。なにとぞご容赦くださいますようお願いいたします。

利用想定イメージ

ざっくりと、こんな感じです。

  • 入場ボタン押した際
    • ICカードを読み取って同じ識別子の情報があるかを比較
      • あれば:すでに存在している旨のエラー表示して終了
      • なければ:附随する情報を入力させる画面に遷移する
        • 入力先の画面で「入場」を押せばカード情報を登録
        • 入力先の画面で「戻る」を押せば遷移させずに前の画面へ
  • 出場ボタン押した際
    • ICカードを読み取って同じ識別子の情報があるかを比較
    • あれば:出場処理をして終了(有効なカードとしての登録を外す)
    • なければ:該当カードが存在しない旨をエラー表示して終了

image.png

見た目

見た目はシンプルに。

初期画面

sc_main という名前を付けてます。
image.png

入場詳細画面

sc_GateIn という名前にしました。入場用の画面なので・・・
また、SharePointのリストアイテムを表示・更新するためのフォームを置いています。(fmCardという名前)
image.png

ICカード情報を格納するためのSharePoint Lists

IC_TESTというリストで作成しています。
ICカード情報を記録するために以下の4項目を追加しています。

項目名 目的
icid Text ICカードの識別子を保存
icName Text 詳細画面での入力用 利用者名を入力する想定
inUse Boolean 利用判定。TRUE:有効 FALSE:無効 規定値TRUE
purpose Text 詳細画面での入力用。目的を入力する想定

image.png

なお、Boolean型については列の作成時に規定値をどちらにするか聞いてきますから、ここでは「はい」を選択しておきます。

image.png

実際にPowerFXでコードを記載していきます。

※見た目や部品の名称については適宜ご自身で変更してください。

今回は処理の説明や目的をなるべく本記事で完結するためにこまごまと記載していますが、
実務で利用する場合はここまでコメントを書くことはないです。

初期画面

入場ボタンの Onselect処理
// 入場ボタンの Onselect処理


// ReadNFC関数を利用して読みだした識別子を変数「NFCid」にセット
UpdateContext({locNFC: ReadNFC()});
Set(NFCid, locNFC.Identifier);

//おさらいですが If関数は  If(条件,Trueの場合,Falseの場合);
If(
  //条件:読取したICカードで利用中カードで該当する識別子がないことをチェック
  IsBlank(LookUp(IC_TEST,icid = NFCid && inUse = true).icid)
,
  //True:該当カードがなければ、詳細を登録するための画面へ
  NewForm(fmCard);
  Navigate(scGateIn)
, 
  //False:該当カードがあれば、重複登録させないためにエラー通知を出力して終了
  Notify("このカードはすでに登録されています。",NotificationType.Error)
);

出場ボタンの Onselect処理
// 出場ボタンの Onselect処理

// ReadNFC関数を利用して読みだした識別子を変数「NFCid」にセット
UpdateContext({locNFC: ReadNFC()});
Set(NFCid, locNFC.Identifier);

//またもやおさらいですが If関数は  If(条件,Trueの場合,Falseの場合);
If(
  //条件:読取したICカードで利用中カードで該当する識別子がないことをチェック
  IsBlank(LookUp(IC_TEST,icid = NFCid && inUse = true).icid)
,
  //True:該当カードがなければ、登録されていない旨をNotifyで表示
  Notify("このカードは登録されていません。",NotificationType.Error);
,
  //False:該当カードがあれば、利用中をFalseに更新。出場した通知を出力して終了
  //おさらいですが。Patch関数を利用してListの値をupdateします。
  Patch(
    //更新対象のデータセット。今回は「IC_TEST」のLists表を指定します。
    IC_TEST
  ,
    //更新対象レコードの条件。SQLでいうWhere句。条件1と条件2をAND条件でつないでます。
    //条件1:読み取った識別子とリスト上の識別子が同じであること
    //条件2:inUseがtrueであること。(利用中:Trueの想定です。)
    LookUp(IC_TEST, icid = NFCid && inUse = true)
  ,
    //更新内容 今回は利用終了したので利用中ではない状態に変更します。
    {inUse: false}
  );
  //最後にNotifyを出して終わり
  Notify("出場処理が完了しました。",NotificationType.Success);
);

詳細画面

詳細画面の OnVisible処理
  //前画面で読み取った値をicidの値として登録させたいのでicidのフォームの値にテキストをセット
  //DataCardValue7は自動生成された名前です。
  //icidフィールドに対応するデータカードの入力コントロール名に置き換えてください
  DataCardValue7.Text = NFCid;
詳細画面 戻るボタンの OnSelect処理
  //何もせずに戻りたいので、Back()関数を利用。再度入場ボタン押した際にNewFormされる。
  Back();
詳細画面 入場ボタンの OnSelect処理
  //カード情報のフォームをSubmitする。これでListへレコード登録される。
  SubmitForm(fmCard);
詳細画面 カード情報フォームの OnSuccess処理
  //登録できたのであれば、その通知を出力して最初の画面に戻る。
  Notify("登録されました",NotificationType.Success);
  Navigate(scMain);
詳細画面 カード情報フォームの OnFailure処理
  //登録失敗した場合は再度お試しいただく通知を出力する。
  Notify("登録できませんでした。再度お試しください。",NotificationType.Error);

試してみよう

「入場」ボタンを押してカードを読み取るとIDの欄に値が自動で入力された状態で表示されるので
追加で名前や目的を入れたら、「入場」を押してみます。
image.png

登録されました。の通知が表示されます。
image.png

Listに行ってみると、アイテムが追加されていることが確認できます。
image.png

この状態で再度同じカードで入場しようとすると、はじかれてしまいます。
image.png

退場してみると、無事に通知が出ます。
image.png

リストのアイテムでは、有効状態のフラグが外れていることが確認できます。
image.png

再度退場ボタンを押すと、未登録として処理されます。
未登録として処理されているので、入場ボタンを押せば再度入場手続きが可能です。
image.png

image.png

携帯電話のPowerAppsアプリ上で実行してみると、NFC読み取りの場所で下記の状態になりますのでこの状態でNFCタグを読ませると処理することができます。
image.png

まとめ

NFCが利用できる前提ではありますが、手軽にICカードの情報を読み込んでPowerApps上で処理に組み込むことができるのは非常に便利だなと思いました。
ただ、ICカードを利用して手軽に管理したい何かがあるか?と聞かれると確かに難しいなと思い、今回のユーズケースのような入退場のキーとしてICカードを使うことが活用例かなと思いアプリでの実装例を紹介いたしました。

ほかのユースケース、思いつかなったのでClaudeに聞いてみました。

  • 備品・工具の貸出管理(工場や研究室など)
  • イベント受付での来場者チェックイン
  • 設備点検の記録(点検箇所にNFCタグを貼っておく)
  • 在庫管理の簡易版

個人的には、ゲストの入退場管理とか、不特定多数の入場管理については
(セキュリティ面考慮して)相手方のカードを活用して管理してもよいのかなーと思いました。

皆さんもよい NFCタグ × PowerApps ライフをお送りください。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?