创建工作表副本并根据范围命名

时间:2018-08-13 20:48:55

标签: google-apps-script google-sheets

大量JS新手在这里,尝试修改此脚本以创建命名工作表的重复项(在弄清楚如何添加UI /菜单后,我将其更改为活动工作表)并遍历范围A2:A包含我想要命名工作表的变量。

此脚本 sort 可以正常工作,从某种意义上说,它确实循环并为我创建了重复的工作表。我不知道为什么在第22行显示错误。此外,脚本还复制了“模板工作表”,这不是想要的行为。有人能教我为什么会这样吗?干杯们。

   function createEmployeeSheets() {
  var ss        = SpreadsheetApp.getActiveSpreadsheet();
  var employeeID = ss.getSheetByName("EmployeeRef")

   // Get the range of cells that store employee data.
  var employeeDataRange = employeeID.getRange("A2:A")

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

编辑清晰度:

抱歉,我收到的错误消息是:

The sheet name cannot be empty. (line 32, file "Code"

这是这行:

template.copyTo(ss).setName(employeeObjects[i]);

此外,脚本在EmployeeRef工作表上的A2:2上完成了迭代之后,它还会创建另一个重复的工作表,称为“模板复制”。我想要的是将工作表重复多少次,就像A2:A范围内的名字一样。

所以

Mo
Jon
Adelle

只会生成三张纸,但是我得到3 + 1,其中+1被称为模板纸的副本。

干杯!

1 个答案:

答案 0 :(得分:1)

这个答案怎么样?我对您的问题了解如下。

  1. 错误The sheet name cannot be empty. (line 32, file "Code"
  2. 已创建Copy of Template表。

我认为您遇到问题的原因如下。

问题的原因

1。 The sheet name cannot be empty. (line 32, file "Code"

错误

此错误是由于单元格的空值中的null造成的。

  • 从“ A2:A”中检索值时,将检索从A2到图纸最后一行的单元格值。当工作表的最后一行大于数据范围行时,它超出了数据范围。
    • 因此employeeObjects包含空行。
  • 在脚本中,使用var sheet = ss.getSheetByName(employeeObjects[i]);if (sheet) {}判断工作表的存在。
    • employeeObjects[i]为空时,即[""]sheetnullfalse位于“ if”。

结果,通过尝试使用空值修改工作表名称,会发生此类错误。

2。 Copy of Template表已创建。

此错误是由于employeeObjects[i]""

  • 基于上述原因,发现employeeObjects包含""之类的空值。
  • 在这种情况下,运行template.copyTo(ss).setName(employeeObjects[i]);时,我认为会发生以下流程。
    1. template复制到ss。在这种情况下,ss是活动的电子表格。
    2. 通过setName(employeeObjects[i])修改工作表名称。那时,由于空值而发生错误。
      • 复制template后,工作表名称为Copy of Template。由于错误,工作表名称未修改。

结果,创建了Copy of Template表。

我认为为了避免错误,有几种方法。因此,请将此修改视为其中之一。

修改

修改点:

  • employeeObjects中删除空值。
  • 从二维数组中检索值。 employeeObjects是二维数组。

修改后的脚本:

请进行如下修改。

来自:
var employeeObjects = employeeDataRange.getValues();
至 :
var employeeObjects = employeeDataRange.getValues().filter(String).map(function(e){return e[0]});
  • filter(String)删除空值。
  • map(function(e){return e[0]})将2维数组转换为1维数组。
    • 我将其用于在“ for循环”中使用原始脚本。

参考文献: