【#PowerApps Tip's】配列のｎ番目を取得する

:::note
# 2022/05/04 追記

Power Apps にも待望の Index を指定できる Index関数 が提供されました。
これで、FirstN関数 と Last関数 を組み合わせなくても「配列のｎ番目」が指定できます。

https://docs.microsoft.com/en-us/power-apps/maker/canvas-apps/functions/function-first-last?WT.mc_id=BA-MVP-5004053#syntax

:::

これ以降は、Index 関数が登場する前までの方法です。

------

PowerApps でアプリを作っていて、コレクション（配列）やテーブルに格納した値を利用する際に「１または最後ではないｎ番目の要素」が必要になるコトありませんか？

例えば、こんな Loading 画面を作ろうと思った時とかｗ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「技名を叫んでから殴る」系のヤツ。<br>男子は好きだろ？<br>当方は大好きだッ！！<a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> <a href="https://twitter.com/hashtag/PowerAppsLoader?src=hash&amp;ref_src=twsrc%5Etfw">#PowerAppsLoader</a> <a href="https://twitter.com/hashtag/JPAUG?src=hash&amp;ref_src=twsrc%5Etfw">#JPAUG</a> <a href="https://t.co/RVujU6mM6L">pic.twitter.com/RVujU6mM6L</a></p>&mdash; やま (@yamad365) <a href="https://twitter.com/yamad365/status/1183225970095865856?ref_src=twsrc%5Etfw">October 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# PowerApps におけるコレクションの問題
PowerApps のコレクション（配列）では ***添字(そえじ)*** が記事投稿時点では利用できません。ざっくりと”添字”のイメージをお伝えすると、配列に格納されたデータに対して「ｎ番目を取得する」等の処理で指定する”ｎ”のコトです。

[ 配列の添字](https://wa3.i-3-i.info/word11927.html)  - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

プログラミング言語経験者であれば、おそらく把握しているハズの概念です。なお、配列の要素（＝添字）が 0 から開始されるのか、1 から開始なのか？は言語に依存します。

# PowerApps で ｎ番目を取得する
では、PowerApps のコレクション、またはテーブルの”ｎ番目”を取得する方法、もっと厳密に表現すると「その他開発言語のように添字でｎ番目を指定する方法」を説明します。

## 説明で利用する配列
「変数名：wkAry」です。列は１つ（Value）だけで、Keyになるようなモノはありません。なお、デモで作成したアプリだとテーブルになるのですが、コレクションもテーブルも同じ処置で処理できますので、ご安心ください。

```
UpdateContext({wkAry:["あ","い","う","え","お"]});
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/6e9917da-8512-7aed-6c5e-32cdde6fa988.png)

## 添字がエラーになる（参考
例えば、下イメージのようにブラケット([])で囲んで、C言語系やJava系のように配列の要素指定をするとエラーになります。イメージは割愛しますがカッコ()も同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/709dedf3-6a87-979a-1b03-8936adff3ef5.png)

## n番目を取得する
さて、本題。他の開発言語にできて、PowerApps ができないワケがない！という強い気持ちでGoです。

### 利用する関数
FirstN関数、および Last関数 を利用します。

[PowerApps の First、FirstN、Last、および LastN 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-first-last)

### 例えば3番目を取得
実際に取得している例が下イメージ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/79f9240d-bf25-98be-a693-15014585f7bb.png)

ラベルに3番目の値を表示しているのですが、そのラベルコントロール Textプロパティで指定している関数が下記になります。

```
Last(FirstN(wkAry,3)).Value
```

解説すると、下記2つの処理を関数を入れ子にすることで実現しています。

　1) FirstN( 取得したい対象, 取得したいｎ番目（＝添字)) で、範囲を限定
　2) 上記1)で限定した範囲の最後（＝Last）がｎ番目＝添字と同じ要素

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/3432d6af-e5d5-3c3e-4e3c-4352fd970da5.png)

### PowerApps は 0始まり？1始まり？
前述、添字の開始が 0 または 1 であり、言語に依存して異なる、とお伝えしました。
今回のテクニックを利用して検証してみた限りでは、PowerApps では「1始まり」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/369d95d6-fb17-793f-1412-6d8f275920f6.png)

# まとめ
- PowerApps は他開発言語のような配列の添字的な利用ができない（記事投稿時点
- FirstN関数 と Last関数 を利用すれば添字と同様の効果が得られる
- PowerApps コレクション、テーブルの要素は(添字的な意味で) 1 始まり

冒頭に紹介した「技名を叫んでから殴る」系のLoadingですが、FirstN関数で指定する”ｎ番目”を変数を利用して、タイマーコントロールで文字を入れ替えて表示させる処理で実現しています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">文字列だけは、ジェネレータぽく自由に入力できるようにした。最後に表示する文字位置とか、ランダムで配置換えしようかとも思ったんだけど、めんどくｓ・・・。腹が減ったのでここで終了にしましたｗ7文字までなのもアレだけど、空腹なのでここまで！ｗ<a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> <a href="https://twitter.com/hashtag/PowerAppsLoader?src=hash&amp;ref_src=twsrc%5Etfw">#PowerAppsLoader</a> <a href="https://twitter.com/hashtag/JPAUG?src=hash&amp;ref_src=twsrc%5Etfw">#JPAUG</a> <a href="https://t.co/EHvx15DgnP">pic.twitter.com/EHvx15DgnP</a></p>&mdash; やま (@yamad365) <a href="https://twitter.com/yamad365/status/1183227020542496768?ref_src=twsrc%5Etfw">October 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

上記のように、[改行コードでSplit](https://qiita.com/yamad365/items/4f0bec10ae57368173d3)してでテーブルを作成しておき、それを遷移した先の画面でタイマー処理しているんですよ。あとは文字の大きさ等もあわせて変更すれば前半の1文字ずつ縮小されるアニメーションが作成できます。そこは1つのラベルと、1つのタイマーで十分。※画面上ある2つ目のタイマーは横 → 縦に文字を出す処理用ですが、そちらの説明は割愛。

コレクションやテーブルに格納されたデータに対して「ｎ番目だけ〇〇したい」というシーンは比較的あると思います。もちろん、テーブル型でKeyになる列が存在していれば LookUp関数等で簡単に処理できます。残念ながら、データソースが他人の設計や他システムだったりすると、Key＆Valueになってないとか、Keyがなぜか一意にならないとか・・・ありますよね？まれに・・・。そういう時に限って、元データを修正できない・・・。おっと、これ以上はやめておきましょう。

何はともあれ、コレクションやテーブルのｎ番目は取得できますのでご安心を！というネタでした。それでは、皆さま。素晴らしい Power Platform Life を！