こんにちは、あんこ先生です。
前回まででSNSらしい機能がひととおり揃いました。
投稿して、タイムラインで見て、いいねを押して、コメントもできる。
ここからは「自分の記録を振り返る」部分を作っていきます。
今回はマイページです。
自分が送ったありがとうの数、受け取った数、そして最近もらったメッセージを並べましょう。
まだ読んでいない人は、先にコメント機能の回から順に進めておいてくださいね。
数える場所は、ひとつだけ

作りはじめる前に、この画面のいちばん大事な考え方を確認しておきましょう。
第1回で、こんな話をしたのを覚えているでしょうか。
「送った数・受け取った数を覚えておくリストは作らない」
その理由が、ここでようやく分かります。
送ったありがとうは、登録者 が自分の投稿を数えればいい。
受け取ったありがとうは、送信先 が自分の投稿を数えればいい。
最近もらったメッセージも、同じ絞り込みを新しい順に並べるだけ。
つまり全部 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 を置いて、その中に並べていきます。
| コントロール | プロパティ | 設定する式 |
|---|---|---|
| avaMe | Image | LookUp(glbMembers, Email = User().Email).Picture |
| lblMyName | Text | glbMyProfile.displayName |
| lblMyDept | Text | glbMyProfile.department |
| lblMyMail | Text | glbMyProfile.mail |
名前・部署・メールアドレスは、Office365ユーザー コネクタから取れます。
コネクタの使い方は、全社員を把握!Office365ユーザー&グループコネクタの使い方にまとめてあります。
部署名はSharePointに持たない
ここで、ひとつ設計の話を。
部署名をSharePointのリストに持たせる作りも考えられますが、今回はやめました。
異動があるたびに、リストの中身を直して回るのは大変ですからね。
Microsoft 365 側の情報を見にいけば、組織の情報が変われば自動で追従します。
アバターはコネクタを呼ばない
アバターの画像に注目してください。
//アバター avaMe の Image(第1回で取得済みの一覧から自分を探す) //コネクタを呼び直さないので、そのぶん表示が軽くなる LookUp(glbMembers, Email = User().Email).Picture
じつは Office365ユーザー コネクタで写真を取り直すこともできます。
でも、第1回の App.OnStart で glbMembers に部署メンバー全員の写真を入れておいたんでしたよね。
自分もそのメンバーのひとりですから、そこから探すほうが早いわけです。
コネクタの呼び出しは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つの用途」です。
色の指定はこちらです。
| ラベル | Color |
|---|---|
| lblSentNum(送った数) | RGBA(0, 120, 212, 1) |
| lblRecvNum(受け取った数) | RGBA(224, 100, 40, 1) |
最近もらったメッセージを並べる
最後に、受け取ったありがとうを一覧で出します。
ギャラリーを置いて名前を galReceived にして、レイアウトは「縦(可変の高さ)」。
Items には colReceived を指定します。
| コントロール | プロパティ | 設定する式 |
|---|---|---|
| avaFrom | Image | ThisItem.登録者.Picture |
| lblFrom | Text | 送り主の名前と相対時刻 |
| lblFrom | AutoHeight | true |
| lblFromBody | Text | ThisItem.Body |
| lblFromBody | AutoHeight | true |
| lblFromBody | Y | lblFrom.Y + lblFrom.Height + 2 |
| recRecvDivider | Y | lblFromBody.Y + lblFromBody.Height + 10 |
もうおなじみの形ですね。
AutoHeight で伸ばして、Y座標はひとつ上の下端から積む。
第2回で覚えたことが、これで3つめの画面でも使えました。
送り主の名前と時刻は、コメント一覧のときと同じ式を使えます。
並び順に気をつける
ひとつだけ、注意点を。
OnVisible の SortByColumns で、Created の降順に並べています。
ここで「新しい順」にしておかないと、マイページを開いたときに何年も前のメッセージが最初に出てくることになります。
「最近受け取った」と見出しに書いているのに古いものが並ぶと、ちょっとがっかりですよね。
まとめ
今回はここまでにしましょう。
・送った数も受け取った数も、Posts を絞って数えるだけ。専用のリストも列もいらない。
・数えて出すから、数字がズレない。累計のリセットも不要。
・一覧を出すために取ったコレクションは、数えるのにも使い回す。
・部署名は Microsoft 365 側から取ると、異動があっても直さなくていい。
・アバターは glbMembers から探せば、コネクタを呼ばずに済む。
次の一手として、次回はいよいよ最後の画面、ランキングを作ります。
部署のみんなの中で、誰がいちばんありがとうを送ったか、受け取ったか。
今回の「数える」考え方を、全員ぶんに広げる回ですね。
集計の書き方で少しクセのあるところが出てくるので、そこもあわせて解説します。
それでは、また次の記事でお会いしましょう。















・送ったありがとうの数、受け取った数(どちらも累計)
・最近受け取ったメッセージの一覧