Loops in AMPscript and Server-Side JavaScript

In programming languages, loops are a basic, yet a very powerful and indispensable concept. They shorten the code and reduce the need to repeat tasks. A loop is a set of instructions to be executed until a certain condition is met. In this article, we will focus on the most fundamental kind of loop, the for loop, and it’s usage in AMPscript and Server-Side JavaScript.

For loops in AMPscript

NOTE: In this article, we will focus on understanding the basic concepts of working with loops in Salesforce Marketing Cloud. For a strictly technical specification, defer to the following article: AMPscript Process Loops.

A for loop, which is actually the only loop available in AMPscript, lets you execute the same script repeatedly until an ending condition is met.

Let’s use the following example: we have a Data Extension with customer IDs and their ordered items. We want to use that dataset to send an email to each customer, listing the items each of them ordered.

Here’s our Data Extension called Orders:

CustomerIdOrderIdOrderItem
0031t000005D98UAAS4632Women’s Marine Hoodie
0031t000005D98UAAS4632Glass Love Bottle – 16.9 oz
0031t000005D98UAAS4632Eco Ballpoint Pen
0031t00000ZnTENAA33686Men’s Marine Hoodie
0031t00000YEM4ZAAX7354Leather Hampton Watch

In our example, the script contained within the loop would do the following: display a bullet point and display OrderItem name, and repeat the same action until all the OrderItems for a relevant Customer were displayed.

The most important element of any loop is the counter. The counter will define how many times the script in the loop should be executed. In order to define the counter, we must first set the criteria to find all the matching results in our Data Extension. We will use the LookupRows function to look up all rows, that match the Id of the Customer, that we want to send the email to. Then, we will use the RowCount function to determine how many results were found. The outcome of the RowCount function will be our counter and will decide how many times the script inside the loop will be repeated. Here’s the first part of our script, where we count how many records match the criteria: [click here to see the code on Github]

var @rows, @row, @rowCount, @subKey
set @subKey = _subscriberkey
set @rows = LookupRows("Orders","CustomerId", @subKey)
set @rowCount = rowcount(@rows)

Now let’s think through the loop logic. This is the verbal description of the loop that we would like to build:

Start at 1 and repeat the following in a loop until you reach the number defined in the RowCount variable: display the current index and the name of the OrderItem found in the referring row from the results of the LookupRows function. Increase the index by one and repeat the process. Stop looping once the index reaches the number defined in the counter.

Here’s how this looks in AMPscript: [click here to see the code on Github]

%%[ var @rows, @row, @rowCount, @subKey, @counter, @orderItem
set @subKey = _subscriberkey
set @rows = LookupRows("Orders","CustomerId", @subKey)
set @rowCount = rowcount(@rows)
for @counter = 1 to @rowCount do /* repeat in a loop for as many times as defined in rowCount */
set @row = row(@rows, @counter) /* get row based on counter */
set @orderItem = field(@row,"OrderItem")
]%%
<br>
Order item %%=v(@counter)=%%: %%=v(@orderItem)=%%<br>
%%[ next ]%%
view raw lookup-loop.amp hosted with ❤ by GitHub

You will notice the next keyword at the end of the loop – each time this keyword is reached, the system compares the current index to the value of the counter defined by the RowCount function. If the value is not equal to the end index, the loop will repeat until the end index is reached.

Here’s a full script that we can now use in an email, with added exception handling that will show “No items to display” in case the LookupRows function doesn’t find any matching records for a subscriber in the Orders Data Extension: [click here to see the code on Github]

<html>
<body>
Dear Customer,<br>
Here are the details of your order:<br>
%%[ var @rows, @row, @rowCount, @subKey, @counter, @orderItem
set @subKey = _subscriberkey
set @rows = LookupRows("Orders","CustomerId", @subKey)
set @rowCount = rowcount(@rows)
if @rowCount > 0 then
for @counter = 1 to @rowCount do
set @row = row(@rows, @counter) /* get row based on counter */
set @orderItem = field(@row,"OrderItem") ]%%
&#8226; Order item %%=v(@counter)=%%: %%=v(@orderItem)=%%<br>
%%[ next ]%%
%%[ else ]%%
No items to display
%%[ endif ]%%
<br>
We hope to see you again soon!
</body>
</html>

