Gamifying SSJS Mastery

Gamifying SSJS Mastery
Home Page

Gamifying SSJS Mastery: Unleashing Your Web Development Potential through Fun and Interactive Learning

In today's fast-paced and ever-evolving world of web development, mastering Server-Side JavaScript (SSJS) is a valuable skill that can take your programming prowess to new heights. But what if learning SSJS could be as enjoyable as playing a game? Imagine leveling up your web development skills while immersing yourself in an engaging and interactive learning experience.


With the concept of gamification, you can embark on a journey to master SSJS that feels more like an adventure than a traditional learning process. By infusing elements of game design, such as challenges, rewards, and progress tracking, you can transform the way you approach learning SSJS.


"Gamifying SSJS Mastery: Unleashing Your Web Development Potential through Fun and Interactive Learning" is an exploration of how gamification can revolutionize your journey towards becoming an SSJS expert. This blog delves into various gamification techniques and strategies specifically tailored to learning SSJS, providing you with an innovative and dynamic approach to acquiring this essential skill.


Discover how you can tackle coding challenges that resemble quests, earn points and badges for completing tasks, and unlock new levels of knowledge as you progress. Through this gamified approach, you'll find yourself motivated, engaged, and eager to tackle the next coding challenge, just like playing a captivating video game.


So, if you're ready to embark on an exciting learning adventure and unleash your full potential in SSJS, join us as we explore the power of gamification in web development education. Get ready to level up your skills, earn achievements, and conquer the world of Server-Side JavaScript like a true gaming champion. Let the journey begin!

Welcome to SSJS Enablement Program Session 3


In this session of SSJS enablement, we'll pick up where we left off and dive into the world of Retrieve functions. Let's begin by refreshing our knowledge on retrieve functions and explore how to retrieve a folder. From there, we'll build upon our understanding and continue our journey forward


Example 1: Code Snippet: Finding a Folder with the Name 'Shashi' in SSJS

                        
<script runat="server">
  Platform.Load("core","1");
  try{
    var filter={
      Property:"Name",SimpleOperator:"equals",Value:"Shashi"};
    var results = Folder.Retrieve(filter);
    Write(Stringify(results));
  }
  catch(ex)
  {
    Write(ex.message +'\n');
    Write(ex.description +'\n');
  }
</script>
                        
                    

The code executes without errors, but it returns multiple datasets of results.So, let troubleshoot! Let's copy the dataset and open a json formatter, you can find online json formatter, here is a link


Profile

Upon expanding the array, we discover that there are five datasets containing the folder name 'Shashi'. Upon closer analysis of the data, we observe that the folder name 'Shashi' is present across all asset types


Example 2: Code Snippet: Finding a Folder with the Name 'Shashi' in SSJS with a complex filter

In order to locate a folder with the name 'Shashi' within a specific asset category, it is necessary to augment our existing code with a more complex filter. This entails not only filtering by name but also by contentType. Let's enhance our code by incorporating this complex filter and retrieve the details of the desired folder.

                        
<script runat="server">
  Platform.Load("core","1");
  try{
    var filter1={
      Property:"Name",SimpleOperator:"equals",Value:"Shashi"};
    var filter2={
      Property:"ContentType",SimpleOperator:"equals",Value:"dataextension"};
    var complexFilter = {
      LeftOperand: filter1,LogicalOperator: "AND",RightOperand: filter2};
    var results = Folder.Retrieve(complexFilter);
    //Write(Stringify(results));
    for(var i=0;i<results.length;i++){
      Write('Name :'+ results[i].Name+'\n');
      Write('ID :'+ results[i].ID+'\n');
    }
  }
  catch(ex)
  {
    Write(ex.message +'\n');
    Write(ex.description +'\n');
  }
</script>
                        
                    

Example 3: Code Snippet: Write a SSJS to create a sub-folder under a parent folder name 'Preference Center'

