There's a problem there. You are setting the output attribute to the same as the input. Also, you can't set the checkbox to those values. To make this work, you are essentially following Vince's suggestion: You must have two attributes: one checkbox, and one number input. In sheetworker mode that is: <input type='checkbox' name='attr_wfdagger_flag' value='3' checked /> <input type='number' name='attr_wfdagger' value='' readonly/> In your script, you dont need the Math.round line you can just use const wfdagger = (v.wfdagger_flag *1||0) -3; Also since this is a checkbox, with predefined inputs: 0 and 3, you don;t need the ||0. That is for setting a default value when no number is recognised. For inputs, an empty input or text can mess up a sheet worker when you are expecting a number, so you do need to use that. But you don't for checkboxes. So you can simplify it: const wfdagger = +v.wfdagger_flag -3; And since this is essentially a single line calculation, you can dispense with both consts like so on('change:wfdagger_flag sheet:opened', function () { getAttrs(['wfdagger_flag'], function (v) { setAttrs({ wfdagger: +v.wfdagger_flag -3 }); }); }); If you have a lot of weapons and they are all named essentially the same way (wf and the name, with no spaces) you can use a Universal Sheet Worker . something like ['dagger', 'sword', 'mace'].forEach(weapon => { on(`change:wf${weapon}_flag sheet:opened`, function () { getAttrs([`wf${weapon}_flag`], function (v) { const weapon = +v[`wf${weapon}_flag`] - 3; setAttrs({ [`wf${weapon}`]: weapon }); }); }); }); The forEach loop here creates a separate sheet worker for each weapon you define in the array at the start, and replaces every instance of $(weapon} with the weapon's name. This is one of the advantages of sheet workers over autocalc: it takes more code to set up a single sheet worker, but you can handle a lot of attributes with just a little bit extra code. All that said, you do need to decide what to do if people have skill levels in a particular weapon...