Quà tặng là một phần không thể thiếu của mùa Giáng sinh bởi đây là dịp để mọi người quây quần, trao quà và thể hiện tình yêu thương. Một trò chơi phổ biến trong doanh nghiệp để tặng quà Giáng sinh cho nhau là Secret Santa – khi chính bạn sẽ hóa thân thành ông già Noel để tặng quà cho người thân và bạn bè.
Nội Dung Bài Viết
1. Secret Santa là gì?
2. Chuẩn bị nguồn dữ liệu.
3.
Secret Santa là gì?
Secret Santa (tạm dịch: ông già Noel bí ẩn) là một truyền thống của phương Tây vào lễ Giáng Sinh: trò chơi trao đổi quà bí mật khi người nhận sẽ hoàn toàn không biết ai là “ông già Noel” đã tặng quà cho mình. Đây là một dịp để thể hiện sự quan tâm và tình cảm của mình tới những người bạn, người đồng nghiệp yêu dấu. Bạn sẽ được chỉ định là Secret Santa của một người tham gia khác. Nhiệm vụ của bạn sẽ là bí mật quan tâm và chuẩn bị quà cho người bạn đó. Ngày ‘‘khui’’ quà sẽ đầy niềm vui bất ngờ vì bạn sẽ trao đi món quà mà mình đã chuẩn bị và cũng được nhận món quà ‘‘có tâm’’ và bí ẩn từ người chơi khác.
Thông thường, trước đêm Giáng Sinh, các Secret Santa sẽ bí mật rút thăm ngẫu nhiên tên của người mình sẽ tặng quà. Những món quà sẽ được gói ghém cẩn thận, thắt nơ, bọc kính và viết tên người nhận lên đó. Các “ông già Noel” cũng sẽ “lén lút” đặt những món quà mà mình đã chuẩn bị dưới cây thông Noel. Đến cận đêm Giáng Sinh, nhìn thấy dưới cây thông đầy ắp quà tặng, tức khắc mọi người lại cảm thấy phấn khích, háo hức chờ đón một mùa Noel thật ấm áp.
Trong bài tutorial hôm nay chúng ta cùng thực hiện một ứng dụng đơn giản bằng Power Apps để giúp bạn chọn Secret Santa cách ngẫu nhiên.
Chuẩn Bị Nguồn Dữ Liệu?
Trước tiên chúng ta cần tạo một SharePoint List mới để lưu dữ liệu về người tham gia cũng như Secret Santa của họ là ai. SharePoint List của chúng ta sẽ có tên là Danh_Sach_Secret_Santa
Tên Cột | Mô Tả | Loại Dữ Liệu |
Title | Cột mặc định của SharePoint, các bạn có thể dùng để lưu số thứ tự của người tham gia trò chơi. | Single Line Of Text |
Nguoi_Choi | Thông tin của người tham gia. | Person Or Group |
Secret_Santa | Thông tin của người được chỉ định làm Secret Santa. | Person Or Group |
Trang_Thai | Xác định trạng thái đã chọn secret santa thành công hay chưa. | Single Line Of Text |
Tạo Ứng Dụng và Cấu Hình Giao Diện Cơ Bản
Vào Power Apps Studio và tạo ứng dụng Canvas trống mới, hãy chọn giao diện cho Điện thoại.
Tiếp theo chúng ta kết nối đến nguồn dữ liệu là SharePoint List mà chúng ta đã tạo ở bước trên.
Trang 1: Landing Page
Trang 1 của chúng ta sẽ là trang landing page trang đầu tiền mà người dùng sẽ thấy khi mở ứng dụng. Ở trang này chúng ta muốn có một Tiêu Đề (Label) để chào mừng người chơi đến với ứng dụng. Và trang một của chúng ta sẽ có 2 nút. Nút số 1 sẽ dẫn người chơi đến xem danh sách của tất cả người chơi trong tổ chức của chúng ta. Nút số 2 sẽ ngẫu nhiên chọn cho người chơi của chúng ta một người để nhận quà, nếu người chơi của chúng ta đã xác định được đối tượng nhận quà rồi thì nút số 2 sẽ dẫn đến trang nhắc lại thông tin của người nhận quà.
Đầu tiên hãy cho trang 1 của chúng ta một màu đỏ để làm nền bằng thuộc tính Fill và giá trị là DarkRed.
Fill: DarkRed

