首页 > 解决方案 > 创建工作表的副本并根据范围命名它们

问题描述

这里有大量的 JS 菜鸟,试图调整这个脚本来创建命名工作表的副本(我会在弄清楚如何添加 UI/菜单后将其更改为活动工作表)并循环遍历 A2:A 范围,该范围将保存变量我想要为这些床单命名。

这个脚本有点工作,从某种意义上说它确实循环并为我创建了重复的工作表。我不知道为什么在第 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 上完成迭代后,它会创建另一个名为 Copy of Template 的重复表。我想要的是复制工作表的次数与 A2:A 范围内的名称一样多。

所以,

Mo
Jon
Adelle

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

干杯!

标签: google-apps-scriptgoogle-sheets

解决方案


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

  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]是空的,即它是[""]sheetnull。它false在“如果”。

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

2.Copy of Template创建工作表。

这个错误是由于那employeeObjects[i]""

  • 从上面的原因,发现employeeObjects包括空值如""
  • 在这种情况下,当template.copyTo(ss).setName(employeeObjects[i]);运行时,我认为会发生以下流程。
    1. 复制templatess. 在这种情况下,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]})将二维数组转换为一维数组。
    • 我用它在“for循环”中使用原始脚本。

参考 :


推荐阅读