Now, we have mastered to write SSJS Retrieve functions, we will now explore SSJS Create Functions.

                        
<script runat="server">
  Platform.Load("core","1");
  
  //=================================================================================//
  // Reteireive Category Id from Data Extension folder based on Name and ContentType
  // We are using complex filter because we might be 
  // using the same name across different assets
  //=================================================================================//
  function RetrieveCategortyIDFromDataExtension(filter1,filter2){
    var complexFilter = {
      LeftOperand: filter1,LogicalOperator: "AND",RightOperand: filter2};
    var results = Folder.Retrieve(complexFilter);
    return results[0].ID;
  }
  
  //=================================================================================//
  // Create a sub-folder inside a data extension parent folder based on category ID
  // Assign a javascript variable with all prop required for creating the folder
  //=================================================================================//
  function CreateAfolder(newFolder){
    var status = Folder.Add(newFolder);
    return status;
  }
  
  try{
    
    //============================================================================================//
    // Assign variables to a filter operations for left filter
    // https://developer.salesforce.com/docs/marketing/marketing-cloud/guide/simpleoperators.html
    //============================================================================================//
    var propName1="Name";
    var simpleOperator1="equals";
    var propValue1="Preference Center";
    
    // Assign variables to a filter operations for right filter
    var propName2="ContentType";
    var simpleOperator2="equals";
    var propValue2="dataextension";
    
    
    var filter1={
      Property:propName1,SimpleOperator:simpleOperator1,Value:propValue1};
    var filter2={
      Property:propName2,SimpleOperator:simpleOperator2,Value:propValue2};
    
    var CategoryID=RetrieveCategortyIDFromDataExtension(filter1,filter2);
    
    var newFolder = {
      "Name" : "ProfileCenter",
      "CustomerKey" : "ProfileCenter",
      "Description" : "SubscriberFolder",
      "ContentType" : "dataextension",
      "IsActive" : "true",
      "IsEditable" : "true",
      "AllowChildren" : "false",
      "ParentFolderID" : CategoryID
    };
    var status = CreateAfolder(newFolder);
    Write(status);
  }
  catch(ex) {
    Write(ex.message +'\n');
    Write(ex.description +'\n');
  }
</script>
                        
                    

Example 4: Code Snippet: Write a SSJS to create a sub-folder under a parent folder name 'Preference Center' and also create a new data extension under the newly created folder.

Elevate Your Mastery: Embrace Complexity on Your Programming Journey

                        
<script runat="server">
  Platform.Load("core","1");
  
  //=================================================================================//
  // Reteireive Category Id from Data Extension folder based on Name and ContentType
  // We are using complex filter because we might be 
  // using the same name across different assets
  //=================================================================================//
  function RetrieveCategortyIDFromDataExtension(filter1,filter2){
    var complexFilter = {
      LeftOperand: filter1,LogicalOperator: "AND",RightOperand: filter2};
    var results = Folder.Retrieve(complexFilter);
    return results[0].ID;
  }
  
  //=================================================================================//
  // Create a sub-folder inside a data extension parent folder based on category ID
  // Assign a javascript variable with all prop required for creating the folder
  //=================================================================================//
  function CreateAfolder(newFolder){
    var status = Folder.Add(newFolder);
    return status;
  }
  
  //==================================================================================//
  // Create a data extension by passing data extension name,
  // folder prop and folder value (Name: value or CustomerKey : value)
  //==================================================================================//
  function createDataExtension(config) {
    // set ws-proxy object 
    var api = new Script.Util.WSProxy();
    //set MID
    api.setClientId({
      "ID": Platform.Function.AuthenticatedMemberID()
    });
    var result = api.createItem("DataExtension", config);
    return(result);
  };
  
  //======================================================================================//
  // Retrieve the category ID from the data extension folder 
  // folder prop and folder value (Name: value or CustomerKey : value) needs to be supplied
  //=======================================================================================//
  function retrieveCategorgyIDForDataExtensionCreation(prop,val)
  {
    var Folderprop =prop;
    var Folderval = val;
    var FindDE =
        Folder.Retrieve({
          Property:"Name",SimpleOperator:"equals",Value:Folderval}
                       );
    // if you want to retrieve the parent folder assign "FindDE[0].ParentFolder.ID"
    var FolderID = FindDE[0].ID  //FindDE[0].ParentFolder.ID;
    var FolderName = FindDE[0].Name;
    return FolderID;
  }
  
  try{
    
    //============================================================================================//
    // Assign variables to a filter operations for left filter
    // https://developer.salesforce.com/docs/marketing/marketing-cloud/guide/simpleoperators.html
    //============================================================================================//
    var propName1="Name";
    var simpleOperator1="equals";
    var propValue1="Preference Center";
    
    // Assign variables to a filter operations for right filter
    var propName2="ContentType";
    var simpleOperator2="equals";
    var propValue2="dataextension";
    
    
    var filter1={
      Property:propName1,SimpleOperator:simpleOperator1,Value:propValue1};
    var filter2={
      Property:propName2,SimpleOperator:simpleOperator2,Value:propValue2};
    
    
    var CategoryID=RetrieveCategortyIDFromDataExtension(filter1,filter2);
    
    //============================================================================================//
    // Assign variables to create a folder
    //============================================================================================//
    var newFolder = {
      "Name" : "SubscriptionCenter",
      "CustomerKey" : "SubscriptionCenter",
      "Description" : "Store subscription profile",
      "ContentType" : "dataextension",
      "IsActive" : "true",
      "IsEditable" : "true",
      "AllowChildren" : "false",
      "ParentFolderID" : CategoryID
    };
    var status = CreateAfolder(newFolder);
    
    //============================================================================================//
    // Define the configuration for a data extension to be created
    //============================================================================================//
    var config = {
      "CustomerKey": "SubscriberProfile",
      "Name": "SubscriberProfile",
      "CategoryID": retrieveCategorgyIDForDataExtensionCreation("Name",newFolder.Name),
      "Fields": [
        {
          "Name": "FirstName",
          "FieldType": "Text",
          "MaxLength": 50
        }
        ,
        {
          "Name": "LastName",
          "FieldType": "Text",
          "MaxLength": 80
        }
        ,
        {
          "Name": "SubscriberKey",
          "FieldType": "Text",
          "MaxLength": 254,
          "IsPrimaryKey": true,
          "IsRequired" : true
        }
        ,
        {
          "Name": "EmailAddress",
          "FieldType": "EmailAddress",
          "IsRequired" : true
        }
      ],
      "DataRetentionPeriodLength": 4,
      "RowBasedRetention": false,
      "ResetRetentionPeriodOnImport": true,
      "DeleteAtEndOfRetentionPeriod": false,
      "DataRetentionPeriod": "Weeks"
    };
    
    var result=createDataExtension(config);
    if(result){
      Write("Data Extension " + config.Name + " was successfully created under the folder " + newFolder.Name + '\n');
       }
  }
  catch(ex) {
    Write(ex.message +'\n');
    Write(ex.description +'\n');
  }
