こんにちは、あんこ先生です。
職場を楽しくすると、業務品質と生産性が高まるのはご存じですか?
なぜなら、人は楽しんでいるときこそ最大限の力を発揮するからです。
人は何かをやらされていると感じるとやる気は低く、ゴールも無難なところで着地しようとしますよね。
例えば、子供に宿題やお手伝いをさせたいとき、目的を説明しても他にやりたいことを見つけると集中しません。
しぶしぶやらせると、本当びっくりするくらい適当にやります。
そこで、宿題やお手伝いを行うとポイントが貯まり、ちょっとしたサービスと交換できるアプリを作ってみました。
すると、今までなかなか着手しなかった子供が、自ら宿題をはじめ、さらにお手伝いがないか聞いてくるようになりました。
アプリに記録を残すと数値に表れる楽しさと、その対価が動機づけにつながりました。
職場でも同じです。
自分の活動結果が数値に表れる喜びと、アプリの起動を習慣化させることで日々のタスク確認を漏らさなくなりました。
このようにインセンティブポイント制度を絡めたTODOアプリを提供することで、職場が楽しくなり、業務品質と生産性の向上につながります。
この記事では、職場でも使えるポイント制度のお手伝いアプリの作り方をコード付きで紹介します。
職場に導入して、あわよくば自分の評価を高めましょう!
Contents
職場でも使えるポイント制度のお手伝いアプリ
アプリの概要
あらかじめ設定されたToDoリストをチェックすると、その数に応じてポイントが貯まります。
その貯まったポイントを消費して、ご褒美リストからサービスを享受できます。
起動時にユーザーと日付の判定を行います。
その際、日付や月が異なる場合は、日次・月次更新を行います。
機能要件
- ユーザーごとに操作、集計できる。
- ToDoリスト、ご褒美リストは追加・削除できる。
- ToDoは1日のチェック上限を10件とする。
- ご褒美は毎月の利用上限をサービスごとに設定できる。
- ご褒美の利用は管理者に通知される。
データソース
- マスター
- ToDoリストマスター M_WorkList
- カテゴリマスター M_WorkCategory
- ご褒美リストマスター M_RewardList
- テーブル
- 当日ToDo実施記録 T_WorkLog
- 更新後ポイント記録 T_Total
- 当月ご褒美利用記録 T_RewardLog
拡張性を持たせるためにカテゴリーマスターも作っていますが今回は使いません。
起動時ユーザー判定、日次更新等の作り方
OnVisibleプロパティを利用して起動時にユーザー判定と日次更新等を行います。
複数のスクリーンを移動する場合は、OnStartプロパティに設定します。
起動時に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に格納すればそのまま動きます。
タイトル周りの作り方
画面上部、タイトル周りを作っていきます。
コントロールと階層
使っているコントロールと階層は次の通りです。
プロパティとコード
各コントロールに設定するプロパティとコードは次の通りです。
アプリタイトルです。
"おてつだいアプリ"
ユーザーあてのメッセージです。T_WorkLogが10件に達したらメッセージが変わります。
If(CountRows(Filter(T_WorkLog,Date=Today(),Character=_user).Point)=10,
"10ポイントゲットしました。またあしたチャレンジしよう!",
"1日10ポイントまでつきます。"
)
ユーザー名です。
"for "&_user&"ちゃん"
日付を変更できないよう設定します。
DisplayMode.View
曜日も表示するように設定します。
DateTimeFormat.LongDate
ToDoリストの作り方
画面左側、ToDoリストを作っていきます。
コントロールと階層
使っているコントロールと階層は次の通りです。
プロパティとコード
各コントロールに設定するプロパティとコードは次の通りです。
見た目の問題で、スクロールバーの表示はオフ、ナビゲーションの表示はオンにします。
データソースを指定しています。
M_WorkList
本日、ユーザーごとにToDoを10件チェック(T_WorkLogのレコードが10)されると、編集不可にする処理です。
If(CountRows(Filter(T_WorkLog,Date=Today(),Character=_user).Point)=10,
DisplayMode.Disabled,
DisplayMode.Edit
)
初期値の設定です。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))
ToDoリストの項目名を指定します。
ThisItem.HelpName
ポイント増減処理の仕組み
ポイントの増加
チェックボックス(Checkbox01)に連動して、T_WorkLogにレコードを追加、削除します。
オンならT_WorkLogにレコードが追加され、きょうのポイントのハートがひとつ増えます。
また、ごうけいが増えます。
オフならその逆の処理をします。
ポイントの減少
ご褒美リストのチェックボックス(Checkbox02)に連動して、T_RewardLogにレコードを追加、削除します。
オンならT_RewardLogにレコードが追加され、ごうけいから引かれます。
オフならその逆の処理をします。
合計の計算式
本日のポイントT_WorkLogと前日までの累計ポイントT_Totalから、当月消費ポイントT_RewardLogを引いた値です。
サンプルは実施件数=ポイントに設定しています。
そのため、項目ごとに異なるポイントを設定すると、ポイント数とハートの数が合わなくなります。
きょうのポイントの作り方
きょうのポイント欄を作っていきます。
コントロールと階層
使っているコントロールと階層は次の通りです。
プロパティとコード
各コントロールに設定するプロパティとコードは次の通りです。
タイトルです。
"きょうのポイント"
今回はポイントの合計を10件に設定しているため、縦型の折り返しの数を5に設定します。
テンプレートには色をつけたハートアイコンを設置します。
Sequence関数を使って、T_WorkLogのレコード数分生成します。
下地となるGalleryBackのハートと重なり、色がついたように見えます。
Sequence(CountRows(Filter(T_WorkLog,Date=Today(),Character=_user).Character))
GalleryFrontと同じように、縦型の折り返しの数を5に設定します。
テンプレートにはグレーのハートアイコンを設置します。
Sequence関数を使って、10レコード分生成します。
Sequence(10)
ごうけいの作り方
ごうけい欄を作っていきます。
コントロールと階層
使っているコントロールと階層は次の通りです。
プロパティとコード
各コントロールに設定するプロパティとコードは次の通りです。
現時点の合計ポイントを表示します。
本日のポイント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
タイトルです。
"ごうけい"
交換リストの作り方
交換リストを作っていきます。
コントロールと階層
使っているコントロールと階層は次の通りです。
プロパティとコード
各コントロールに設定するプロパティとコードは次の通りです。
タイトルです。
"ポイント
こうかん"
変数_rewardをtrueにします。これでContainer3が表示されます。
Set(_reward,true)
交換リストのコンテナです。
Icon01が押されると表示され、Icon02が押されると非表示になります。
_reward
タイトルです。
"ごほうびこうかん"
変数_rewardをfalseにします。これでContainer3が非表示になります。
Set(_reward,false)
見た目の問題で、スクロールバーの表示はオフ、ナビゲーションの表示はオンにします。
Sequence関数を使って、10レコード分生成します。
M_RewardList
ご褒美リストの項目名を指定します。
ThisItem.PresentName
ご褒美リストのポイントを指定します。
わかりやすくするために”Pt”を追加しています。
ThisItem.Point&"Pt"
ご褒美リストの交換上限から当月利用分を引いた値、つまり残り交換可能回数を表示します。
"あと"&Text(ThisItem.Limit-
CountRows(Filter(T_RewardLog,Character=_user,Title=ThisItem.Title)),"00")
&"回"
初期値の設定です。T_RewardLogにそのレコードがあればオンになります。
!IsBlank(LookUp(Filter(T_RewardLog,Character=_user),PresentName=ThisItem.Title))
オンにするとT_RewardLogにレコードを追加します。
重複しない仕組みですが、念のため判定しています。
また、変数_checkBoxをtrueにします。これで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))
結果表示と通知の作り方
交換リストを作っていきます。通知させたい場合は、ボタンにコードを追加してください。
通知についてはこちらの記事で詳しく解説しています。
コントロールと階層
使っているコントロールと階層は次の通りです。
プロパティとコード
各コントロールに設定するプロパティとコードは次の通りです。
結果表示のコンテナです。他の操作をさせないようスクリーン全体に広げています。
CheckBox02が押されると表示され、Button01が押されると非表示になります。
_checkBox
消費ポイントとどのご褒美を選んだかを表示します。
Gallery02.Selected.Point&" ポイントをつかって
"&Gallery02.Selected.PresentName&" とこうかんしました。"
変数_checkBoxをfalseにします。これでContainer4が非表示になります。
Set(_checkBox,false)
まとめ
この記事では、職場でも使えるポイント制度のお手伝いアプリの作り方をコード付きで紹介しました。
子供の動機付け用にとりあえず作ってみたため、回りくどい表現や不要な機能もありますので、カスタマイズしてご利用ください。
さっそく職場に導入して、部下のやる気と自分の評価を高めましょう!
追記
どうしてもハートを塗りつぶしたかったので2時間くらいかけてSVGで作った結果、とても満足できました。
やった分だけ見返りが期待できるという単純な仕組みです。