MicrosoftがOffice365の一部としてPower AppsというWebアプリを作れる機能を提供していて、勤務先でも一般の従業員が使えるようになった。
それで最近、既存の文書管理システムがSharePointに移転して、
どうにも使いにくい気がしたので、検索・表示機能をPower Appsで作れるか試してみた。
SharePointのリストを抽出するような処理はわりと簡単だった。
しかし、わりと簡単とは言ったものの制約が多いのも実情である。
Power Appsではリストの抽出処理をサーバー側に委任することができる。
このようにすれば大量のデータから必要なものだけを探してクライアントで取得できる。
1操作でクライアントが取得できるデータは500レコードとかに制限されているそう。
なので、もし委任機能がないとドキュメント番号が”XYZ-C1234”のドキュメントを1つ抽出するという処理すら実現できない可能性がある。
しかしサーバー上で処理できる操作にはいろいろ制限があるのもまた実情。
キャンバス アプリでの委任について (Microsoft)
わりと嘘も混ざっているのだけど。
SharePointに限ればこちらの方が詳細だがちょっとわかりにくい表記もある。
Power Apps は SharePoint の機能と操作を委任できます
データテーブルの入力を
Search(Docs,"DocNumber","DocTitle",SearchText.Text)
のようにすればSharePointリストのDocsからDocNumberとDocTitle列にSearchTextテキストボックスに入力された文字が含まれるものを抽出できる。
この処理はDocsのデータ数が多い場合でも、抽出後のデータが500レコード以下であれば期待通りに動くはず。
これはとてもシンプルで、こういう例を見せられるとPower Apps簡単だなと思うのだけど。
ここで作成者の情報で検索したいという話が出てくるが、これが容易ではなかった。
このシステムではドキュメントの作成者はAuthor列にPerson型で格納されている。
Person型は文字列ではないので、Search関数の検索対象にはできない。
さらに言えば、Filter関数での文字列比較に部分一致は使えない。
文字列の比較関数として委任可能なのは = と StartWith しかない。
このため、作成者名での検索は別に入力枠を設けて、
Filter(Docs,StartsWith(Author.DisplayName,AuthorSearch.Text))
のようにしなければならなかった。実際にはSearchの中にFilterを入れ子にしている。
しかし前方一致なんで “Tanaka, Haruki”のようなDisplayNameに対して”Haruki”で検索してもひっかからないんですよね。
何人も同じ名字の人がいると、名前の方が特徴的ならそっちの方が検索しやすいわけじゃないですか。
こういうのSharePointのデータ構造を決めるときに考慮されてるとよかったが。
まだ前方一致で名字の方からマッチするだけマシかもしれないけど。
あと、こういうのも委任できないというのが、○○が空白ではないデータを抽出するというもの。
IsBlank関数は委任不可だが、=Blank()という比較は委任できるという記載はあるが、
では、その逆はどうかという話である。
SharePointリストでは<>演算子、Not演算子は委任不可となっている。
このため、空白ではないデータだけを抽出するという処理は委任できない。
結果的にはこの問題は他の抽出処理で代替出来たのだが、なんでそれができないとなる。
このあたりのデータ処理は切実な問題で、Microsoftには改善を期待したいが。
それに比べればしょうもない話で、ダブルクリック(ダブルタップ)のイベントがないというのがある。
リストからリンクを開くというのをダブルクリックでできると便利だと思ったが。
リストを選択する処理とリンクを開くボタンを別に用意すれば、開くボタンではリストで選択されているデータのURLにLaunch関数で飛ばせばよいからとてもシンプルだが。
これについて調べたら、onselectイベントでボタンをクリックされた時刻差を測定して、条件分岐すればよいという案があった。
If(And(TappedUrl=Filelist.Selected.Link,
DateDiff(TappedTime,Now(),"Milliseconds")<1000 ),
Launch(TappedUrl);UpdateContext{TappedUrl:""}),
UpdateContext({TappedUrl:Filelist.Selected.Link, TappedTime:Now()}))
onselectイベント発生時にTappedUrlにジャンプ先とTappedTimeに現在時刻を保存し、
次のイベント発生時にジャンプ先が一致し、時間差が一定時刻以内なら飛ぶと。
なお、これをやる場合は、リストボックスの複数選択を切らないとうまくいかない。
複数選択可能だと、選択→選択解除になっちゃうからね。
まぁこの目的でリストボックスを使うなら複数選択にはしないでしょう。
Power Appsはデータを抽出して表示・編集するような用途がメインなんでしょうね。
SharePointリストってようわからん機能だなと思ってはいたけど、この用途ではかなり強力ではある。
整形表示しないとさっぱり使いにくいが、整形表示はPower Appsでできる。
Power AppsもWebページと同じように扱えるので、利便性はそこそこ高いのでは?
ただページを最初に開くときちょっと時間がかかりますけどね。
あと、処理するデータ数が増えると、サーバーに委任するにしても、サーバーから転送するにしても遅くなってしまう。
それがどれぐらいなのかな? というのは気になるところである。