This is an article to document a function used in Zoho Creator to retrieve the Product IDs of all the active products in a client's Shopify.
Why?
The use-case was that I wanted to search Shopify using a Product SKU. Community forums could only suggest looping through all the products.
I then felt that actually I just need the Product IDs. This method could do with some refinement and perhaps if I find a better way to do this, then I'll put it here. But I like this snippet of code albeit a brute force to loop through every active product and list their IDs.
How?
So here's the function I came up with. It loops through a maximum of 2500 products sorted in order of ID ascending (starting with ID=0) retrieving 250 per call and using since_id to not list the same one twice. It then outputs a JSON list as a response and the total record count:
copyraw
	
Yields something like:
void API.fn_ShopifyQuery_GetActiveProducts()
{
	m_Header = Map();
	m_Header.put("Content-Type","application/json");
	// 
	// your shopify details 
	v_ClientID = "<YOUR_CLIENT_ID>";
	v_ClientSecret = "<YOUR_CLIENT_SECRET>";
	v_ShopID = "example.myshopify.com";
	v_ShopifyURL = "https://" + v_ClientID + ":" + v_ClientSecret + "@" + v_ShopID;
	v_ShopifyApiVersion = "2020-01";
	//
	// loop through 2500 records
	v_LastID = 0;
	l_ProductIDs = List();
	l_Pages = {1,2,3,4,5,6,7,8,9,10};
	for each  v_Page in l_Pages
	{
		v_Endpoint = v_ShopifyURL + "/admin/api/" + v_ShopifyApiVersion.toString() + "/products.json?status=active&limit=250&fields=id&order=id+asc&since_id=" + v_LastID;
		r_GetProducts = invokeurl
		[
			url :v_Endpoint
			type :GET
			headers:m_Header
		];
		for each  r_ShopifyProduct in r_GetProducts.get("products")
		{
			if(!isnull(r_ShopifyProduct.get("id")))
			{
				l_ProductIDs.add(r_ShopifyProduct.get("id"));
			}
		}
		l_ProductIDs.sort();
		v_LastID = l_ProductIDs.get(l_ProductIDs.size() - 1);
	}
	//
	// output
	info "[" + l_ProductIDs + "]";
	info l_ProductIDs.size();
}
	- void API.fn_ShopifyQuery_GetActiveProducts()
 - {
 - m_Header = Map();
 - m_Header.put("Content-Type","application/json");
 - //
 - // your shopify details
 - v_ClientID = "<YOUR_CLIENT_ID>";
 - v_ClientSecret = "<YOUR_CLIENT_SECRET>";
 - v_ShopID = "example.myshopify.com";
 - v_ShopifyURL = "https://" + v_ClientID + ":" + v_ClientSecret + "@" + v_ShopID;
 - v_ShopifyApiVersion = "2020-01";
 - //
 - // loop through 2500 records
 - v_LastID = 0;
 - l_ProductIDs = List();
 - l_Pages = {1,2,3,4,5,6,7,8,9,10};
 - for each v_Page in l_Pages
 - {
 - v_Endpoint = v_ShopifyURL + "/admin/api/" + v_ShopifyApiVersion.toString() + "/products.json?status=active&limit=250&fields=id&order=id+asc&since_id=" + v_LastID;
 - r_GetProducts = invokeUrl
 - [
 - url :v_Endpoint
 - type :GET
 - headers:m_Header
 - ];
 - for each r_ShopifyProduct in r_GetProducts.get("products")
 - {
 - if(!isnull(r_ShopifyProduct.get("id")))
 - {
 - l_ProductIDs.add(r_ShopifyProduct.get("id"));
 - }
 - }
 - l_ProductIDs.sort();
 - v_LastID = l_ProductIDs.get(l_ProductIDs.size() - 1);
 - }
 - //
 - // output
 - info "[" + l_ProductIDs + "]";
 - info l_ProductIDs.size();
 - }
 
Well that produces a lot of ID numbers delimited by a comma. However, to match my use-case, I want a list to which I can give it an SKU, and it returns the Shopify Product ID (not of the variant but of the product). In which case, I need to tweak the above function a little to return the Product IDs, the Variant details and then output this to a map:
copyraw
	
