I cant test the above code, because it has autocalcs that require attributes from elsewhetre in the sheet, but since it looks like the vast majority of them are either single attributes or grups of attributes you just add together, they could be replaced with some short sheet worker code. First, I would do a global find/replace and change disabled to readonly . Next, build an object in notepad that looks like this: const inputs = { gold_from_gold_mine: [ 'gold_mine_1_qty' ], gold_from_import: [ 'faction_15_gold_import' , 'faction_14_gold_import' , 'faction_13_gold_import' , 'faction_12_gold_import' , 'faction_11_gold_import' , 'faction_10_gold_import' , 'faction_09_gold_import' , 'faction_08_gold_import' , 'faction_07_gold_import' , 'faction_06_gold_import' , 'faction_05_gold_import' , 'faction_04_gold_import' , 'faction_03_gold_import' , 'faction_02_gold_import' , 'faction_01_gold_import' , 'merchant_gold_import' ], /* input name: [all attributes to be added put in an array, each attribute in quotes and separated by a comma ] */ } What your doing here: going through every single autoclac which is either a single attribute or a group of attributes added together: at the start of the line, the name of the input (with the attr_ part removed) The a placeholder for an array of attributes that looks like : ['']; Inside that paste the autocalc attributes that might be like @{something}+@{something_else}, so you'll have a line that looks like this: destination: ['@{something}+@{something_else}']; Once you have created all the lines, do several global find/replaces: find: }+@{ replace: ', ' find: ['@{ replace: [' find: }'] replace: '] you'll now have several lines that look like destination: ['something', 'something_else']; Now copy that into the inputs variable, see what I have for refetrence. Finally, copy this into your script block (replacing this const inputs with the one you just created). const inputs = { gold_from_gold_mine: [ 'gold_mine_1_qty' ], gold_from_import: [ 'faction_15_gold_import' , 'faction_14_gold_import' , 'faction_13_gold_import' , 'faction_12_gold_import' , 'faction_11_gold_import' , 'faction_10_gold_import' , 'faction_09_gold_import' , 'faction_08_gold_import' , 'faction_07_gold_import' , 'faction_06_gold_import' , 'faction_05_gold_import' , 'faction_04_gold_import' , 'faction_03_gold_import' , 'faction_02_gold_import' , 'faction_01_gold_import' , 'merchant_gold_import' ], /* input name: [all attributes to be added put in an array, each attribute in quotes and separated by a comma ] */ } Object . keys ( inputs ). forEach ( input => { const atts = inputs [ input ]; on ( ` ${ atts . map ( att => `change: ${ att } ` ). join ( ' ' ) } sheet:opened` , () => { getAttrs ( atts , values => { const output = {}; const sum = atts . reduce (( all , one ) => all + (+ values [ one ] || 0 ), 0 ); setAttrs ({ [input]: sum }); }); }); }); This code will create a sheet worker for each autocalc from the inputs object. Any that use floor() or divide by 2 or 5 or anything that is not a plain addition can't be handled by this. For now, in the html replace them with value="0" (you can create proper sheet workers for the later), and we can get them working properly later once we know these are working. And that's it - a massive number of your autocalcs have been converted to sheet workers, and that sheet worker from above should work properly. Note you have some that a multiples, like: value="(@{harbor_qty})*2" You can do these by just adding the attribute as many times as the multiple, like: : [ ' harbor_qty ' , ' harbor_qty '],