こんにちは、あんこ先生です。
ギャラリーにリスト以外を与えた場合、情報が足りないことがありますよね。
テンプレートにひとつずつ設定してもいいのですが、二次利用としての使い勝手がいまいちです。
逆を言えば、最初に必要なデータが含まれていれば使い勝手が飛躍的に向上するってことですね。
そこで、今回はAddColumns関数を使って入力データを加工する方法をコード付きで解説します。
これができたら脱初心者!
Contents
AddColumns関数を使って入力データを加工する方法
お弁当注文アプリで動作を学ぶ
例示としてお弁当注文アプリを用いて説明しますね。
各ユーザーが出勤日のお弁当を注文するアプリです。
最終的にこのアウトプットで給与から利用料金を天引きします。
機能要件は次のとおりです。
- 本日を含む向こう1週間分注文できる
- 注文済みの内容を確認できる
- 注文を取り消すことができる
- 朝、昼、夜、不要の中からひとつを選択できる
- ユーザーごとに設定された固定注文内容を初期値にできる
ポイントはユーザー目線の固定注文ですね。
例えば日勤の人は昼、夜勤の人は夜を初期値とします。
変更がなければそのまま注文するだけなので操作が楽ですね。
ではこのアプリを作るための下準備を進めていきましょう。
下準備┃ユーザー情報と注文内容一覧
今回使用するリストは2つです。
ひとつめはユーザーごとの設定値を保存するリストです。
社員名と固定注文内容の2つの列で構成しています。
本来はUser関数やログイン画面などでユーザーを特定し、その人ごとの設定値を使います。
今回はサンプルなので直接変数に埋め込みしておきましょう。
Set(glb社員,
{社員名:"七草あんこ",
固定:"昼"}
)
可視化すると次の通りです。
ふたつめは注文内容を保存するリストです。
名前は注文内容一覧としておきます。
注文日、社員名、注文内容、そして受取の4つの列で構成しています。
内部名はそれぞれ、Date、Name、OrderItem、Getになります。
注文内容は選択肢列となっているのがポイントで、朝、昼、夜、不要の4つが設定されています。
動作確認だけであればコレクションに落とし込んで構いません。
選択肢列の挙動を確認する場合はリストを作ってみてください。
これで下準備は完了です。
向こう1週間分のカレンダー作成
このアプリの目的はユーザーごとの注文情報を備蓄することです。
しかし、注文内容一覧をギャラリーに指定しても注文してない日は表示されません。
そこで向こう1週間分のカレンダーをSequence関数で作ります。
DateAdd(Today(),Sequence(7,0),TimeUnit.Days)
これでこのギャラリーに指定されたテーブルは次のようになります。
でも待ってください。中には日付しかありません。
これでは注文してるかどうかもわかりません。
そこでAddColumns関数の出番です。
AddColumns関数は元となるテーブルに列を追加する関数です。
はじめに注文しているかを判定する列を注文内容一覧から持ってきます。
AddColumns関数ははじめに列を加えたいテーブルを指定して、次に追加する新しい列名とその中身を記載します。
何を注文したかの情報が必要なため、注文列に注文内容一覧から現ユーザーがその日に注文したものを引っ張ってきます。
AddColumns(
DateAdd(Today(),Sequence(7,0),TimeUnit.Days) As tbl,
"注文",LookUp(T_注文一覧,注文日=tbl.Value,注文)
)
これで注文列に注文内容が保存されます。
なお、As tbl の部分はこのテーブルの名付けです。
後工程でこのテーブルの値を参照する際に使います。
それでは可視化してみましょう。
注文があるところにアイコンがありますね。
これは入れ子のテーブルであることを示しています。
元の注文列は選択肢列なのでテーブルが入ってます。
その中身を見るとValue列に不要が入っているのがわかりますね。
次にユーザーごとの固定注文設定を固定列に追加しましょう。
こちらは無条件で値を入れるため直接指定します。
AddColumns(
DateAdd(Today(),Sequence(7,0),TimeUnit.Days) As tbl,
"注文",LookUp(T_注文一覧,注文日=tbl.Value,注文),
"固定",glb社員.固定
)
これで固定列に昼が保存されます。
可視化するとこんな感じです。
必要なデータがそろったので、ギャラリーのItemsは終わりです。
追加した列をギャラリーに展開する
続いてギャラリーのテンプレートを設計していきます。日付と曜日用のラベルを2つ入れてそれぞれ次のコードを入れます。
//日付
ThisItem.Value
//曜日
"["&Left(Index(Calendar.WeekdaysShort(),Weekday(ThisItem.Value)).Value,1)&"]"
日付はValue列にあるのでそのまま指定できますね。
曜日はちょっと複雑です。土日の色を変えておくと見やすいですね。
次に注文部分ですが、択一なのでラジオボタンを使います。
各プロパティを埋めていきましょう。
//Items
Split("朝,昼,夜,不要",",")
//Default
If(IsBlank(ThisItem.注文.Value),ThisItem.固定,ThisItem.注文.Value)
//DisplayMode
If(IsBlank(ThisItem.注文),DisplayMode.Edit,DisplayMode.Disabled)
選択肢部分であるItemsは直接テーブルを作っています。
初期値のDefaultは注文済みか固定注文のどちらかにしています。
DisplayModeをいじって注文済みの場合は編集できないようにします。
最後に登録および取消用のボタンです。
注文列の値有無で登録と取消を判定し、処理を切り替えます。
未登録ならPatch関数で登録、登録済みならRemove関数で削除します。
ボタンの色も変えるとなおよしですね。
具体的なコードは次のとおりです。
//Text
If(IsBlank(ThisItem.注文),"登録","取消")
//OnSelect
If(Self.Text="取消",
Remove(T_注文一覧,LookUp(T_注文一覧,注文日=ThisItem.Value && 社員名=glb社員.社員名)),
Patch(T_注文一覧,{社員名:glb社員.社員名,注文日:DateValue(ThisItem.Value),注文:Radio1.Selected})
)
あとは実際に操作して、登録や取消が行えるか試してください。
AddColumns関数を使って入力データを加工する方法のまとめ
今回はAddColumns関数を使って入力データを加工する方法を紹介しました。
AddColumns関数を扱えるとデータ加工の幅が広がりますよね。
条件に見合ったレコードの抽出と固定値の埋め込みを行いましたが、テーブルを格納することもできます。
その場合、レコード件数や総計など扱えるので、できることも増えますね。
次回は出力データの加工を解説しますので、公開までしばらくお待ちください。
コメントを残す