PowerApps│ポイント制度でモチベアップ!職場でも使えるお手伝いアプリ

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

職場を楽しくすると、業務品質と生産性が高まるのはご存じですか?

なぜなら、人は楽しんでいるときこそ最大限の力を発揮するからです。

人は何かをやらされていると感じるとやる気は低く、ゴールも無難なところで着地しようとしますよね。

例えば、子供に宿題やお手伝いをさせたいとき、目的を説明しても他にやりたいことを見つけると集中しません。

しぶしぶやらせると、本当びっくりするくらい適当にやります。

そこで、宿題やお手伝いを行うとポイントが貯まり、ちょっとしたサービスと交換できるアプリを作ってみました。

すると、今までなかなか着手しなかった子供が、自ら宿題をはじめ、さらにお手伝いがないか聞いてくるようになりました。

アプリに記録を残すと数値に表れる楽しさと、その対価が動機づけにつながりました。

職場でも同じです。

自分の活動結果が数値に表れる喜びと、アプリの起動を習慣化させることで日々のタスク確認を漏らさなくなりました。

このようにインセンティブポイント制度を絡めたTODOアプリを提供することで、職場が楽しくなり、業務品質と生産性の向上につながります。

この記事では、職場でも使えるポイント制度のお手伝いアプリの作り方をコード付きで紹介します。

職場に導入して、あわよくば自分の評価を高めましょう!

職場でも使えるポイント制度のお手伝いアプリ

アプリの概要

あらかじめ設定されたToDoリストをチェックすると、その数に応じてポイントが貯まります。

その貯まったポイントを消費して、ご褒美リストからサービスを享受できます。

起動時にユーザーと日付の判定を行います。

その際、日付や月が異なる場合は、日次・月次更新を行います。

やった分だけ見返りが期待できるという単純な仕組みです。

機能要件

  • ユーザーごとに操作、集計できる。
  • ToDoリスト、ご褒美リストは追加・削除できる。
  • ToDoは1日のチェック上限を10件とする。
  • ご褒美は毎月の利用上限をサービスごとに設定できる。
  • ご褒美の利用は管理者に通知される。

データソース

  • マスター
    • ToDoリストマスター M_WorkList
    • カテゴリマスター M_WorkCategory
    • ご褒美リストマスター M_RewardList
  • テーブル
    • 当日ToDo実施記録 T_WorkLog
    • 更新後ポイント記録 T_Total
    • 当月ご褒美利用記録 T_RewardLog

拡張性を持たせるためにカテゴリーマスターも作っていますが今回は使いません。

起動時ユーザー判定、日次更新等の作り方

OnVisibleプロパティを利用して起動時にユーザー判定と日次更新等を行います。

複数のスクリーンを移動する場合は、OnStartプロパティに設定します。

Screen01

起動時にOffice365ユーザー.MyProfileV2().displayNameを使ってユーザーを判定しつつ、今後もたくさん使うので変数_userに落とし込みます。

日次更新はT_WorkLogの日付とToday関数を照合しさせ、異なっていれば1日分のポイント合計をT_Totalに追加します。

月次更新はT_RewardLogの月とToday関数の月を照合しさせ、異なっていれば1か月分の消費ポイント合計をT_Totalに追加します。

//ユーザー判定と変数初期化
Set(_user,Office365ユーザー.MyProfileV2().displayName);
Set(_reward,false);
Set(_checkBox,false);

//日次更新
If(Today()>First(Filter(T_WorkLog,Character=_user)).Date,
    Patch(T_Total,
        {
            Date:First(T_WorkLog).Date,
            Title:_user,
            Point:Sum(Filter(T_WorkLog,Character=_user),Point)
        }
    );
    //月次更新
    If(Month(Today())>Month(First(Filter(T_RewardLog,Character=_user)).Date) && !IsBlank(Filter(T_RewardLog,Character=_user)),
        Patch(T_Total,First(Sort(Filter(T_Total,Title=_user),Date,Descending)),
            {
                Point:Sum(Filter(T_WorkLog,Character=_user),Point)-Sum(Filter(T_RewardLog,Character=_user),Point)
            }
        );
    RemoveIf(T_RewardLog,Character=_user)
    );

    RemoveIf(T_WorkLog,Character=_user,Date<Today())
);


ユーザーを任意で変更させたい場合、ドロップダウンコントロールなどで選択した戻り値を変数_userに格納すればそのまま動きます。

タイトル周りの作り方


画面上部、タイトル周りを作っていきます。


コントロールと階層

使っているコントロールと階層は次の通りです。


プロパティとコード

各コントロールに設定するプロパティとコードは次の通りです。

