I have a table that has three columns of employee info. The first column has the employe names. I want to write a google apps script that will duplicate a pre-formatted template sheet and re-name it with the employee name. At the end of the script each employee will have their own sheet named after them.
Here is the code I have so far, I am using some functions from the Google scripts tutorial, but I am at a loss on how to proceed further. EDITED, I have gotten a little further, this code worked once but now is getting hung on setName:
//Create new sheets for each employee in the list
function createEmployeeSheets() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
// Get the range of cells that store employee data.
var employeeDataRange = ss.getRangeByName("EmployeeRef");
// For every row of employee data, generate an employee object.
var employeeObjects = getRowsData(sheet, employeeDataRange);
for (i=0; i < employeeObjects.length; i++) {
var EmployeeName = employeeObjects[i].name;
ss.setActiveSheet(ss.getSheetByName("Template"));
SpreadsheetApp.getActiveSpreadsheet().duplicateActiveSheet();
var first = ss.getSheetByName("Copy of Template 1");
first.setName(EmployeeName);
}
}
You can do more simple by using the copyTo()
function.
Also make sure you have unique EmployeeNames.
So your code would look like:
function test() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var employeeObjects = [
{"name": "Peter" },
{"name": "Alice" },
{"name": "Frank" }
]
var template = ss.getSheetByName('Template');
for ( var i=0; i < employeeObjects.length; i++) {
var EmployeeName = employeeObjects[i].name;
// get the sheets to check you are not creating a duplicate sheet
var sheets = ss.getSheets();
var ok = true;
// loop through the sheets and check a duplicate exist
for ( var j=0; j<sheets.length;j++ ) {
if ( sheets[j].getName() == EmployeeName ) {
ok = false;
Logger.log('duplicate');
}
}
if ( ok ) {
template.copyTo(ss).setName(EmployeeName);
} else {
// do whatever you need to do if employee name is duplicate
}
}
}
After visiting this Q&A I figured out a far simpler method:
function createEmployeeSheets() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Get the range of cells that store employee data.
var employeeDataRange = ss.getRangeByName("EmployeeRef");
var employeeObjects = employeeDataRange.getValues();
var template = ss.getSheetByName('Template');
for (var i=0; i < employeeObjects.length; i++) {
// Put the sheet you want to create in a variable
var sheet = ss.getSheetByName(employeeObjects[i]);
// Check if the sheet you want to create already exists. If so,
// log this and loop back. If not, create the new sheet.
if (sheet) {
Logger.log("Sheet " + employeeObjects[i] + "already exists");
} else {
template.copyTo(ss).setName(employeeObjects[i]);
}
}
return;
}