Check out the ‘All Components’ column in the All Contracts table. It loops over a list and pulls information from multiple fields (some from another table)
https://templates.getgrist.com/gZmzYoGdS6b1/Custom-Product-Builder/p/11
The formula used here is:
'\n'.join(sorted(
"{} — {:g} {}".format(comp.Component, quantity, comp.Unit)
for (comp, quantity) in $Components.items()
))
We are using the join() method, sorted() function and format() method method all in one!
''.join() joins each item in the list.
'\n' adds a new line between each item in the list.
sorted() sorts the items in the list alphabetically.
This leaves us with the following:
"{} — {:g} {}".format(comp.Component, quantity, comp.Unit)
for (comp, quantity) in $Components.items()
We’ll work through this backwards. First, we need to take a look at the Components column which is a hidden column in the All Contracts table.
This column is a list of components and their associated quantities for the contract. In the for loop, we assign each item in the list of components two variables, comp and quantity. For Components[3]: 6.0 , comp = Components[3] and quantity = 6.0 . Components[#] specifies a Component in the Components table by Row ID. Components[3] is the component assigned 3 as it’s row id.

Now, we run each item from the list above through the equation "{} — {:g} {}".format(comp.Component, quantity, comp.Unit) .
comp.Component replaces the first set of {} . comp is the variable with our component ID so comp.Component finds the value in the Component column associated with that row ID. For Components[3] , comp.Component is Nozzle.
quantity replaces the second set of {} . Again, the quantity is the second variable in our list. For Components[3]: 6.0 , quantity is 6.0 . Our second set of {} are not empty. They include :g . This converts the value to a floating-point number.
comp.Unit replaces the last set of {} . comp is the variable with our component ID so comp.Unit finds the value in the Unit column associated with that row ID. For Components[3] , comp.Unit is None .
This formula is a bit in-depth so if you need assistance writing your own, you can share your document with support@getgrist.com and let us know what you need the formula to do and we’d be happy to help out!
