You cant make formfields dynamically on roll20. All you can do is make them ahead of time, and show or hide them with CSS. The technique to do this is described on the wiki's CSS Wizardry page. But it sounds like you also must check the Building Character Sheets page - this details the specifics of how roll20 differs from other websites, and what limitations you must deal with. To your specific problem: can you say in words what you are trying to do? it looks like you are altering the KL and MU values conditionally. Describe how this works and we can tell you how to build the sheet worker. The first version of your sheet worker is close to correct by the way, you wouldnt want to build one like the second version. Heres what your sheet worker looks like with the code corrected. But I'm not sure it;ll do what you need it to, so it's a good idea to describe what it's meant to do: on("change:mu change:calcmoney sheet:opened", function() { getAttrs(["MU", "KL", "calcMoney"], function(values) { let calcMoney = parseInt(values.calcMoney) || 0; let MU = parseInt(values.MU) || 0; let KL = parseInt(values.KL) || 0; if (MU >= 10 && calcMoney == 1) { setAttrs({ MU: MU - 10, KL: KL + 1 }); } }); }); Some things about the sheet worker: Because of roll20's baffling design, attribute names on the on(change) line (and only that line) must always be written in lower case or they wont work reliably. For this reason, it's generally recommended to create your attributes entirely in lower case. In the three lines starting with let, I define the variables of all the values first. You dont need to do this, but when you're new, its best practice. It makes it easier to do error checking and finding faults later. Attributes in roll20 are stored as strings, so its best to coerce them into numbers before you do any arithmetic or logical checking with them, which is why i used parseInt. setAttrs can handle multiple attribute assignments at the same time, so i combined the setAttrs statements. The problem I see with this: the sheet worker will run every time the sheet is opened. So the MU and KL attributes might keep changing more than you want them to. You could remove the sheet:opened from the first line, and then they'd change only when the values are altered.