Một trong những vấn đề thường gặp trong Marketing Cloud đó là ta có thể import nhưng lại không thể export list các user. Dẫn tới ta không thể nào biết cụ thể liệu ở các user đang mang những role gì, liệu có đang bị khóa, đang ở trạng thái gì, trừ khi là nhìn vào UI ở phần set up.
Dĩ nhiên sẽ mang lại đôi chút bất tiện khi lượng user trong hệ thống MC của bạn có thể từ nhiều đến rất nhiều, chưa kể đến là loại report này không hề có trong standard report của MC. Một điểm giới hạn nữa là nếu report cần phải gửi dạng bảng thì chẳng lẽ ta lại type lại hết mọi thứ sao?
Vì thế hôm nay, Gâu Đần sẽ build một custom User report để ta có một cái nhìn tổng quan về số user đang có trong account MC của bạn nhé.
User information
Đầu tiên ta cứ vào UI trong Marketing Cloud xem họ cung cấp cho chúng ta thông tin gì nhé
Vậy là trong phần này họ cũng cung cấp cho chúng ta những thông tin khá cơ bản. Gâu Đần để ý là ở đây không có trạng thái như user có đang bị khóa, có phải API User không, v..v vẫn cần phải click vào user mới biết được.
AccountUser object
Để lấy được những thông tin trên Gâu Đần sẽ dùng AccountUser
object, bạn có thể đọc về object này ở ĐÂY. Điểm cần chú ý là object này có thể gọi ra bằng SOAP API. Mà nói đến SOAP ta nghĩ ngay đến những file XML dài ngoằng và template rất chặt đến mức khó thở.
Nghe là nản rồi đúng không. Thật may là Marketing Cloud có thư viện WSProxy
mà ta có thể tận dụng để gọi SOAP object đơn giản hơn rất nhiều.
Coding
Dùng WSProxy để retrieve những Account User có trong MC:
<script runat="server">
Platform.Load("core","1");
var DEname = 'User report';
var filters = {
Property: 'Email',
SimpleOperator: 'notEquals',
Value: ' '
};
var cols = ["Name", "UserID", "Email", "LastSuccessfulLogin", "ActiveFlag", "DefaultBusinessUnit", "Roles", "IsAPIUser", "IsLocked"];
var prox = new Script.Util.WSProxy();
var accUsers = prox.retrieve("AccountUser", cols, filters);
Write(Stringify(accUsers));
</script>
Tới đây sẽ ra một đống các kết quả mà các kết quả này nằm ở property Results
Note: không phải attribute nào trong AccountUser object cũng retrieve được chẳng hạn (Delete hay Single sign-on), Gâu Đần viết ra filter là Email không rỗng là để loại bỏ đi những user đã bị xóa trước đó (vẫn còn lưu trên object này và không có email)
Sau khi đã xác định cấu trúc trả về và những attribute chúng ta retrieve thì ta có thể truy cập vào từng kết quả
<script runat="server">
Platform.Load("core","1");
var DEname = 'User report';
var filters = {
Property: 'Email',
SimpleOperator: 'notEquals',
Value: ' '
};
var cols = ["Name", "UserID", "Email", "LastSuccessfulLogin", "ActiveFlag", "DefaultBusinessUnit", "Roles", "IsAPIUser", "IsLocked"];
var prox = new Script.Util.WSProxy();
var accUsers = prox.retrieve("AccountUser", cols, filters);
var len = accUsers.Results.length;
Write('There are: ' + len + ' users<br><br>');
for ( var i = 0; i < len; i++ ) {
Write('Name: ' + accUsers.Results[i].Name + '<br>');
Write('User name: ' + accUsers.Results[i].UserID + '<br>');
Write('API User: ' + accUsers.Results[i].IsAPIUser + '<br>');
Write('Is Locked: ' + accUsers.Results[i].IsLocked + '<br>');
Write('Email: ' + accUsers.Results[i].Email + '<br>');
Write('Default BusinessUnit: ' + accUsers.Results[i].DefaultBusinessUnit + '<br>');
Write('LastSuccessfulLogin: ' + accUsers.Results[i].LastSuccessfulLogin + '<br>');
Write('Active Status: ' + accUsers.Results[i].ActiveFlag + '<br>');
for ( var j=0; j < accUsers.Results[i].Roles.length; j++ ) {
Write('Role: ' + accUsers.Results[i].Roles[j].Name + '<br>')
}
Write('<br><br>')
}
</script>
Output:
Nhìn tổng quan thì khá là tốt, ta có thể “in ra” được những thông tin cơ bản và cả những thông tin khác nữa.
Giờ việc cuối cùng là lưu thông tin dưới dạng bảng, từ đó ta có thể làm việc thẳng với custom report từ MC hoặc export report này dưới dạng csv.
User report DE
Tạo một data extension để trữ kết quả, gồm có những fields giống như thế này
Full code
<script runat="server">
Platform.Load("core","1");
var DEname = 'User report';
var filters = {
Property: 'Email',
SimpleOperator: 'notEquals',
Value: ' '
};
var cols = ["Name", "UserID", "Email", "LastSuccessfulLogin", "ActiveFlag", "DefaultBusinessUnit", "Roles", "IsAPIUser", "IsLocked"];
var prox = new Script.Util.WSProxy();
var accUsers = prox.retrieve("AccountUser", cols, filters);
var len = accUsers.Results.length;
Write('There are: ' + len + ' users<br><br>');
for ( var i = 0; i < len; i++ ) {
var lst = '';
// store the information
var name = accUsers.Results[i].Name;
var userName = accUsers.Results[i].UserID;
var email = accUsers.Results[i].Email;
var DefaultBusinessUnit = accUsers.Results[i].DefaultBusinessUnit;
var LastSuccessfulLogin = accUsers.Results[i].LastSuccessfulLogin;
var status = accUsers.Results[i].ActiveFlag;
var IsAPIUser = accUsers.Results[i].IsAPIUser;
var IsLocked = accUsers.Results[i].IsLocked;
for ( var j=0; j < accUsers.Results[i].Roles.length; j++ ) {
lst += 'Role: ' + accUsers.Results[i].Roles[j].Name + '; '
}
Platform.Function.InsertDE(DEname, ['Name', 'userName', 'Email', 'Default BusinessUnit', 'LastSuccessfulLogin', 'Active Status', 'Role', 'IsAPIUser', 'IsLocked'],
[name, userName, email, DefaultBusinessUnit, LastSuccessfulLogin, status, lst, IsAPIUser, IsLocked]);
}
</script>
Output:
Vậy là xong, bạn đã biết cách build một custom User report rồi đấy!