Yields something like:
void API.fn_ShopifyQuery_GetActiveProducts()
{
	m_Header = Map();
	m_Header.put("Content-Type","application/json");
	// 
	// your shopify details 
	v_ClientID = "<YOUR_CLIENT_ID>";
	v_ClientSecret = "<YOUR_CLIENT_SECRET>";
	v_ShopID = "example.myshopify.com";
	v_ShopifyURL = "https://" + v_ClientID + ":" + v_ClientSecret + "@" + v_ShopID;
	v_ShopifyApiVersion = "2020-01";
	//
	// loop through active products range
	m_Sku_IDs = Map();
	v_LastID = 0;
	l_Pages = {1,2,3,4,5,6,7,8,9,10};
	for each  v_Page in l_Pages
	{
		v_Endpoint = v_ShopifyURL + "/admin/api/" + v_ShopifyApiVersion.toString() + "/products.json?status=active&limit=250&fields=id,variants&order=id+asc&since_id=" + v_LastID;
		r_GetProducts = invokeurl
		[
			url :v_Endpoint
			type :GET
			headers:m_Header
		];
		for each  r_ShopifyProduct in r_GetProducts.get("products")
		{
			if(!isnull(r_ShopifyProduct.get("id")))
			{
				//
				// an error-prone one-liner so that we don't hit an execution statement limit
				v_ProductSKU = ifnull(r_ShopifyProduct.get("variants").get(0).get("sku"), "UNKNOWN");
				m_Sku_IDs.put(v_ProductSKU, r_ShopifyProduct.get("id"));
				//
				// getting the last ID from the Shopify sort instead of making Zoho sort a list
				v_LastID = r_ShopifyProduct.get("id");
			}
		}
	}
	//
	// output
	info m_Sku_IDs;
	info m_Sku_IDs.size();
}
	- void API.fn_ShopifyQuery_GetActiveProducts()
 - {
 - m_Header = Map();
 - m_Header.put("Content-Type","application/json");
 - //
 - // your shopify details
 - v_ClientID = "<YOUR_CLIENT_ID>";
 - v_ClientSecret = "<YOUR_CLIENT_SECRET>";
 - v_ShopID = "example.myshopify.com";
 - v_ShopifyURL = "https://" + v_ClientID + ":" + v_ClientSecret + "@" + v_ShopID;
 - v_ShopifyApiVersion = "2020-01";
 - //
 - // loop through active products range
 - m_Sku_IDs = Map();
 - v_LastID = 0;
 - l_Pages = {1,2,3,4,5,6,7,8,9,10};
 - for each v_Page in l_Pages
 - {
 - v_Endpoint = v_ShopifyURL + "/admin/api/" + v_ShopifyApiVersion.toString() + "/products.json?status=active&limit=250&fields=id,variants&order=id+asc&since_id=" + v_LastID;
 - r_GetProducts = invokeUrl
 - [
 - url :v_Endpoint
 - type :GET
 - headers:m_Header
 - ];
 - for each r_ShopifyProduct in r_GetProducts.get("products")
 - {
 - if(!isnull(r_ShopifyProduct.get("id")))
 - {
 - //
 - // an error-prone one-liner so that we don't hit an execution statement limit
 - v_ProductSKU = ifnull(r_ShopifyProduct.get("variants").get(0).get("sku"), "UNKNOWN");
 - m_Sku_IDs.put(v_ProductSKU, r_ShopifyProduct.get("id"));
 - //
 - // getting the last ID from the Shopify sort instead of making Zoho sort a list
 - v_LastID = r_ShopifyProduct.get("id");
 - }
 - }
 - }
 - //
 - // output
 - info m_Sku_IDs;
 - info m_Sku_IDs.size();
 - }
 
copyraw
	
Which results in a map that I can give a Product SKU to and it will return the Shopify Product ID to me.  You may have noted also the precarious method in retrieving the product variant SKU (this will error/fail over if a product doesn't have a variant) and also how I get Shopify to return the last ID (as it is already sorting by ID) instead of getting Zoho to sort a list and retrieve the last element.{
  "TEST001": 1234567890123,
  "TEST002": 2345678901234
}
2
	- {
 - "TEST001": 1234567890123,
 - "TEST002": 2345678901234
 - }
 - 2
 
At time of print, I ran this to retrieve 1970 active product IDs and their SKUs without erroring by going over the Zoho Deluge statement execution limit.
Additional:
See my other articles for integrating Shopify API with Zoho Creator:
- Zoho Deluge - Push Item to Shopify
 - Zoho Creator - Integration with Shopify Checkout Storefront API
 - Zoho Creator - Receive JSON via a Shopify Webhook
 
Category: Zoho :: Article: 777
	

			     
						  
                
						  
                
						  
                
						  
                
						  
                

Add comment