Google sheets - How to add two rows for two different items on the same order?

:bullseye: What is your goal?

To have a seperate row for each item on a single order.

:thinking: What is the problem & what have you tried?

I integrated WooCommerce with Google Sheets to automatically log my orders instead of entering them manually.

It works fine for single-product orders. But when a customer buys multiple products in one order, only the first product shows up in the sheet.

In the screenshot, row 138 shows only one item under “Item description,” even though two products were purchased.

In row 139, I tried adding multiple “Line items” fields to capture additional products, but it just keeps repeating the first product (“Daphnie Belle Dress”) instead of pulling the others.

Ideally, each product in an order would be added as a separate row. If that’s not possible, I at least want all products from the order to appear within a single cell.

How can I fix this?

:camera_with_flash: Screenshots (scenario flow, module settings, errors)

Hey there,

can you also show screenshots of what’s coming from woocommerce and how the google sheets module is setup?

Hello,

I am curious what is showing up when Make runs? I personally would expect it to show up as multiple bundles as an output. This would mean you could leave the scenario to just simply map “Create a New Row” in Sheets and just map the single item. Most likely WooCommerce is outputting the purchase as LineItems which means that you would need an Iterator to separate them. Do you know what Make is outputting in the response?

To “split” an array of items (products in your case) into multiple bundles, use an Iterator module.

“Looping” Through Array Items

When you see an array in a module’s output, think of using an Iterator module. This allows you to individually access and process each item in the array.

In this example, this variable is an array of items (collections). You’ll want to map this variable in an Iterator module.

Question: Have you tried mapping your array variable into an Iterator module, ran the scenario once, and view the output? Then …

Combining Bundles Using Aggregators

Every result/item from some module types (like Trigger / Iterator / List / Search / Match modules) can potentially and likely output more than one bundle. These multiple bundles will individually run subsequent modules once per bundle, which is not optimal in most cases:

  • one operation per bundle per module, which could lead to…
  • use of multiple credits per bundle per module (some modules use more than one credit)
View example screenshots

Aggregator Example

The “Search Rows” module runs one time, returning 999 results (999 bundles).

  • Without Aggregator: the tools module run 999 times (999 operations)


    (and if there are more modules, they run 999 times each)

  • With Aggregator: the tools module only runs 1 time (1 operation)

:warning: Warning: :police_car_light:
This can easily use your entire quota of credits if you are not careful or fail to understand this concept.

To “combine” multiple bundles into a single variable, so that you can process all of the items in a single operation, you’ll need to use an aggregator. Aggregators is a type of module that accumulates bundles and outputs one bundle (unless you are using “Group By”). An example of a commonly-used aggregator module is the Array aggregator module.

You can find out more about some other aggregator modules here:

Question: Which is the best aggregator do you think you’ll need for your use-case?

Setting the Correct Aggregator Source

You need to set the “Source Module” field of the aggregator to where the bundles are coming from. This is usually an iterator module, but can also be a search/list/repeater module, or even the trigger module!

Mapping a Complex (Collection) Structure Into an Array Field

The Array Aggregator module is very powerful because it allows you to build a new complex array of collections that matches a later module’s array field to map multiple items (collections) to it. Such fields initially may allow you to manually add individual items, but toggle the “Map” switch on, and you can map an array variable (from an Array Aggregator) containing multiple collections.

Simply select the respective “Target structure type” in an Array Aggregator module.

As you can see from the example above, the “Map” toggle on complex array fields are used when you have an array variable (like from an array aggregator).

:clipboard: Note: :light_bulb:
Other combinations of modules may also allow you to generate an array that matches a future module field’s array structure, like “Aggregate to JSON + Parse JSON”, or “Create JSON + Parse JSON”, but this is an advanced topic.

Question: Are you mapping your array into a field that accepts more than one item/collection?

Example

Here is an example of how your scenario could look like:

This is just an example. Your solution may or may not look like this depending on requirements and actual data.

For more information, see “Mapping with arrays” in the Help Centre. I also suggest going through the Make Academy, which also covers the use of Iterators & Aggregators.

— @samliew

Hello, OP here.

I was able to fix this by adding a simple iterator and selecting “line items” in between Woo commerce and Google sheets. Now it adds a new row for every product.

1 Like