Hello all! I am bringing up a question that was asked 5 years ago and that was said to be not doable at that time ( <a href="https://app.roll20.net/forum/post/3106818/sheet-worker-dynamic-select-box-replacing-options-onchange" rel="nofollow">https://app.roll20.net/forum/post/3106818/sheet-worker-dynamic-select-box-replacing-options-onchange</a> ). I am trying to have two "select" that are linked, in the sense that the selected option in the first determines what options are available in the second. This will be used for inventory management. Depending on the two choices, this will create items with the relevant sets of stats, uses, etc. For example, my helm shoud not be destroyed after one use, but my potion should. I started my work from this webpage: <a href="https://www.dyn-web.com/tutorials/forms/select/paired.php" rel="nofollow">https://www.dyn-web.com/tutorials/forms/select/paired.php</a> . Here's what the HTML looks like : < fieldset class = "repeating_items" > < select name = "item_category" class = "item_category" > < option value = "item_category_equip" > Equipment </ option > < option value = "item_category_resource" > Resources & Crafting </ option > < option value = "item_category_consumable" > Consumables </ option > < option value = "item_category_other" > Quest & Other </ option > </ select > < select name = "item_subcategory" > <!-- <a href="https://www.dyn-web.com/tutorials/forms/select/paired.php populated using JavaScript --" rel="nofollow">https://www.dyn-web.com/tutorials/forms/select/paired.php populated using JavaScript --</a>> </ select > </ fieldset > Here's the Javascript: ar Select_Item_Subcategory = { 'item_subcategory' : { // name of associated select box // names match option values in controlling select box item_category_equip : { text : [ "Weapon" , "Armor" , "Shield" , "Helm" , "Cape" , "Gloves" , "Boots" , "Ring" , "Charm" , "Amulet" ], value : [ 'equip_subcategory_weapon' , 'equip_subcategory_armor' , 'equip_subcategory_shield' , 'equip_subcategory_helm' , 'equip_subcategory_cape' , "equip_subcategory_gloves" , "equip_subcategory_boots" , "equip_subcategory_ring" , "equip_subcategory_charm" , "equip_subcategory_amulet" ] }, item_category_resource : { text : [ "Metal" , "Leather" , "Wood" , "Fiber" , "Gem" , "Plant" , "Red Ingredient" , "Green Ingredient" , "Blue Ingredient" , "Acid" , "Fertilizer" , "Thickener" , "Weird Rock" ], value : [ 'resource_subcategory_metal' , "resource_subcategory_leather" , 'resource_subcategory_wood' , 'resource_subcategory_fiber' , "resource_subcategory_gem" , "resource_subcategory_plant" , "resource_subcategory_red" , "resource_subcategory_green" , "resource_subcategory_blue" , "resource_subcategory_acid" , "resource_subcategory_fertilizer" , "resource_subcategory_thickener" , "resource_subcategory_weirdrock" ] }, item_category_consumable : { text : [ "Health Potion" , "Stamina Potion" , "Magic Potion" , "Enhancer" , "Oil" , "Bomb" , "Morpher" ], value : [ "consumable_subcategory_health" , "consumable_subcategory_stamina" , "consumable_subcategory_magic" , "consumable_subcategory_enhancer" , "consumable_subcategory_oil" , "consumable_subcategory_bomb" , "consumable_subcategory_morpher" ] }, item_category_other : { text : [ "Light Source" , "Crafting Tools" , "Rope" , "Quest Item" ], value : [ "other_subcategory_light" , "other_subcategory_crafting" , "other_subcategory_rope" , "other_subcategory_quest" ] } } }; // removes all option elements in select box function removeAllOptions ( sel ) { var len , par ; len = sel . options . length ; for ( var i = len ; i ; i --) { par = sel . options [ i - 1 ]. parentNode ; par . removeChild ( sel . options [ i - 1 ]); } } // adds the options to the select box function appendDataToSelect ( sel , obj ) { var f = document . createDocumentFragment (); var opts ; function addOptions ( obj ) { var f = document . createDocumentFragment (); var o ; for ( var i = 0 , len = obj . text . length ; i < len ; i ++) { o = document . createElement ( 'option' ); o . appendChild ( document . createTextNode ( obj . text [ i ])); if ( obj . value ) { o . value = obj . value [ i ]; } f . appendChild ( o ); } return f ; } opts = addOptions ( obj ); f . appendChild ( opts ); sel . appendChild ( f ); } // anonymous function assigned to onchange event of controlling select box document . forms [ 'equip_form' ]. elements [ 'item_category' ]. onchange = function ( e ) { // name of associated select box var relName = 'item_subcategory' ; // reference to associated select box var relList = this . form . elements [ relName ]; // get data from object literal based on selection in controlling select box (this.value) var obj = Select_Item_Subcategory [ relName ][ this . value ]; // remove current option elements removeAllOptions ( relList ); // call function to add optgroup/option elements // pass reference to associated select box and data for new options appendDataToSelect ( relList , obj ); }; Is something like this now feasible? If it is not, is there a convenient workaround for my players? I am fine hardcoding stuff if need be. Or maybe there's another approach to inventory creation/destruction that works well? Thanks!