【问题标题】:Google script duplicate and rename sheets based on list谷歌脚本根据列表复制和重命名工作表
【发布时间】:2017-06-24 14:07:04
【问题描述】:

我有一个包含三列员工信息的表。第一列有员工姓名。我想编写一个谷歌应用程序脚本,它将复制一个预先格式化的模板表并用员工姓名重命名。在脚本的最后,每个员工都有自己的以他们命名的工作表。

这是我到目前为止的代码,我正在使用 Google 脚本教程中的一些函数,但我不知道如何进一步进行。已编辑,我已经走得更远了,这段代码曾经工作过,但现在挂在 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);


 }

}   

【问题讨论】:

  • 它抛出了什么错误?是“已经存在带有某个名称的工作表”吗?

标签: google-apps-script google-sheets


【解决方案1】:

访问此问答后,我想出了一个更简单的方法:

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

【讨论】:

    【解决方案2】:

    您可以使用copyTo() 函数做的更简单。 还要确保您拥有唯一的 EmployeeNames。

    所以你的代码看起来像:

    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
    
        }
      }
    }
    

    【讨论】:

    • 此代码用于创建两个员工表然后返回错误:
    • 对于行:template.copyto(ss).setName(EmployeeName); '你已经有一张同名的工作表'。似乎很奇怪,它会很好地创建两张然后停止工作,我尝试重新排列员工列表,但它是一样的
    • 我注意到我为我的 for 循环提供了与您相同的变量名称。尝试将 var i = 0 更改为另一个变量名称,例如 j,看看这是否适合您。
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多