Tiếp theo là tạo Tiêu Đề chào mừng và các Nút.

Trang 2: Danh sách người chơi
Ở trang 2 chúng ta muốn có một Thanh Menu trên gồm một nút quay lại và 1 thanh tìm kiếm để tìm tên của người chơi.
Bạn hãy tạo một hình Chữ Nhật (Rectangle) có chiều ngang bằng với chiều ngang của ứng dụng và chiều cao bằng 90 px. Chúng ta cũng muốn thanh menu này có màu khác với màu nền, chúng ta hãy dùng hàm ColorFade để giảm 30% từ màu nền sẽ dễ đồng bộ với màu nền.

Rectangle:
Fill: ColorFade(DarkRed, 30%)
Width: Parent.Width
Height: 90
Tiếp theo hãy chèn một biểu tượng cho nút quay lại và một thanh Text-Input để làm thanh tìm kiếm. Với nút quay lại chúng ta hãy đặt cho thuộc tính OnSelect là Back() để khi người dùng bấm vào Icon thì sẽ quay lại trang trước đó. Đối với thanh tìm kiếm (Text Input) hãy xóa nội dung mặc định trong thuộc tính Default và đặt nội dung cho thuộc tính HintText là “Tìm Kiếm”
Icon: BackArrow
OnSelect: Back()
Color: White
Clear: true
Text Input
Default:
HintText: "Tìm kiếm"
Sau đó chúng ta sẽ chèn một Gallery dọc bên dưới thanh menu trên. Trong gallery này chúng ta sẽ hiện thông tin của tất cả người chơi. Hãy chọn Layout của Gallery là “Image, title, and Subtitle”. Trong đó Image sẽ là Avatar của người chơi được lấy từ hệ thống của Office 365, Title là tên của người chơi và Subtitle sẽ là phòng ban. Bạn hãy chọn dữ liệu nguồn của Gallery là SharePoint List Danh_Sach_Nguoi_Choi.

Vì dữ liệu người chơi được lưu trên SharePoint là “Person or Group” nên dữ liệu đó là một bản ghi. Nên chúng sẽ cấu hình như sau:
Phần Image:
Thuộc tính Image: ThisItem.Nguoi_Choi.Picture
Phần Title:
Text: ThisItem.Nguoi_Choi.DisplayName
Phần Subtitle:
Text: ThisItem.Nguoi_Choi.Department
Để thực hiện chức năng tìm kiếm chúng ta cầu hình thuộc tính Items của Gallery như sau:
Filter(Danh_Sach_Secret_Santa, StartsWith(Nguoi_Choi.DisplayName,TextInput1.Text))
Trang 3: Tôi là Secret Santa của?
Đầu tiên chúng ta cùng tạo một Nút để ngẫu nhiên chọn một người chơi. Bằng cách dùng hàm Filter để loại những người dùng đã chọn được đối tượng để tặng quà. Sau đó dùng hàm Shuffle để xáo trộn thứ tự danh sách những người chưa có Secret Santa, và chọn người đầu tiên từ danh sách đó bằng hàm First, sau đó gán trạng thái của người được chọn từ danh sách người chơi thành “done”. (lưu ý là đổi trạng thái của người được chọn chứ không phải người dùng hiện tại).

