Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

Sheet Workers, Sheet Conversion, And Repeating Sections

1492820952
Finderski
Pro
Sheet Author
Compendium Curator
So, I'm updating the Savage Worlds (Tabbed) character sheet and I'm wanting to get rid of an entire section (the Mook section) because I have a more efficient way of handling mooks that leverages the same fields as the Wild Card characters.  So, I will need to set up a sheet worker to convert all the mook attributes to the new attribute name (I think I know how to do this). The problem I'm looking at is how to convert repeating section items.  Is there any way to accomplish this, or is it a fools errand and I'll need a full blown API script for it?
1492887800

Edited 1492888093
Diana P
Pro
Sheet Author
You can play with repeating sections in sheetworkers. My scripting is not particularly elegant or good but here is an example. :) This is a setup function for my RMSS char sheet which copies a value within the repeating skills section to a new name (to fix a typo in the sheet which was messing with my other sheet workers) and also creates a new sections for languages and copies the pertinent values from the old divided sections into the new section.  It then updates the version variable and a variable to track whether the languages have been moved or not so I don't have to do this every time the sheet is opened. function StartingSetup(version, cversion, calc, langsmoved) {     mod = version;     console.log('/* ----------entering StartingSetup; sheetversion:' + version + '  cversion:' + cversion + '  calc:' + calc + '------------ */' + langsmoved);     if ((version < cversion) || (isNaN(version)) || (calc == 0)) {         mod = cversion;         if ((isNaN(version)) || (calc == 0)) { //                copy repeating_skills_skillranksbonus to repeating_skills_skillrankbonus to fix typo so that the calc function works on these.             getSectionIDs("repeating_skills", function(idarray){                 if (idarray.length>0) {                     _.each(idarray, function(currentID) {                         getAttrs(["repeating_skills_"+currentID+"_skillranksbonus", "repeating_skills_"+currentID+"_skillrankbonus"], function(values) {                             var update = {};                             update["repeating_skills_"+currentID+"_skillrankbonus"] = parseInt(values["repeating_skills_"+currentID+"_skillranksbonus"],10);                             setAttrs(update);                         });                     });                 }                             });         }                  }              if ((langsmoved == 0) || (isNaN(langsmoved))) {       //if the languages have already been moved; don't do it again! //  Copy/create languages           getSectionIDs("repeating_languages", function(idarray){             if (idarray.length>0) {     console.log("Language ID array length: "+idarray.length);                 _.each(idarray, function(currentID) {                     getAttrs(["repeating_languages_"+currentID+"_languagename", "repeating_languages_"+currentID+"_languagespoken-rank", "repeating_languages_"+currentID+"_languagespoken-skill", "repeating_languages_"+currentID+"_languagewritten-rank", "repeating_languages_"+currentID+"_languagewritten-skill", "repeating_languages2_"+currentID+"_language2name", "repeating_languages2_"+currentID+"_language2spoken-rank", "repeating_languages2_"+currentID+"_language2spoken-skill", "repeating_languages2_"+currentID+"_language2written-rank", "repeating_languages2_"+currentID+"_language2written-skill"], function(values) {                         var update = {};                         var newID = generateRowID();                         if (values["repeating_languages_"+currentID+"_languagename"]){                        //   Check for languagename                             update["repeating_langs_"+newID+"_languagename"] = values["repeating_languages_"+currentID+"_languagename"];                         } else {                                                                            //   Else set the name to 'Trade' in case folks didn't change from what was diplayed. //    console.log("Not a lang1");                             update["repeating_langs_"+newID+"_languagename"] = "Trade"                         }                         if (values["repeating_languages_"+currentID+"_languagespoken-rank"]){                //   Check for languagespoken-rank                             update["repeating_langs_"+newID+"_languagespokenranks"] = values["repeating_languages_"+currentID+"_languagespoken-rank"];                         } else {                                                                            //   Else set it to the default 4 in case folks didn't change from what was diplayed.                             update["repeating_langs_"+newID+"_languagespokenranks"] = 4;                         }                         if (values["repeating_languages_"+currentID+"_languagewritten-rank"]){                //   Check for languagewritten-rank                             update["repeating_langs_"+newID+"_languagewrittenranks"] = values["repeating_languages_"+currentID+"_languagewritten-rank"];                         } else {                                                                            //   Else set it to the default 4 in case folks didn't change from what was diplayed.                             update["repeating_langs_"+newID+"_languagewrittenranks"] = 4;                         } //        if the sheet does not do the calc for you, then copy the skills as well.                         if (calc == 0) {                             if (values["repeating_languages_"+currentID+"_languagespoken-skill"]){            //   Check for languagespoken-skill                                 update["repeating_langs_"+newID+"_languagespokenrankbonus"] = values["repeating_languages_"+currentID+"_languagespoken-skill"];                             } else {                                                                        //   Else set it to the default 45 in case folks didn't change from what was diplayed.                                 update["repeating_langs_"+newID+"_languagespokenrankbonus"] = 45;                             }                                                         if (values["repeating_languages_"+currentID+"_languagewritten-skill"]){            //   Check for languagewritten-skill                                 update["repeating_langs_"+newID+"_languagewrittenrankbonus"] = values["repeating_languages_"+currentID+"_languagewritten-skill"];                             } else {                                                                        //   Else set it to the default 45 in case folks didn't change from what was diplayed.                                 update["repeating_langs_"+newID+"_languagewrittenrankbonus"] = 45;                             }                         }                         setAttrs(update);                     });                 });             }         });                  getSectionIDs("repeating_languages2", function(idarray2){             if (idarray2.length>0) {     console.log("Language2 ID array length: "+idarray2.length);                 _.each(idarray2, function(currentID2) {                     getAttrs(["repeating_languages_"+currentID2+"_languagename", "repeating_languages_"+currentID2+"_languagespoken-rank", "repeating_languages_"+currentID2+"_languagespoken-skill", "repeating_languages_"+currentID2+"_languagewritten-rank", "repeating_languages_"+currentID2+"_languagewritten-skill", "repeating_languages2_"+currentID2+"_language2name", "repeating_languages2_"+currentID2+"_language2spoken-rank", "repeating_languages2_"+currentID2+"_language2spoken-skill", "repeating_languages2_"+currentID2+"_language2written-rank", "repeating_languages2_"+currentID2+"_language2written-skill"], function(values) {                         var update = {};                         var newID2 = generateRowID();                         if (values["repeating_languages2_"+currentID2+"_language2name"]){              //   If there is no languagename, then try language2name //    console.log("Not a lang1");                             update["repeating_langs_"+newID2+"_languagename"] = values["repeating_languages2_"+currentID2+"_language2name"];                         } else {                                                                            //   Else set the name to 'Trade' in case folks didn't change from what was diplayed. //    console.log("Not a lang1");                             update["repeating_langs_"+newID2+"_languagename"] = "Trade"                         }                         if (values["repeating_languages2_"+currentID2+"_language2spoken-rank"]){        //   If there is no languagespoken-rank, then try language2spoken-rank                             update["repeating_langs_"+newID2+"_languagespokenranks"] = values["repeating_languages2_"+currentID2+"_language2spoken-rank"];                         } else {                                                                            //   Else set it to the default 4 in case folks didn't change from what was diplayed.                             update["repeating_langs_"+newID2+"_languagespokenranks"] = 4;                         }                         if (values["repeating_languages2_"+currentID2+"_language2written-rank"]){        //       If there is no languagewritten-rank, then try language2written-rank                             update["repeating_langs_"+newID2+"_languagewrittenranks"] = values["repeating_languages2_"+currentID2+"_language2written-rank"];                         } else {                                                                            //   Else set it to the default 4 in case folks didn't change from what was diplayed.                             update["repeating_langs_"+newID2+"_languagewrittenranks"] = 4;                         } //        if the sheet does not do the calc for you, then copy the skills as well.                         if (calc == 0) {                             if (values["repeating_languages_"+currentID2+"_language2spoken-skill"]){    //   If there is no languagespoken-skill, then try language2spoken-skill                                 update["repeating_langs_"+newID2+"_languagespokenrankbonus"] = values["repeating_languages2_"+currentID2+"_language2spoken-skill"];                             } else {                                                                        //   Else set it to the default 45 in case folks didn't change from what was diplayed.                                 update["repeating_langs_"+newID2+"_languagespokenrankbonus"] = 45;                             }                                                         if (values["repeating_languages_"+currentID2+"_language2written-skill"]){    //   If there is no languagewritten-skill, then try language2written-skill                                 update["repeating_langs_"+newID2+"_languagewrittenrankbonus"] = values["repeating_languages2_"+currentID2+"_language2written-skill"];                             } else {                                                                        //   Else set it to the default 45 in case folks didn't change from what was diplayed.                                 update["repeating_langs_"+newID2+"_languagewrittenrankbonus"] = 45;                             }                         }                         setAttrs(update);                     });                 });             }         });                  setAttrs({             languagesmoved: 1    // set the languages as moved         });     }    console.log('/* ----------leaving StartingSetup; mod:' + mod + '------------ */');        setAttrs({       character_sheet: "RMSS-FullCalcs v3."+mod     });    return mod; } I have some comments in there to remind me what I am doing in each section; hope it helps.
1492888022

Edited 1492888255
Diana P
Pro
Sheet Author
it gets called with: //  <!---- Run the setup if the sheet is opened or the recalc box is clicked ----> on("sheet:opened change:skillcalc", function() {   getAttrs(["sheetversion", "currentsheetversion", "skillcalc", "languagesmoved"], function(values) {     setAttrs({       sheetversion: StartingSetup(parseFloat(values.sheetversion), parseFloat(values.currentsheetversion), parseInt(values.skillcalc,10), parseInt(values.languagesmoved,10))     });   }); }); Sheetversion, currentsheetversion, and languagesmoved are all hidden fields; skillcalc is a check box which controls whether the sheet calculates the skills or just leaves the fields empty for the user to input the values into. I'm still testing the sheet so I haven't cleaned it all up and published it yet; if you want my html to go with this, I can get that for you.
1493089216
Finderski
Pro
Sheet Author
Compendium Curator
Ummm...that's rather daunting. :-/ Thanks Diana, I think that's exactly what I needed. I'll let you know if I have any questions...just need time to work on the sheet and digest what you've posted. :)