Index関数でスマートに(エラー対応考慮も)&インデックス列の追加サンプル

はじめに

Index関数が2022年4月頃に出来てから、N番目のレコードの取得が簡単になりました。
その他、ForAll内のループで使って列にIndex列を追加する際も使えますね。
公開再生時にエラーが出るケースがあるのでその点も考慮するべしなことを記載します。

基本情報

公式は以下です。

従来では、コレクション(テーブル)からN番目のレコードを取得する。という書き方は直観的なものがなく、
通常のプログラム言語では添え字(テーブル[1]みたいな)の書き方が出来ますが、
Power Appsでは存在しないのでFirstN関数とLast関数を組み合わせて対応していました。
※まあ出来るから良いのですが。

Index関数が出来てこれがよりスマートに直観的に書けるようになったという感じですね。

NOTE通常プログラム言語の場合インデックスって0始まりですが、
この場合は1から始まります。間違いがちなので注意です。

Code構文: Index(テーブル,N)

例) ID順に並べたてテーブルAから10番目のレコードを取得する
Index(Sort(テーブルA,ID),10)

FirstN,Lastの場合 →最初の10番目までを取ってその最後を取得
Last(FirstN(Sort(テーブルA,ID),10))

ぱわ代

0始まりだから気を付けて!はみるけど逆に1始まりだから注意なのね!
でもデータ件数のカウントと一致するから便利ね♪

他にも以前に有識者の方々が記事をあげられています。
Power Apps Last(FirstN())が不要に!Index関数の実装で配列のインデックス指定が簡単に! (ippu-biz.com)
Power Apps で N 番目のデータをとってくる方法は?FirstN と Last はもう古い?? | PowerPlatform.work

サンプル

簡単ですが、以下サンプルです。
カレンダー的に4月~3月までの12件の配列を用意してギャラリーに指定
インデックスを使ってN番目のデータを取得する的なものです。

実際にはもっと色々使い道はあると思いますのであくまで一例ですね。

範囲外指定のエラーに注意

Index関数は現状、範囲外のインデックスを指定した場合にエラーとなります。
この例でいうと13と入力すると12番目しかないのでエラーですね。0を指定しても同じです。

上記は分かりやすいですが、編集時は問題ないのに「公開して再生」するとこのエラーが出るケースがあります。
元のデータ(この例でいうとMonth)が設定される前にIndex実装部分が読み込まれると起きる感じです。

Indexを使っている場合は念のため公開して再生してエラーが出ないか確認しましょう。

パワ谷さん

そのうちにエラー出ないように改善されるかもな。範囲外だと空になるなど。
期待しつつ、今のうちは対応しておこうかな。

エラーが出る場合の対応

上記のようにエラーが出る場合の対応としては範囲外の場合はやらないという実装が必要です。
この例では以下の様に書いたりすることで回避できます(実装に合わせて書き方は調整ください)

選択中のレコードが何番目なのかは取れない

上記インデックスを活用する場合に、逆に今選択しているレコードはコレクション・テーブルの何番目なのか、
というのを取得したいと思うかと思います。
ただ、このIndex関数は指定した番号のレコードを取得するのみなのでその逆は対応していません。

現状自分が知る限り、標準でこの情報を取得できるすべはない認識です。
必要な場合は、コレクション・テーブルにインデックス用の列を追加する必要があります。
※SPOの場合、自動でナンバリングされるID列がありますが、歯抜けもありますし取得範囲が常に1から始まるわけではないので使えないです。

TIPS現状は選択中のレコードや取得したレコードが元のコレクションの何番目なのかを取るすべは標準ではなし。
別途インデックス用の列を追加するなどが必要。
要望の多い要素なのでいつの日か標準で搭載してほしいと願います。

テーブルにインデックス用の列を追加するサンプル

上記が必要な場合の対応としてサンプルを掲載します。
この場合も今はIndex関数を使いよりスマートに書けます。画面表示時や取得時ボタンなどに仕込みます。
※直接ギャラリーのItemsに指定する場合はインデックス列とテーブルを追加後にUngroupで平坦化する方法もあるようです。

Code//コードサンプル 
この例では一旦データソースから取ったものをコレクションに入れ、ForAll+Sequenceでデータ数分インデックス列を追加。ここでもIndex関数を使うことで追加する対象レコードの特定に役立ちます。

NOTE★バージョン:3.24042以降ではAddColumnsの書式が変わっています。””なしで定義が必要なので読み替えてください。
詳細はこちらをご参照ください。

AddColumnsやSearch関数などで内部名を二重引用符(ダブルクォーテ)が不要になりました!(バージョン:3.24042.20以降) | Power Apps Tips ログ (youseibubu.com)

//一旦コレクションに格納、その際にIndex用の列を追加
ClearCollect(ListCol, AddColumns(商品リスト,”Index”,0));

//コレクション件数分ループしてPatchでそのレコードのIndexを追加する
ForAll(Sequence(CountRows(ListCol)) As i,
  Patch(ListCol,Index(ListCol,i.Value),{Index:i.Value});
);

上記のようにインデックスを追加することが出来ました。

ただ、AddColumnsで列を追加しているのでデータソース直のデータではなくなります。
データ行制限までのデータ取得となりますので、事前にフィルターしたデータに対して実装する必要がありますね。
複合的な検索フィルターやソートの対応など色々ある場合、実装が複雑になるケースもあるので、
要件的にインデックスが必要、かつ他要素(実装面やパフォーマンス面など)もカバーできるという前提でのご利用が良いかと思います。

ぴーたくん

実装できる場合でも他の要素でデメリットが生じる場合もあるから、
その辺も含めて考える必要があるねー

おわりに

今回はIndex関数について記載しました。
すでに有識者の方が記事出されてますが、個人的にもスマートに書ける点とエラー出る点の注意もあったので書いてみました。

最近Power Fxのリファレンスのカテゴリ別チートシートを作成(とても疲れました)したので、
そっちにもリンクしておこうかと。それでは。

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

ヨウセイ

ヨウセイ

一般職からSharePoint、C#、.NET系技術者へ、そこからPower App、Power Automate技術者へと転身。 ワンランク上のおっさんはPower Appsでシステム開発が出来る〜! qiitaや自社HPでも技術ブログを書いていました。

関連記事

コメント

この記事へのコメントはありません。

CONTENTS