Google apps script 创建图纸的副本并根据范围命名
这里有大量的JS noob,试图修改这个脚本来创建命名工作表的副本(在弄清楚如何添加UI/菜单后,我会将其更改为活动工作表),并循环通过一个范围A2:a,该范围将包含我希望命名工作表的变量 从某种意义上说,这个脚本是有效的,它确实循环并为我创建了重复的工作表。我不明白为什么在第22行显示错误。此外,脚本还复制了“模板表”,这不是需要的行为。有人能告诉我为什么会发生这种事吗?干杯,伙计们Google apps script 创建图纸的副本并根据范围命名,google-apps-script,google-sheets,Google Apps Script,Google Sheets,这里有大量的JS noob,试图修改这个脚本来创建命名工作表的副本(在弄清楚如何添加UI/菜单后,我会将其更改为活动工作表),并循环通过一个范围A2:a,该范围将包含我希望命名工作表的变量 从某种意义上说,这个脚本是有效的,它确实循环并为我创建了重复的工作表。我不明白为什么在第22行显示错误。此外,脚本还复制了“模板表”,这不是需要的行为。有人能告诉我为什么会发生这种事吗?干杯,伙计们 function createEmployeeSheets() { var ss =
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行,文件“代码”
页
工作表名称错误不能为空。(第32行,文件“code”
此错误是由于单元格的空值null
- 从“A2:A”中检索值时,检索从A2到工作表最后一行的单元格值。当工作表最后一行大于数据范围行时,则超出数据范围。
- 因此
包含空行employeeObjects
- 因此
- 在脚本中,使用
和var sheet=ss.getSheetByName(employeeObjects[i]);
判断sheet是否存在。if(sheet){}
- 当
为空时,即employeeObjects[i]
,[“”]
为工作表
。在“if”处为null
false
- 当
页。
此错误是由于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]});