LabelTitle

アプリタイトルです。

"おてつだいアプリ"
LabelMessage

ユーザーあてのメッセージです。T_WorkLogが10件に達したらメッセージが変わります。

If(CountRows(Filter(T_WorkLog,Date=Today(),Character=_user).Point)=10,
    "10ポイントゲットしました。またあしたチャレンジしよう!",
    "1日10ポイントまでつきます。"
)
LabelUser

ユーザー名です。

"for "&_user&"ちゃん"
DatePicker01

日付を変更できないよう設定します。

DisplayMode.View

曜日も表示するように設定します。

DateTimeFormat.LongDate

ToDoリストの作り方


画面左側、ToDoリストを作っていきます。


コントロールと階層

使っているコントロールと階層は次の通りです。


プロパティとコード

各コントロールに設定するプロパティとコードは次の通りです。

Gallery01

見た目の問題で、スクロールバーの表示オフナビゲーションの表示オンにします。

データソースを指定しています。

M_WorkList

本日、ユーザーごとにToDoを10件チェックT_WorkLogのレコードが10)されると、編集不可にする処理です。

If(CountRows(Filter(T_WorkLog,Date=Today(),Character=_user).Point)=10,
    DisplayMode.Disabled,
    DisplayMode.Edit
)
Checkbox01

初期値の設定です。T_WorkLogにそのレコードがあればオンになります。

!IsBlank(LookUp(Filter(T_WorkLog,Date=Today(),Character=_user),HelpName=ThisItem.Title))

オンにするとT_WorkLogにレコードを追加します。

重複しない仕組みですが、念のため判定しています。

If(IsBlank(LookUp(Filter(T_WorkLog,Date=Today(),Character=_user),HelpName=ThisItem.Title)),
    Patch(T_WorkLog,
        {
            Character:_user,
            HelpName:ThisItem.Title,
            Date:Today(),
            Point:ThisItem.Point
        }
    ),
    Patch(T_WorkLog,LookUp(Filter(T_WorkLog,Date=Today(),Character=_user),HelpName=ThisItem.Title),
        {
            Character:_user,
            HelpName:ThisItem.Title,
            Date:Today(),
            Point:ThisItem.Point
        }
    )
)

オフにするとT_WorkLogからレコードを削除します。

Remove(T_WorkLog,LookUp(Filter(T_WorkLog,Date=Today(),Character=_user),HelpName=ThisItem.Title))
Label01

ToDoリストの項目名を指定します。

ThisItem.HelpName

ポイント増減処理の仕組み


ポイントの増加

チェックボックス(Checkbox01)に連動して、T_WorkLogにレコードを追加、削除します。

オンならT_WorkLogにレコードが追加され、きょうのポイントのハートがひとつ増えます。
また、ごうけいが増えます。

オフならその逆の処理をします。


ポイントの減少

ご褒美リストのチェックボックス(Checkbox02)に連動して、T_RewardLogにレコードを追加、削除します。

オンならT_RewardLogにレコードが追加され、ごうけいから引かれます。

オフならその逆の処理をします。


合計の計算式

本日のポイントT_WorkLogと前日までの累計ポイントT_Totalから、当月消費ポイントT_RewardLogを引いた値です。

サンプルは実施件数=ポイントに設定しています。
そのため、項目ごとに異なるポイントを設定すると、ポイント数とハートの数が合わなくなります。

きょうのポイントの作り方

きょうのポイント欄を作っていきます。


コントロールと階層

使っているコントロールと階層は次の通りです。


プロパティとコード

各コントロールに設定するプロパティとコードは次の通りです。

Label02

タイトルです。

"きょうのポイント"
GalleryFront

今回はポイントの合計を10件に設定しているため、縦型折り返しの数を5に設定します。

テンプレートには色をつけたハートアイコンを設置します。

Sequence関数を使って、T_WorkLogのレコード数分生成します。

下地となるGalleryBackのハートと重なり、色がついたように見えます。

Sequence(CountRows(Filter(T_WorkLog,Date=Today(),Character=_user).Character))
GalleryBack

GalleryFrontと同じように、縦型折り返しの数を5に設定します。

テンプレートにはグレーのハートアイコンを設置します。

Sequence関数を使って、10レコード分生成します。

Sequence(10)

ごうけいの作り方

ごうけい欄を作っていきます。


コントロールと階層

使っているコントロールと階層は次の通りです。


プロパティとコード

各コントロールに設定するプロパティとコードは次の通りです。

LabelTotal

現時点の合計ポイントを表示します。