</script>
                        
                    

In this session, we embarked on a journey to further our mastery of SSJS by refreshing our knowledge of retrieve functions and exploring how to find a folder with a specific name. We encountered the challenge of multiple datasets and discussed the importance of adding additional filters to refine our search. Despite the complexities, we approached the task with enthusiasm and determination.

As we conclude this session, let us reflect on the progress we have made and the valuable insights gained along the way. Each step forward brings us closer to becoming proficient in SSJS. While challenges may arise, we approach them with a positive mindset, viewing them as opportunities for growth and learning.

With an optimistic outlook, we eagerly anticipate the upcoming sessions, where we will delve deeper into the intricacies of SSJS, expanding our knowledge and refining our skills. As we embrace the complexities of programming, we unlock new doors to endless possibilities and pave the way for even greater achievements in our web development journey.

So, let us continue our quest for SSJS mastery with determination, curiosity, and a steadfast belief in our ability to overcome challenges. The upcoming sessions hold the promise of expanding our expertise and propelling us towards new heights. Get ready to level up your skills and embrace the exciting opportunities that await us. Together, we will conquer the world of SSJS!


Comments

Most Viewed

CLOUD PAGE ENABLEMENT - PART 1

EMAIL NOT SENT IN JOURNEY BUILDER

CONSIDERATIONS FOR JOURNEY BUILDER

Understanding Transactional Messaging

Preference Center Demystified


Knowledge Article

Popular Posts

CLOUD PAGE ENABLEMENT - PART 1

EMAIL NOT SENT IN JOURNEY BUILDER

CONSIDERATIONS FOR JOURNEY BUILDER

Understanding Transactional Messaging

Preference Center Demystified

Journey Builder REST API Documentation

Share with Friends

Disclaimer:

The information provided on this technical blog is for general informational purposes only. As a SFMC (Salesforce Marketing Cloud) Technical Architect, I strive to offer accurate and up-to-date content related to SFMC and its associated technologies. However, please note that technology is constantly evolving, and the information provided may become outdated or inaccurate over time.

The content published on this blog represents my personal views and experiences as a SFMC Technical Architect and does not necessarily reflect the official views or opinions of any organization or employer I may be affiliated with.

While I make every effort to ensure the accuracy and reliability of the information presented, I cannot guarantee its completeness, suitability, or applicability to your specific circumstances. Therefore, it is essential to verify any information provided and make your own independent assessments or seek professional advice if needed.

Furthermore, any actions taken based on the information provided on this blog are at your own risk. I shall not be held liable for any damages, losses, or inconveniences arising from the use of the information presented here.

Please keep in mind that SFMC and its associated technologies are complex and require technical expertise for proper implementation and management. It is recommended to consult with qualified professionals or official SFMC documentation for comprehensive guidance.

Finally, please note that any product or company names mentioned on this blog are trademarks or registered trademarks of their respective owners. The mention of these trademarks or registered trademarks does not imply any endorsement or affiliation with the blog.

By accessing and using this blog, you agree to the terms of this disclaimer. If you do not agree with any part of this disclaimer, please refrain from using this blog.