PowerApps│感謝を送り合う社内SNSアプリの作り方 ⑥マイページと集計

こんにちは、あんこ先生です。

前回まででSNSらしい機能がひととおり揃いました。

投稿して、タイムラインで見て、いいねを押して、コメントもできる。

ここからは「自分の記録を振り返る」部分を作っていきます。

今回はマイページです。

自分が送ったありがとうの数、受け取った数、そして最近もらったメッセージを並べましょう。

この記事で作るもの
・プロフィール表示(名前・部署・メールアドレス)
・送ったありがとうの数、受け取った数(どちらも累計)
・最近受け取ったメッセージの一覧

まだ読んでいない人は、先にコメント機能の回から順に進めておいてくださいね。

数える場所は、ひとつだけ

作りはじめる前に、この画面のいちばん大事な考え方を確認しておきましょう。

第1回で、こんな話をしたのを覚えているでしょうか。

「送った数・受け取った数を覚えておくリストは作らない」

その理由が、ここでようやく分かります。

図解を貼り付ける:マイページに出る数字(送った数・受け取った数・最近もらった一覧)が、すべてPostsリストを見る向きを変えるだけで出せることを示した構造図。zukai_mypage_count.png を使用。

送ったありがとうは、登録者 が自分の投稿を数えればいい。

受け取ったありがとうは、送信先 が自分の投稿を数えればいい。

最近もらったメッセージも、同じ絞り込みを新しい順に並べるだけ。

つまり全部 Posts から出せるんですね。

ここが個人的に一番おもしろい:数えるほうが、覚えるより強い
「送った数」を専用の列や別リストに覚えさせる作りも、もちろん作れます。でも、そうすると投稿するたびに数字を足す処理が必要になりますよね。そして足し忘れたり、二重に足したり、投稿を消したのに数字が減らなかったり。覚えさせた数字は、いつかズレます
いっぽう「そのとき数える」なら、投稿が真実です。何度見ても正しい。しかも累計をリセットする仕組みも要りません。投稿が残っているかぎり、数字も残りますからね。ちなみに、いいね数だけは逆に「持たせる」選択をしました。あちらは一覧に何十行も並ぶので、行ごとに数えると重くなるからです。1画面に1つだけの数字なら数える、たくさん並ぶなら持たせる。この使い分けが目安になりますよ。

画面を用意する

新しい画面を追加して、名前を scrMyPage にします。

第2回のボトムメニューで、行き先として名前だけ作っておいた画面ですね。

OnVisible には、この画面で使うデータの準備を書きます。

//画面 scrMyPage の OnVisible(表示に必要なものを先に用意する)
//プロフィールは1回だけ取得して変数へ。毎回コネクタを呼ばないようにする
//受け取ったメッセージは、送信先が自分の投稿を新しい順に取っておく
Set(
    glbMyProfile,
    Office365ユーザー.UserProfileV2(User().Email)
);

ClearCollect(
    colReceived,
    SortByColumns(
        Filter(Posts, ToUser.Email = User().Email),
        "Created",
        SortOrder.Descending
    )
)

glbMyProfile には、自分のプロフィールを入れています。

colReceived は、自分が受け取った投稿の一覧です。

この一覧、あとで2つの用途に使い回します。あとで種明かししますね。

プロフィールを表示する

画面の上に、自分の情報を出しましょう。

コンテナ conProfile を置いて、その中に並べていきます。

コントロールプロパティ設定する式
avaMeImageLookUp(glbMembers, Email = User().Email).Picture
lblMyNameTextglbMyProfile.displayName
lblMyDeptTextglbMyProfile.department
lblMyMailTextglbMyProfile.mail

名前・部署・メールアドレスは、Office365ユーザー コネクタから取れます。

コネクタの使い方は、全社員を把握!Office365ユーザー&グループコネクタの使い方にまとめてあります。

部署名はSharePointに持たない

ここで、ひとつ設計の話を。

部署名をSharePointのリストに持たせる作りも考えられますが、今回はやめました。

異動があるたびに、リストの中身を直して回るのは大変ですからね。

Microsoft 365 側の情報を見にいけば、組織の情報が変われば自動で追従します

ひとことメモ:部署が空欄で出るときは
department が空っぽで表示されることがあります。これは Microsoft 365 のユーザー情報に部署が登録されていないケースがほとんどです。管理者の方に、ユーザーのプロパティを設定してもらってくださいね。なお、V2のコネクタはプロパティ名がすべて小文字はじまりです。Department と書くと取れないので気をつけてください。

アバターはコネクタを呼ばない

アバターの画像に注目してください。

//アバター avaMe の Image(第1回で取得済みの一覧から自分を探す)
//コネクタを呼び直さないので、そのぶん表示が軽くなる
LookUp(glbMembers, Email = User().Email).Picture

じつは Office365ユーザー コネクタで写真を取り直すこともできます。