本日のポイントT_WorkLogと前日までの累計ポイントT_Totalから、当月消費ポイントT_RewardLogを引いた値を表示します。

Sum(Filter(T_WorkLog,Character=_user),Point)+
Sum(Filter(T_Total,Title=_user),Point)-
Sum(Filter(T_RewardLog,Character=_user),Point)+0
Label03

タイトルです。

"ごうけい"

交換リストの作り方

交換リストを作っていきます。


コントロールと階層

使っているコントロールと階層は次の通りです。


プロパティとコード

各コントロールに設定するプロパティとコードは次の通りです。

Label04

タイトルです。

"ポイント
こうかん"
Icon01

変数_rewardtrueにします。これでContainer3が表示されます。

Set(_reward,true)
Container3

交換リストのコンテナです。

Icon01が押されると表示され、Icon02が押されると非表示になります。

_reward
Label05

タイトルです。

"ごほうびこうかん"
Icon02

変数_rewardfalseにします。これでContainer3が非表示になります。

Set(_reward,false)
Gallery02

見た目の問題で、スクロールバーの表示オフナビゲーションの表示オンにします。

Sequence関数を使って、10レコード分生成します。

M_RewardList
Label06

ご褒美リストの項目名を指定します。

ThisItem.PresentName
Label07

ご褒美リストのポイントを指定します。

わかりやすくするために”Pt”を追加しています。

ThisItem.Point&"Pt"
Label08

ご褒美リストの交換上限から当月利用分を引いた値、つまり残り交換可能回数を表示します。

"あと"&Text(ThisItem.Limit-
CountRows(Filter(T_RewardLog,Character=_user,Title=ThisItem.Title)),"00")
&"回"
Checkbox02

初期値の設定です。T_RewardLogにそのレコードがあればオンになります。

!IsBlank(LookUp(Filter(T_RewardLog,Character=_user),PresentName=ThisItem.Title))

オンにするとT_RewardLogにレコードを追加します。

重複しない仕組みですが、念のため判定しています。

また、変数_checkBoxtrueにします。これでContainer4が表示されます。

If(IsBlank(LookUp(Filter(T_RewardLog,Date=Today(),Character=_user),Title=ThisItem.PresentName)),
    Patch(T_RewardLog,
        {
            Character:_user,
            Title:ThisItem.PresentName,
            Date:Today(),
            Point:ThisItem.Point
        }
    ),
    Patch(T_RewardLog,LookUp(Filter(T_RewardLog,Date=Today(),Character=_user),Title=ThisItem.PresentName),
        {
            Character:_user,
            Title:ThisItem.PresentName,
            Date:Today(),
            Point:ThisItem.Point
        }
    )
);
Set(_checkBox,true)

オフにするとT_RewardLogからレコードを削除します。

Remove(T_RewardLog,LookUp(Filter(T_RewardLog,Date=Today(),Character=_user),Title=ThisItem.PresentName))

結果表示と通知の作り方

交換リストを作っていきます。通知させたい場合は、ボタンにコードを追加してください。

通知についてはこちらの記事で詳しく解説しています。


コントロールと階層

使っているコントロールと階層は次の通りです。


プロパティとコード

各コントロールに設定するプロパティとコードは次の通りです。

Container3

結果表示のコンテナです。他の操作をさせないようスクリーン全体に広げています。

CheckBox02が押されると表示され、Button01が押されると非表示になります。

_checkBox
Label09

消費ポイントとどのご褒美を選んだかを表示します。

Gallery02.Selected.Point&" ポイントをつかって
"&Gallery02.Selected.PresentName&" とこうかんしました。"
Button01

変数_checkBoxfalseにします。これでContainer4が非表示になります。

Set(_checkBox,false)

まとめ

この記事では、職場でも使えるポイント制度のお手伝いアプリの作り方をコード付きで紹介しました。

子供の動機付け用にとりあえず作ってみたため、回りくどい表現や不要な機能もありますので、カスタマイズしてご利用ください。

さっそく職場に導入して、部下のやる気と自分の評価を高めましょう!

追記

どうしてもハートを塗りつぶしたかったので2時間くらいかけてSVGで作った結果、とても満足できました。

アイキャッチ-コントロール

ご支援よろしくおねがいします

この記事を気に入ってくださった方、寄付してあげてもいいよという方がいらっしゃっいましたら、ご支援いただけると助かります。

下記リンクからAmazonギフト券で、金額は15円からお気持ちを入力してください。

受取人のメールアドレスは amazon@anko7793.com までお願いします。

メッセージもいただけるとたいへん喜びます。

よろしくお願いします。

Amazonギフト券(Eメールタイプ) 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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