Như ở bài trước, ta đã biết cách tìm và build path thông qua folder ID. Vậy làm sao để tìm vị trí của một Data Extension đây, liệu nó có giống như tìm thông qua folder ID?
Nếu bạn từng đọc blog của Gâu Đần thì trong đó mình đã giới thiệu cho bạn một Extension gọi là DESelect Search dùng để tìm kiếm Data Extension và những asset khác trong Content Builder. Hôm nay Gâu Đần sẽ hướng dẫn các bạn build một thứ tương tự để tìm kiếm Data Extension mà không phụ thuộc vào app thứ 3 nhé.
Cấu trúc của DataExtension object
Nếu bạn để ý sẽ thấy Data Extension object hay các asset khác trong Content Builder đều có một attribute có tên là CategoryID đây chính là ID của folder. Vì vậy muốn tìm nó nằm ở đâu thì phải biết được value của attribute này là gì phải không?
Cách tìm Id của một folder chứa Data Extension
*Đây là chỉ một bước phụ giúp các bạn tìm Folder ID chứa một Data Extension nhanh chóng và để giúp bạn hiểu hơn về folder chứa Data Extension.
Cách 1: tìm trên Email Studio
Chẳng hạn mình có Data Extension tên là Gaudan customers nằm trong một sub-folder tên là Test Folder đi.
Chỉ cần trỏ con chuột tới folder này thì ở dưới cùng của browser ta có thể xem trước được ID của folder này. Như trong hình thì Folder ID/Category ID là 429241
Cách 2: tìm trên Contact Builder
Từ mục Data Extension, ta F12 để inspect element, sau đó trỏ về folder mà ta cần tìm
Ở mục bên phải ta đã tìm thấy được folder ID cho folder này là 429241
Làm thế này cũng tiện vì có thể click vào copy được, chớ cách 1 chỉ có nhớ thôi.
Tìm path trong folder của Data Extension có giống như trong Content Builder?
Để trả lời được câu hỏi này chỉ có thử mới biết thôi. Dựa vào bài trước, Gâu Đần tạo một hàm tìm kiếm như sau:
<script runat="server">
Platform.Load("core", "1.1");
var folderID = 429241; // PUT YOUR FOLDER ID HERE
findpath(folderID);
function findpath(folderID) {
var path = [],
hasMore = true;
var prox = new Script.Util.WSProxy();
var cols = ["ID", "Name", "ParentFolder.ID", "ParentFolder.Name"];
var filter = {Property: "ID",SimpleOperator: "equals", Value: folderID};
while (hasMore) {
var req = prox.retrieve("DataFolder", cols, filter);
// Check if the folder ID is existing
if (req.Results[0].length > 0) {
var FolderName = req.Results[0].Name;
path.unshift(FolderName);
if (req.Results[0].ParentFolder.ID != 0) {
filter["Value"] = req.Results[0].ParentFolder.ID;
} else {
hasMore = false; // exit the loop
}
} else {
hasMore = false; // exit the loop
Write("Cannot find this folder ID.")
}
}
path = path.join(' /');
Write(path);
}
</script>
Và ta có kết quả là:
Ok ngon rồi. Vậy là hàm này vẫn sử dụng được cho folder chứa Data Extension
Build trang tìm kiếm theo tên của Data Extension hoặc folder ID
Build submit form trên Cloudpage
Vào Cloudpage ta sẽ tạo một landingPage và có giao diện như sau:
<!DOCTYPE html>
<html>
<body>
<h2>Search by Data Extension name and folder ID</h2>
<form>
<select name="Type" data-field-type="Text" required="" id="TypeID">
<option value="DataExtension">Data Extension name</option>
<option value="Folder">Folder ID</option>
</select>
equals
<input type="text" name="Val" value="" id="ValID"> <br>
<input type="submit" value="Search">
</form>
</body>
</html>
<script>
var input_element = document.getElementById("ValID");
var type_element = document.getElementById("TypeID");
// Get parameters
var queryString = window.location.search;
var urlParams = new URLSearchParams(queryString);
var input_val = urlParams.get('Val');
var type_val = urlParams.get('Type');
// Fill out back the form
if(input_element.value == '') {
input_element.value = input_val;
type_element.value = type_val;
}
</script>
Ta có giao diện Old but Gold như sau
Đoạn script dưới đơn thuần là mỗi khi ta submit form thì hắn sẽ truyền lại giá trị cũ, để search cho tiện.
Build hàm tìm kiếm bằng tên Data Extension hoặc folder ID
<script runat="server">
Platform.Load("core", "1.1");
function findDataExtension(DEname){
var req
var prox = new Script.Util.WSProxy();
var cols = ["CategoryID", "CustomerKey", "Name", "IsSendable"];
var filter = {Property: "Name", SimpleOperator: "equals", Value: DEname};
req = prox.retrieve("DataExtension", cols, filter);
// Check if the DE name is existing
if (req.Results[0].length > 0) {
var folderID = req.Results[0].CategoryID;
findpath(folderID);
} else {
Write("Cannot find this DE name. Please enter the exact name of the DE.");
}
}
</script>
Full code
<!DOCTYPE html>
<html>
<body>
<h2>Search by Data Extension name and folder ID</h2>
<form>
<select name="Type" data-field-type="Text" required="" id="TypeID">
<option value="DataExtension">Data Extension name</option>
<option value="Folder">Folder ID</option>
</select>
equals
<input type="text" name="Val" value="" id="ValID"> <br>
<input type="submit" value="Search">
</form>
</body>
</html>
<script>
var input_element = document.getElementById("ValID");
var type_element = document.getElementById("TypeID");
// Get parameters
var queryString = window.location.search;
var urlParams = new URLSearchParams(queryString);
var input_val = urlParams.get('Val');
var type_val = urlParams.get('Type');
// Fill out back the form
if(input_element.value == '') {
input_element.value = input_val;
type_element.value = type_val;
}
</script>
<script runat="server">
Platform.Load("core", "1.1");
var type = Request.GetQueryStringParameter("Type");
var val = Request.GetQueryStringParameter("Val");
if(type != null) {
if(type == "DataExtension") {
findDataExtension(val);
}
else {
findpath(val);
}
}
function findDataExtension(DEname){
var req
var prox = new Script.Util.WSProxy();
var cols = ["CategoryID", "CustomerKey", "Name", "IsSendable"];
var filter = {Property: "Name", SimpleOperator: "equals", Value: DEname};
req = prox.retrieve("DataExtension", cols, filter);
// Check if the DE name is existing
if (req.Results[0].length > 0) {
var folderID = req.Results[0].CategoryID;
findpath(folderID);
} else {
Write("Cannot find this DE name. Please enter the exact name of the DE.");
}
}
function findpath(folderID) {
var path = [],
hasMore = true;
var prox = new Script.Util.WSProxy();
var cols = ["ID", "Name", "ParentFolder.ID", "ParentFolder.Name"];
var filter = {Property: "ID",SimpleOperator: "equals", Value: folderID};
while (hasMore) {
var req = prox.retrieve("DataFolder", cols, filter);
// Check if the folder ID is existing
if (req.Results[0].length > 0) {
var FolderName = req.Results[0].Name;
path.unshift(FolderName);
if (req.Results[0].ParentFolder.ID != 0) {
filter["Value"] = req.Results[0].ParentFolder.ID;
} else {
hasMore = false; // exit the loop
}
} else {
hasMore = false; // exit the loop
Write("Cannot find this folder ID.")
}
}
path = path.join(' /');
Write(path);
}
</script>
Test test test
Tìm kiếm bằng tên DE
Bằng folder ID
Taddaaa vậy là ta đã build một trang tìm kiếm Data Extension và folder rất tiện và hay ho đúng không nào!
Kể cả bạn muốn build để search theo tên DE liên quan thay vì tên chính xác thì ta vẫn hoàn toàn có thể làm được nhưng sẽ tốn thêm chút công sức 😀