でも、第1回の App.OnStartglbMembers に部署メンバー全員の写真を入れておいたんでしたよね。

自分もそのメンバーのひとりですから、そこから探すほうが早いわけです。

コネクタの呼び出しは1回1回が通信なので、減らせるところは減らしておくと画面がキビキビ動きますよ。

ふたつの数字を出す

いよいよ本題の集計です。

コンテナを2つ並べて、それぞれに数字とラベルを入れます。

送ったありがとうの数

//ラベル lblSentNum の Text(自分が送った数=登録者が自分の投稿を数える)
Text(CountRows(Filter(Posts, Author.Email = User().Email)))

Filter で自分の投稿に絞って、CountRows で数えるだけ。

絞り込んだデータの扱い方は、複写!抽出!追加!結合!コレクションの加工方法もどうぞ。

それだけで「今までに送ったありがとうの累計」になります。

受け取ったありがとうの数

//ラベル lblRecvNum の Text(受け取った数)
//OnVisible で取得済みのコレクションを数えるだけなので、問い合わせが増えない
Text(CountRows(colReceived))

こちらは、さきほど OnVisible で用意した colReceived を数えています。

Posts をもう一度絞ってもいいのですが、それだと同じ問い合わせを2回することになりますよね。

一覧を出すために取ってきたものを、数えるのにも使う。これがさっき言った「2つの用途」です。

ひとことメモ:色を分けると伝わりやすい
送った数と受け取った数、同じ見た目だとどっちがどっちか分かりにくいんですよね。わたしは送ったほうを青、受け取ったほうをオレンジにしました。数字は Size を28くらいにして、FontWeightBold に。ここは思いきり大きくしたほうが、開いたときにうれしくなりますよ。

色の指定はこちらです。

ラベルColor
lblSentNum(送った数)RGBA(0, 120, 212, 1)
lblRecvNum(受け取った数)RGBA(224, 100, 40, 1)

最近もらったメッセージを並べる

最後に、受け取ったありがとうを一覧で出します。

ギャラリーを置いて名前を galReceived にして、レイアウトは「縦(可変の高さ)」。

Items には colReceived を指定します。

コントロールプロパティ設定する式
avaFromImageThisItem.登録者.Picture
lblFromText送り主の名前と相対時刻
lblFromAutoHeighttrue
lblFromBodyTextThisItem.Body
lblFromBodyAutoHeighttrue
lblFromBodyYlblFrom.Y + lblFrom.Height + 2
recRecvDividerYlblFromBody.Y + lblFromBody.Height + 10

もうおなじみの形ですね。

AutoHeight で伸ばして、Y座標はひとつ上の下端から積む。

第2回で覚えたことが、これで3つめの画面でも使えました。

送り主の名前と時刻は、コメント一覧のときと同じ式を使えます。

並び順に気をつける

ひとつだけ、注意点を。

OnVisibleSortByColumns で、Created の降順に並べています。

ここで「新しい順」にしておかないと、マイページを開いたときに何年も前のメッセージが最初に出てくることになります。

「最近受け取った」と見出しに書いているのに古いものが並ぶと、ちょっとがっかりですよね。

ここが落とし穴:並べ替えは取得のときに
ギャラリーの ItemsSortByColumns を書く方法もあります。ただ、今回のように同じデータを数えるのにも使う場合は、取得のときに並べておくほうがすっきりします。コレクションに入れる段階で整えておけば、あとは使うだけ。「加工は入口で済ませて、出口では使うだけ」にすると、あとから読み返したときに分かりやすいですよ。
スクショを貼り付ける:完成したマイページ。上にプロフィール、その下に送った数と受け取った数のカードが2枚並び、下に最近受け取ったメッセージが表示されている状態。

まとめ

今回はここまでにしましょう。

・送った数も受け取った数も、Posts を絞って数えるだけ。専用のリストも列もいらない。
・数えて出すから、数字がズレない。累計のリセットも不要。
・一覧を出すために取ったコレクションは、数えるのにも使い回す。
・部署名は Microsoft 365 側から取ると、異動があっても直さなくていい。
・アバターは glbMembers から探せば、コネクタを呼ばずに済む。

次の一手として、次回はいよいよ最後の画面、ランキングを作ります。

部署のみんなの中で、誰がいちばんありがとうを送ったか、受け取ったか。

今回の「数える」考え方を、全員ぶんに広げる回ですね。

集計の書き方で少しクセのあるところが出てくるので、そこもあわせて解説します。

それでは、また次の記事でお会いしましょう。

ABOUT US
七草あんこ
非IT系中間管理職やってます。社命によりoffice365を主軸とした業務改善プロジェクトメンバーに任命されたことでPowerAppsと出会えました。いまではビジネス・プライベートを問わず、欠かせないツールになっています。導入初期やアプリ作成時に遭遇した諸問題の解決法とサンプルアプリの作り方を紹介していきます。主にTwitterで情報収集しているので不明点など呟いているとお邪魔するかもしれません。