And here's a replacement for the earlier total_ calculation, that is more efficient. const all_skills = { trading : 'cool' , concentration : 'willpower' , concealreveal : 'intelligence' , lipreading : 'intelligence' , perception : 'intelligence' , tracking : 'intelligence' , athletics : 'dexterity' , contortionist : 'dexterity' , dance : 'dexterity' , endurance : 'willpower' , torturedrugs : 'willpower' , stealth : 'dexterity' , driveland : '' , pilotsea : '' , riding : '' , accounting : '' , animalhandling : '' , bureaucracy : '' , business : '' , composition : '' , criminology : '' , cryptography : '' , deduction : '' , education : '' , gamble : '' , streetslang : '' , languagea : '' , languageb : '' , librarysearch : '' , yourhome : '' , localexperta : '' , localexpertb : '' , sciencea : '' , scienceb : '' , tactics : '' , wilderness : '' , brawling : 'dexterity' , evasion : '' , melee : 'dexterity' , acting : '' , instrumenta : '' , instrumentb : '' , archery : '' , handgun : 'reflex' , shoulderarms : 'reflex' , bribery : '' , conversation : '' , humanperception : '' , interrogation : '' , persuasion : '' , personalgrooming : '' , streetwise : '' , wardrobe : 'cool' , avtech : 'technique' , basictech : 'technique' , cybertech : 'technique' , firstaid : 'technique' , forgery : 'technique' , lvtech : 'technique' , paintdrawsculpt : 'technique' , photographyfilm : 'technique' , picklock : 'technique' , pickpocket : 'technique' , svtech : 'technique' , weaponstech : 'technique' , pilotair : '' , martial : 'dexterity' , autofire : 'reflex' , heavyarms : 'reflex' , demolitions : 'technique' , electronicssecurity : 'technique' , paramedic : 'technique' , charismaticimpact : '' , interface : '' , fieldexpertise : '' , upgradeexpertise : '' , fabricationexpertise : '' , inventionexpertise : '' , surgery : '' , pharmaceuticals : '' , cryosystem : '' , credibility : '' , teamwork : '' , backup : '' , operator : '' , moto : '' , }; const all_skills_lvl_misc = []; Object . keys ( all_skills ). forEach ( skill => all_skills_lvl_misc . push ( "lvl_" + skill , "misc_" + skill )); const all_skills_lvl_misc_changes = all_skills_lvl_misc . map ( skill => `change: ${ skill } ` ). join ( ' ' ); const stats_lower = [ "intelligence" , "reflex" , "dexterity" , "technique" , "cool" , "willpower" , "luck" , "movement" , "body" , "empathy" ]; const stats_changes = stats_lower . map ( stat => `change: ${ stat . toLowerCase () } ` ). join ( ' ' ); on ( ` ${ all_skills_lvl_misc_changes } ${ stats _changes} sheet:opened` , function () { getAttrs ([... stats _lower. map ( stat => stat . toLowerCase ()), ... all_skills_lvl_misc ], function ( values ) { const output = {}; Object . keys ( all_skills ). forEach ( skill => { // create the variables for the relevant attributes const base = parseInt ( values [ "lvl_" + skill ]) || 0 ; const misc = parseInt ( values [ "misc_" + skill ]) || 0 ; const stat = parseInt ( values [ all_skills [ skill ]]) || 0 ; const total = base + misc + stat ; output [ 'total_' + skill ] = total ; }); setAttrs ( output ); }); }); This assumes you have followed one previous requirement: changed all the total_ attributes from disable=true to readonly. It also requires that you fill in the attribute for each skill in that first all_skills variable. I've done a bunch of them. Some skills have no stat (like cryosystem and credibility). Leave the value: ''. This will calculate the stat at 0. Note that any skill you dont change disabled="true" to readonly will still work as an autocalc, so if you only changed the weapon skills listed in the previous post, this would work fine for getting the repeating section worker to work properly, and you could update the worker above with other skills as and when you have time.