Okay, some assumptions. I;m assuming your repeating section is called repeating_skills, like <fieldset class="repeating_skills"> I'm also going to assume that your linked attribute has no effect on the skill cost. The attributes that are relevant are skill_level , skill_cost_multiplier , and skill_cost , defined something like <input type="number" name="attr_skill_level" value="0" /> <input type="hidden" name="attr_skill_cost_multiplier" value="1" /> <input type="number" name="attr_skill_cost" value="0" readonly /> I am also going to assume that the total cost of skills goes in an attribute called total_skills_cost , which is somewhere on the sheet outside the repeating section. So the sheet worker to calculate the cost of individual skills is as follows: on(`change:repeating_skills:skill_level change:repeating_skills:skill_cost_multiplier`, () => { getAttrs(['repeating_skills_skill_level', 'repeating_skills_skill_cost_multiplier'], v => { const level = parseInt(v['repeating_skills_skill_level']) || 0; const multiplier = parseInt(v['repeating_skills_skill_cost_multiplier']) || 1; const cost = (level * level + level) /2 * multiplier; setAttrs({ repeating_skills_skill_cost: cost }); }); }); This will calculate the cost of each individual skill, as you enter the level, or change the multiplier. Now to calculate the total for the section, you need to enter the repeatingSum function, unchanged from the website, and then follow it with a sheet worker which uses it to calculate the total. That looks like this: /* ===== PARAMETERS ========== destinations = the name of the attribute that stores the total quantity can be a single attribute, or an array: ['total_cost', 'total_weight'] If more than one, the matching fields must be in the same order. section = name of repeating fieldset, without the repeating_ fields = the name of the attribute field to be summed destination and fields both can be a single attribute: 'weight' or an array of attributes: ['weight','number','equipped'] */ const repeatingSum = (destinations, section, fields) => { if (!Array.isArray(destinations)) destinations = [destinations.replace(/\s/g, '').split(',')]; if (!Array.isArray(fields)) fields = [fields.replace(/\s/g, '').split(',')]; getSectionIDs(`repeating_${section}`, idArray => { const attrArray = idArray.reduce((m, id) => [...m, ...(fields.map(field => `repeating_${section}_${id}_${field}`))], []); getAttrs([...attrArray], v => { const getValue = (section, id, field) => v[`repeating_${section}_${id}_${field}`] === 'on' ? 1 : parseFloat(v[`repeating_${section}_${id}_${field}`]) || 0; const commonMultipliers = (fields.length <= destinations.length) ? [] : fields.splice(destinations.length, fields.length - destinations.length); const output = {}; destinations.forEach((destination, index) => { output[destination] = idArray.reduce((total, id) => total + getValue(section, id, fields[index]) * commonMultipliers.reduce((subtotal, mult) => subtotal * getValue(section, id, mult), 1), 0); }); setAttrs(output); }); }); }; on(`change:repeating_skills:skill_cost`, () => { repeatingSum("total_skills_cost","skills","skills_cost"); }); And there you go. Note if you havent created any sheet workers on your sheet, you need to create a scropt open and closing tag, and put the above code inside it. That looks like this: <script type="text/worker"> // put your sheet workers here.
</script>