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.