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.