0
votes

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);


 }

}   
2
what error is it throwing? Is it "a sheet with somename is already present"?Konstant

2 Answers

3
votes

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;
}
1
votes

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

    }
  }
}