Gonna post it verbatim as I have it in my PC sheet (minus the head, body, etc. stuff) <div style="display: none;"> <input name="attr_skillrank_total" type="hidden" value="0" readonly> </div> <fieldset class="repeating_skills"> <div class="row"> <div class="col-1-11 padr padb center help"> <button type="roll" style="font-weight: bold;" class="text-button" name="roll_skill" value="&{template:DEPGold} {{name=@{pc_skillname}}} {{subtags=@{pc_skilladj} Adj &#10070; @{pc_skillgov} Gov Mod}} {{check=Result: [[ d12 + (@{pc_skillgov}) + (@{skillrank}) + (@{pc_skilladj}) ]] }}"> Chk</button> </div> <div class="col-1-11 padr"> <input name="attr_pc_skilladj" class="ul" type="number" value="0"></div> <div class="col-1-11 padr"> <input name="attr_skillrank" class="ul" type="number" value="0" min="0"></div> <div class="col-3-11 center padr"> <select class="center ul" name="attr_pc_skillgov"> <option value="0" selected>n/a</option> <option value="@{pc_agi_mod}">AGI</option> <option value="@{pc_str_mod}">STR</option> <option value="@{pc_con_mod}">CON</option> <option value="@{pc_int_mod}">INT</option> <option value="@{pc_wis_mod}">WIS</option> <option value="@{pc_cha_mod}">CHA</option> </select> </div> <div class="col-5-11 padr"> <input name="attr_pc_skillname" class="ul" type="text" placeholder="Skill Data"></div> </div> </fieldset> <script type="text/worker"> <!----------------------------------------------------------- REPEATING-FIELD SUM SYSTEM ------------------------------------------------------------> const repeatingtotal = (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); }); }); }; /* ================================== RPT FIELD ATTR PARAMETERS ====================================== */ on('change:repeating_skills remove:repeating_skills', function() { repeatingSum("skillrank_total","skills","skillrank"); }); </script> **Edit** I've tried several combos, incl. manually replacing the ${section}, ${id}, etc. with a direct attr; e.g. ${skills}, ${skillrank_total}, etc.. I even tried making the attrs look more like JS, by changing them to things like "skillRank_Total", "skillRank", etc.. I didn't figure it made any difference, but I've been so h3llbent on trying to make GiGs script work, I started trying ridiculous things, lol, to make it work. After 20 (or so) attempts, I said screw it, & tried TAS, since it was the only other option I had, outside of fumbling to make my own JS (which would NOT be pretty, lol).