Dùng hàm Rand và First như bên trên chúng ta cũng lường trước một khả năng có thể xảy ra đó là người được chọn cũng chính là người vừa bấm nút. Chúng ta có thể đặt điều kiện trong hàm Filter để loại người dùng khỏi danh sách bằng công thức Nguoi_Choi <> User() tuy nhiên toán tử khác không hỗ trợ khả năng ủy quyền với người dữ liệu SharePoint (tìm hiểu thêm về deligation) vì vậy cách này chỉ đúng nếu nguồn dữ liệu của chúng ta dưới hạn mức cho phép của Delegation (default là 500 dòng). Để giải quyết vấn đề này chúng ta có thể dùng hàm If để chạy lại hàm Rand nếu như người được chọn trùng với người dùng hiện tại, tuy cách này vẫn có xát xuất người được chọn cũng là người dùng hiện tại, nhưng xát xuất sẽ thấp hơn rất nhiều lần.
//Lấy người chơi ngẫu nhiên từ danh sách người chơi, với điều kiện chưa được ai chọn
UpdateContext(
{
varRandom: First(
Shuffle(
Filter(
Danh_Sach_Secret_Santa,
Trang_Thai = Blank()
)
)
).Nguoi_Choi
}
);
// Chạy lại công thức trên nếu người được chọn trùng với người chơi hiện tại
If(
varRandom.Email = User().Email,
UpdateContext(
{
varRandom: First(
Shuffle(
Filter(
Danh_Sach_Secret_Santa,
Trang_Thai = Blank()
)
)
).Nguoi_Choi
}
)
);
//Gán thông tin người được chọng vào dữ liệu người dùng hiện tại
Patch(
Danh_Sach_Secret_Santa,
LookUp(
Danh_Sach_Secret_Santa,
User().Email = Nguoi_Choi.Email
),
{
Secret_Santa: varRandom
}
);
//Cập nhật trạng thái của người được chọn thành Done
Patch(
Danh_Sach_Secret_Santa,
LookUp(
Danh_Sach_Secret_Santa,
varRandom.Email = Nguoi_Choi.Email
),
{
Trang_Thai: "Done"
}
)
Tiếp theo chúng ta tạo một Label lớn ngay giữa màn hình, và chúng ta muốn hiển thị thông tin của người được chọn nếu như người dùng hiện tại đã chọn rồi. Nếu chưa chọn sẽ hiển thị hướng dẫn bấm nút bên dưới để chọn ngẫu nhiên. Để biết người chơi đã có người được chọn chưa hãy kiểm tra cột Secret Santa có dữ liệu hay không tại thời điểm load trang này. Chúng ta sẽ đặt thuộc tính OnVisible như sau:
Refresh(Danh_Sach_Secret_Santa);
If(
IsBlank(
LookUp(
Danh_Sach_Secret_Santa,
Nguoi_Choi.Email = User().Email,
Secret_Santa
).Email
),
UpdateContext({varUserDone: false}),
UpdateContext({varUserDone: true});
UpdateContext(
{
varRandom: LookUp(
Danh_Sach_Secret_Santa,
Nguoi_Choi.Email = User().Email,
Secret_Santa
)
}
)
)
Đối với nội dung của Label, chúng ta đặt là:
If(varUserDone,"Đối tượng tặng quả của bạn là:
"& varRandom.DisplayName, "Hãy bấm nút bên dưới để chọn đối tượng tặng quà của bạn.")

Chúng ta cũng muốn nút Chọn Đối Tượng mất đi sau khi đã chọn xong hoặc khi đã chọn rồi mà quay lại trang này thì ẩn nút đó đi. Chúng ta đặt thuộc tính OnVisible của nút là Not(varUserDone)
Vậy là chúng ta đã xây dựng xong ứng dụng Secret Santa để áp dụng ngay cho công ty, đoàn thể, hội nhóm trong mùa lễ Giáng Sinh năm nay. Chúc mọi người xây dựng ứng dụng thành công và có một kỳ nghỉ lễ an lành bên gia đình và bạn bè.