For a live coding example, see my YouTube video on Using AMPscript loops in Salesforce Marketing Cloud

For loops in Server-Side Javascript

While JavaScript offers at least five different kinds of loops, and all of those can be used in Salesforce Marketing Cloud, in this article we will focus on the most basic one, the for loop.

We will create a similar solution to the one created in the AMPscript example above. We will use the same Data Exteniosn called Orders and we will use a loop to display all the OrderItems for a Customer on a CloudPage.

The first thing we have to do in order to interact with a data extension via server-side JavaScript is to initialize the Data Extension object. Then, we will use the Server-Side JavaScript Rows.Lookup function to find all rows that match the Id of the Customer. For the purpose of this tutorial, we will hardcode the CustomerId into the script: [click here to see the code on Github]

<script runat="server">
Platform.Load("core","1");
var custId = "0031t000005D98UAAS"
var OrdersDE = DataExtension.Init("Orders");
var rows = OrdersDE.Rows.Lookup(["CustomerId"], [custId]);
</script>

The above script will return an ArrayList, which is a collection of elements. Arrays use numbers to access its elements and the numbering always starts at zero:

Arrays in JavaScript are zero-based. This means that JavaScript starts counting from zero when it indexes an array. In other words, the index value of the first element in the array is “0” and the index value of the second element is “1”, the third element’s index value is “2”, and so on.

https://blog.kevinchisholm.com/javascript/javascript-array-length-always-one-higher/

In AMPscript we used the RowCount function to determine the counter for our loop. In JavaScript, we will use the Array length Property. Inside the loop, we will display the current index (i) and the name of the element (OrderItem) that has this index number in the ArrayList. Remember that we will start counting at “0”, not at “1” like we did in AMPscript.

Then, we will increase the index by one and repeat the process.

In JavaScript, the ++ notation is the increment operator, which means that i++ is exactly the same thing as i = i+1. The script will stop looping once the index reaches the number defined in the counter (rows.length). Here’s the script: [click here to see the code on Github]

<script runat="server">
Platform.Load("core","1");
var custId = "0031t000005D98UAAS"
var OrdersDE = DataExtension.Init("Orders");
var rows = OrdersDE.Rows.Lookup(["CustomerId"], [custId]);
if(rows.length >= 1) {
for (i = 0; i < rows.length; i++) {
OrderItem = rows[i]["OrderItem"];
Write("&#8226; OrderItem " + i + ":" + OrderItem + "<br>");
}
}
</script>

Here’s the full script that we can now use on a CloudPage, with added exception handling that will show “No items to display” in case there are no matching records found in the Orders Data Extension: [click here to see the code on Github]

Dear Customer,<br>
Here are the details of your order:<br>
<script runat="server">
Platform.Load("core","1");
var custId = "0031t000005D98UAAS"
var OrdersDE = DataExtension.Init("Orders");
var rows = OrdersDE.Rows.Lookup(["CustomerId"], [custId]);
if(rows.length >= 1) {
for (i = 0; i < rows.length; i++) {
OrderItem = rows[i]["OrderItem"];
Write("&#8226; OrderItem " + i + ":" + OrderItem + "<br>");
}
}
else {
Write("No items to display");
}
</script>
<br>
We hope to see you again soon!
view raw ssjs-loop.html hosted with ❤ by GitHub

The is how the results will be displayed on a CloudPage:

Additional resources

Here is a list of additional resources to help you understand both the general concept of loops, as well as using loops in AMPscript and Server-Side JavaScript:


Questions? Comments?

Leave a comment below or email me at zuzanna@sfmarketing.cloud.


One thought on “Loops in AMPscript and Server-Side JavaScript

Leave a comment