I went ahead and did it anyway. The code below allows you have any number of repeating sections (say, items, talents, spells, even injuries) that modify any number of base stats, as long they are have specific attributes named in certain ways: Setting Up Stats (the HTML part): Each stat needs a base stat, a total stat, and one stat for each repeating section, like so: < input type = "number" name = "attr_dexterity_base" value = "10" > < input type = "number" name = "attr_dexterity_talent" value = "0" readonly > < input type = "number" name = "attr_dexterity_item" value = "0" readonly > < input type = "number" name = "attr_dexterity" value = "0" title = "@{dexterity}" readonly > Note the attributes linked to a repeating section must be named in singular terms (stat_talent, not stat_talents). You can optionally include a modifier stat that totals up the repeating section, and hide the others, like so < input type = "number" name = "attr_dexterity_base" value = "10" > < input type = "hidden" name = "attr_dexterity_talent" value = "0" > < input type = "hidden" name = "attr_dexterity_item" value = "0" > < input type = "number" name = "attr_dexterity_modifier" value = "0" readonly > < input type = "number" name = "attr_dexterity" value = "0" title = "@{dexterity}" readonly > That way you keep down the stat bloat. If you want to show those hidden stats somewhere on the sheet you can simply move them. Setting up the Repeating Sections Each repeating section needs a name, and it must be plural, like repeating_ talent s, repeating_ item s, etc. Notice the part in bold, that is the sections identifying key. Each section needs three attributes within it. A select, with options equal to the stat names exactly ('dexterity', 'strength', etc), and the select itself needs to be named key _stat, so talent_stat, or item_stat, etc. A number input, named key _bonus, where the user enters the size of the modifier. This could be a select too, if you wish to limit the range of modifiers. A checkbox, named key _active, where the user can set whether the modifier is active or not. You can have more stats in the section, but those three must be there. The repeating talents section from earlier will work with no modifications. And here's one for items- notice it is almost identical. < label > Items </ label > < fieldset class = "repeating_items" > < div class = "items" > < select name = "attr_item_stat" > < option value = "-" selected > (Choose) </ option > < option value = "dexterity" > DEX </ option > < option value = "strength" > STR </ option > < option value = "faith" > FAI </ option > </ select > < input type = "number" name = "attr_item_bonus" value = "1" > < input type = "checkbox" name = "attr_item_active" value = "1" checked > </ div > </ fieldset > Setting up the Sheet Workers The following code will handle any number of stats and any number of repeating sections. The very first three lines are the only ones you need to change. Details below. // user defined functions, set up name of stats, and repeating sections. const stats = [ 'strength' , 'dexterity' , 'faith' ]; const sections = [ 'talent' , 'item' ]; const useModifier = 0 ; // utility functions and variables const sectionFieldName = ( section , field , id = '' ) => `repeating_ ${ section } s ${ id ? `_ ${ id } _` : ':' }${ section } _ ${ field } ` ; const sectionFields = [ 'stat' , 'bonus' , 'active' ]; const buildSectionChanges = ( section , fields ) => fields . reduce (( a , field ) => ` ${ a } change: ${ sectionFieldName ( section , field ) } ` , `remove:repeating_ ${ section } s sheet:opened` ); // a loop to create a sheet worker for each stat, that adds the subordinate stats to get the final total for each stat stats . forEach ( stat => { on ( `change: ${ stat } _base ${ sections . reduce (( a , section ) => ` ${ a } change: ${ stat } _ ${ section } ` , '' ) } sheet:opened` , () => { getAttrs ([ ` ${ stat } _base` , ... sections . map ( section => ` ${ stat } _ ${ section } ` )], values => { const stat_values = Object . values ( values ); const output = {}; output [ stat ] = stat_values . reduce (( a , b ) => (+ a || 0 ) + (+ b || 0 ), 0 ); if ( useModifier ) { output [ ` ${ stat } _modifier` ] = sections . reduce (( a , section_name ) => a + (+ values [ ` ${ stat } _ ${ section_name } ` ] || 0 ), 0 ); } setAttrs ( output ); }); }); }); // a worker to check repeating section designed to apply stat modifiers sections . forEach ( section => { on ( buildSectionChanges ( section , sectionFields ), () => { // need to check every row of the repeating section getSectionIDs ( `repeating_ ${ section } s` , idarray => { const fieldnames = []; idarray . forEach ( id => sectionFields . forEach ( field => fieldnames . push ( sectionFieldName ( section , field , id )))); getAttrs ([... fieldnames ], values => { const output = {}; // set the base for each talwnt bonus to 0 stats . forEach ( stat => output [ ` ${ stat } _ ${ section } ` ] = 0 ); // now loop through each row and see which stat needs increaseing idarray . forEach ( id => { const which = values [ sectionFieldName ( section , 'stat' , id )]; const bonus = + values [ sectionFieldName ( section , 'bonus' , id )] || 0 ; const active = + values [ sectionFieldName ( section , 'active' , id )] || 0 ; if ( active && stats . includes ( which )) { output [ ` ${ which } _ ${ section } ` ] = output [ ` ${ which } _ ${ section } ` ] + bonus ; } }); setAttrs ( output ); }); }); }); }); So the bits you need to change are these lines: const stats = [ 'strength' , 'dexterity' , 'faith' ]; const sections = [ 'talent' , 'item' ]; const useModifier = 0 ; Change the stats array to exactly what your stat names are. Change the sections array to an array of the repeating section keys (notice they are singular not plural). Set useModifier to 1, if you are using a stat_modifier stat, to show the total of all modifiers from repeating sections. And that's it - give it a whirl.