LoginSignup
3
3

More than 3 years have passed since last update.

Power Apps で投票ツールを作る

Last updated at Posted at 2020-09-16

※ データや見た目は一部記事用に改変しています

作ったもの

こんな感じの投票ツールを Power Apps で作りました
👍 ボタンを押すと投票できて、投票数(青文字)を押すと投票したユーザーの一覧を見ることができるツールです
投票ツールの画像

データの持ち方

SharePoint のリストを DB にしました
データの持ち方はこんな感じです

カラム タイプ 説明
番号 1行テキスト 項目の番号を格納します
項目名 1行テキスト 項目の名前を格納します
ユーザー 複数行テキスト 投票したユーザーのメールアドレスを,区切りで格納します

投票数の持ち方は色々あると思うのですが、今回は投票したユーザーを一覧できるようにしたかったのでこんな風にしました
Office365 コネクタを使って、メールアドレスからユーザの名前と写真を引っ張ってきて表示します

Power Apps 側

一覧部分は 挿入 > ギャラリー から「ギャラリー(Gallery」を挿入してアイテムをループで表示します
投票ツールの画像

投票数が多い > 番号が早い 順で表示する

投票数(ユーザー)の持ち方のせいで、ここでけっこう苦戦しました...
SQL 慣れてる人はちょちょい!とできてしまうのかも😅

最終的なコードはこんな感じです

ギャラリー:Items
Sort(
    Sort(
        'リスト名',
        番号,
        Ascending
    ),
    If(
        IsBlank(
            Trim(
                Substitute(
                    Substitute(
                        PlainText(ユーザー),
                        Char(10),
                        ""
                    ),
                    Char(13),
                    ""
                )
            )
        ),
        0,
        CountRows(
            Split(
                Trim(
                    Substitute(
                        Substitute(
                            PlainText(ユーザー),
                            Char(10),
                            ""
                        ),
                        Char(13),
                        ""
                    )
                ),
                ","
            )
        )
    ),
    Descending
)

ポイント① 二重で Sort する

投票数が多い > 番号が早い 順で表示したいので、二重で Sort します
優先度が高いもの(今回で言うと「投票数」)を外側にします

ポイント② 投票数「0」の出し方

はじめは ユーザーカラムの中身を Split => Split したものを CountRows で個数数えて投票数を出す
という風にしていたのですが、 Split だと空の場合も 1 件としてカウントされてしまいます

そこで、 Ifを使って「空白の場合は 0 件」という条件を追加しました

空白の判定にはIsBlankを使う + ユーザーカラムは複数行テキストなので改行・空白を取り除く ようにしました
改行は CR = Char(13) LF = Char(10) です

投票数の算出ロジックは、投票数を表示している箇所・投票数によってテキストの色を変えている箇所も同様です

※ こちら参考にさせていただきました
https://qiita.com/yamad365/items/4f0bec10ae57368173d3

投票する

👍 ボタンを押して投票できるようにしています

Office365ユーザーコネクタのMyProfileV2()を使うと、アプリケーションの画面を見ているユーザーの情報を取得できます
Office365ユーザー.MyProfileV2().mail でメールアドレスを取得して、 SharePoint のリストのユーザーカラムに書き込みます

コードはこんな感じ

投票ボタン:OnSelect
Patch(
    [@'リスト名'],
    LookUp(
        [@'リスト名'],
        番号 = ThisItem.番号
    ),
    If(
        IsBlank(
            LookUp(
                [@'リスト名],
                番号 = ThisItem.番号
            ).ユーザー
        ),
        {ユーザー: Office365ユーザー.MyProfileV2().mail},
        {
            ユーザー: Concatenate(
                LookUp(
                    [@'リスト名'],
                    番号 = ThisItem.番号
                ).ユーザー,
                ",",
                Office365ユーザー.MyProfileV2().mail
            )
        }
    )
)

心残り

投票したときにリアルタイムで投票数・表示順が変わりますが、そのときに Sort が実行されるので表示がちらついてしまいます
不格好なのでなんとかしたかったのですが、Sortが完了するまで表示しないようにするやり方がなさそう(PowerAppsのタイミングに任されている)だったので諦めました
もしこうするといいよ!という方法ご存知の方いらっしゃいましたら、是非教えてほしいです〜〜

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3