Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 创建图纸的副本并根据范围命名_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 创建图纸的副本并根据范围命名

Google apps script 创建图纸的副本并根据范围命名,google-apps-script,google-sheets,Google Apps Script,Google Sheets,这里有大量的JS noob,试图修改这个脚本来创建命名工作表的副本(在弄清楚如何添加UI/菜单后,我会将其更改为活动工作表),并循环通过一个范围A2:a,该范围将包含我希望命名工作表的变量 从某种意义上说,这个脚本是有效的,它确实循环并为我创建了重复的工作表。我不明白为什么在第22行显示错误。此外,脚本还复制了“模板表”,这不是需要的行为。有人能告诉我为什么会发生这种事吗?干杯,伙计们 function createEmployeeSheets() { var ss =

这里有大量的JS noob,试图修改这个脚本来创建命名工作表的副本(在弄清楚如何添加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;
}
这是哪一行:

template.copyTo(ss).setName(employeeObjects[i]);
此外,脚本在EmployeeRef工作表上完成A2:2的迭代后,将创建另一个名为“模板副本”的重复工作表。我想做的是复制表的次数与A2:A范围内的名称相同

所以

将只生成三张工作表,但我得到了3+1,其中+1被称为模板工作表的副本


干杯

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

  • 工作表名称的
    错误不能为空。(第32行,文件“代码”
  • 创建模板副本的
  • 我认为你的问题的原因如下

    问题的原因 1.
    工作表名称错误不能为空。(第32行,文件“code”
    此错误是由于单元格的空值
    null

    • 从“A2:A”中检索值时,检索从A2到工作表最后一行的单元格值。当工作表最后一行大于数据范围行时,则超出数据范围。
      • 因此
        employeeObjects
        包含空行
    • 在脚本中,使用
      var sheet=ss.getSheetByName(employeeObjects[i]);
      if(sheet){}
      判断sheet是否存在。
      • employeeObjects[i]
        为空时,即
        [“”]
        工作表
        null
        。在“if”处为
        false
    因此,尝试使用空值修改图纸名称时会发生此类错误

    2.创建模板副本的
    页。
    此错误是由于
    employeeObjects[i]
    ”造成的

    • 基于上述原因,我们发现
      employeeObjects
      包含像
      这样的空值
    • 在这种情况下,当运行
      template.copyTo(ss).setName(employeeObjects[i]);
      时,我认为会出现以下流程。
    • template
      复制到
      ss
      。在这种情况下,
      ss
      是活动的电子表格
    • 通过
      setName(employeeObjects[i])
      修改工作表名称。此时,由于值为空而出现错误。
      • 复制
        template
        时,工作表名称为
        Copy of template
        。由于错误,工作表名称未被修改
    因此,将创建模板副本的

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

    修改 修改点:
    • employeeObjects
      中删除空值
    • 从二维数组中检索值。
      employeeObjects
      是二维数组
    修改脚本: 请修改如下

    发件人: 致:
    • 过滤器(字符串)
      删除空值
    • map(函数(e){returne e[0]})
      将二维数组转换为一维数组。
      • 我用它来使用“for循环”中的原始脚本
    参考资料:

    对不起,让我重新表述一下!有什么不明白的错误吗?您正在从
    employeeObjects[i]
    中提取工作表名称,错误显示工作表名称为空,这意味着
    employeeObjects
    的第i个索引具有未定义或“”值。由于应用程序脚本无法为该模板副本设置名称,因此它保留默认名称。您的代码从不验证它尝试使用的名称。请确保您调试脚本,作为修改为
    var employeeObjects=employeeDataRange.getValues().filter(String).map(函数(e){return e[0]}的一部分
    过滤器(字符串)
    删除空值。
    map(函数(e){return e[0]})
    将二维数组转换为一维数组。这样,您就可以对
    var employeeDataRange=employeeID.getRange(“A2:A”)使用“A2:A”
    。在这种修改情况下,您可以自由添加行,而无需修改脚本。您我的人是个天才,您可以将其作为答案发布吗?绿色勾选!谢谢您的回复。事实上,我已经发布了一个答案。但因为我注意到答案已经出现在注释中,所以我已经将其删除。现在我将其取消删除。您可以吗e确认吗?如果这个答案对你有用,我很高兴。非常有用,希望其他人会发现它的用处。过滤器和映射功能工作得很好,谢谢。@Data新手我很高兴你的问题得到了解决。也谢谢你。
    template.copyTo(ss).setName(employeeObjects[i]);
    
    Mo
    Jon
    Adelle
    
    var employeeObjects = employeeDataRange.getValues();
    
    var employeeObjects = employeeDataRange.getValues().filter(String).map(function(e){return e[0]});