- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-07-2017 04:01 PM
I looked through the post and see ways as an admin I could export and re import to a list but is there a way the user him/herself can copy over items from one Task board to another?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-14-2018 10:59 AM
Did something similar for a colleague recently. Use case is there's a standard VTB that should be used as a template (already set up, named "P1 VTB" which is called out in the script). Copies Board, lanes, cards/tasks, checklists.
Hope this helps
UI Action (on Incident)
//copy board named 'P1 VTB'
var clonedBoard = doClone("P1 VTB");
//launch new board
action.setRedirectURL("$vtb.do?sysparm_board=" + clonedBoard.sys_id);
function doClone(boardName){
//find board and insert copy
var vtb = new GlideRecord('vtb_board');
vtb.addEncodedQuery('name=' + boardName);
vtb.query();
if(vtb.next()){
var origId = vtb.sys_id.toString();
var newBoard = vtb;
//append incident number to board name
newBoard.name = boardName + ' [' + current.number + ']';
//activate board
newBoard.active = true;
var newBoardId = vtb.insert();
//find all lanes associated with original board and insert copies that point to new board
var gr = new GlideRecord('vtb_lane');
gr.addEncodedQuery('board=' + origId);
gr.query();
while(gr.next()){
var newLane = gr;
newLane.board = newBoardId;
var newLaneId = gr.insert();
}
//copy the cards
var cards = new GlideRecord('vtb_card');
cards.addEncodedQuery('board=' + origId);
cards.query();
while(cards.next()){
//var taskId = generateNewPrivateTask(cards.task.short_description);
var taskId = generateNewPrivateTask(cards.task.getRefRecord());
var laneId = findLane(cards.lane.getDisplayValue(),newBoardId);
var newCards = cards;
newCards.board = newBoardId;
newCards.task = taskId;
newCards.lane = laneId;
var newCardId = cards.insert();
}
//copy members
var mems = new GlideRecord('vtb_board_member');
mems.addEncodedQuery('board=' + origId);
mems.query();
while(mems.next()){
var newMems = mems;
newMems.board = newBoardId;
var nowMemsId = mems.insert();
}
return newBoard;
}
return current;
}
function findLane(card,newBoard){
var gr = new GlideRecord('vtb_lane');
gr.addEncodedQuery('board=' + newBoard + '^name=' + card);
gr.query();
if(gr.next()){
return gr.sys_id;
}
}
function generateNewPrivateTask(sdObj){
var gr = new GlideRecord('vtb_task');
gr.initialize();
//gr.short_description = sd;
gr.short_description = sdObj.short_description;
gr.description = sdObj.description;
gr.assigned_to = sdObj.assigned_to;
var taskId = gr.insert();
createCheckLists(sdObj,gr);
return taskId;
}
function createCheckLists(sdObj,grObj){
var gr = new GlideRecord('checklist');
gr.addEncodedQuery('document=' + sdObj.sys_id);
gr.query();
if(gr.next()){
var origChecklistId = gr.sys_id.toString();
var newGr = gr;
newGr.document = grObj.sys_id;
newGr.owner = gs.getUserID();
var newGrId = gr.insert();
associateItemsToChecklist(origChecklistId,newGrId);
}
return;
}
function associateItemsToChecklist(origChkList,newCheckList){
var gr = new GlideRecord('checklist_item');
gr.addEncodedQuery('checklist=' + origChkList);
gr.query();
while(gr.next()){
var newChk = gr;
newChk.complete = false;
newChk.checklist = newCheckList;
newChk.completed = '';
newChk.completed_by = '';
newChk.insert();
}
return;
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-14-2018 10:59 AM
Did something similar for a colleague recently. Use case is there's a standard VTB that should be used as a template (already set up, named "P1 VTB" which is called out in the script). Copies Board, lanes, cards/tasks, checklists.
Hope this helps
UI Action (on Incident)
//copy board named 'P1 VTB'
var clonedBoard = doClone("P1 VTB");
//launch new board
action.setRedirectURL("$vtb.do?sysparm_board=" + clonedBoard.sys_id);
function doClone(boardName){
//find board and insert copy
var vtb = new GlideRecord('vtb_board');
vtb.addEncodedQuery('name=' + boardName);
vtb.query();
if(vtb.next()){
var origId = vtb.sys_id.toString();
var newBoard = vtb;
//append incident number to board name
newBoard.name = boardName + ' [' + current.number + ']';
//activate board
newBoard.active = true;
var newBoardId = vtb.insert();
//find all lanes associated with original board and insert copies that point to new board
var gr = new GlideRecord('vtb_lane');
gr.addEncodedQuery('board=' + origId);
gr.query();
while(gr.next()){
var newLane = gr;
newLane.board = newBoardId;
var newLaneId = gr.insert();
}
//copy the cards
var cards = new GlideRecord('vtb_card');
cards.addEncodedQuery('board=' + origId);
cards.query();
while(cards.next()){
//var taskId = generateNewPrivateTask(cards.task.short_description);
var taskId = generateNewPrivateTask(cards.task.getRefRecord());
var laneId = findLane(cards.lane.getDisplayValue(),newBoardId);
var newCards = cards;
newCards.board = newBoardId;
newCards.task = taskId;
newCards.lane = laneId;
var newCardId = cards.insert();
}
//copy members
var mems = new GlideRecord('vtb_board_member');
mems.addEncodedQuery('board=' + origId);
mems.query();
while(mems.next()){
var newMems = mems;
newMems.board = newBoardId;
var nowMemsId = mems.insert();
}
return newBoard;
}
return current;
}
function findLane(card,newBoard){
var gr = new GlideRecord('vtb_lane');
gr.addEncodedQuery('board=' + newBoard + '^name=' + card);
gr.query();
if(gr.next()){
return gr.sys_id;
}
}
function generateNewPrivateTask(sdObj){
var gr = new GlideRecord('vtb_task');
gr.initialize();
//gr.short_description = sd;
gr.short_description = sdObj.short_description;
gr.description = sdObj.description;
gr.assigned_to = sdObj.assigned_to;
var taskId = gr.insert();
createCheckLists(sdObj,gr);
return taskId;
}
function createCheckLists(sdObj,grObj){
var gr = new GlideRecord('checklist');
gr.addEncodedQuery('document=' + sdObj.sys_id);
gr.query();
if(gr.next()){
var origChecklistId = gr.sys_id.toString();
var newGr = gr;
newGr.document = grObj.sys_id;
newGr.owner = gs.getUserID();
var newGrId = gr.insert();
associateItemsToChecklist(origChecklistId,newGrId);
}
return;
}
function associateItemsToChecklist(origChkList,newCheckList){
var gr = new GlideRecord('checklist_item');
gr.addEncodedQuery('checklist=' + origChkList);
gr.query();
while(gr.next()){
var newChk = gr;
newChk.complete = false;
newChk.checklist = newCheckList;
newChk.completed = '';
newChk.completed_by = '';
newChk.insert();
}
return;
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-15-2018 08:44 AM
Hello benn23,
Thank you for that. Wow that's an awesome code. I actually found a work around. I am not very good at scripting so the work around is you have to pull the VTB as a list and then from the list view create the vtb.
VTB -> Info button -> View list
Once you have the list then right click on a field and Show visual task board.
This method has some short falls. It will not copy the lanes so all cards are put in one column. And it also pulls back any archived tasks which could be a good thing.