google-apps-script - 创建工作表的副本并根据范围命名它们
问题描述
这里有大量的 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 被称为模板表的副本。
干杯!
解决方案
这个答案怎么样?我对您的问题的理解如下。
- 的错误
The sheet name cannot be empty. (line 32, file "Code"
。 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]
是空的,即它是[""]
,sheet
是null
。它false
在“如果”。
- 什么时候
结果,通过尝试使用空值修改工作表名称会发生此类错误。
2.Copy of Template
创建工作表。
这个错误是由于那employeeObjects[i]
是""
。
- 从上面的原因,发现
employeeObjects
包括空值如""
。 - 在这种情况下,当
template.copyTo(ss).setName(employeeObjects[i]);
运行时,我认为会发生以下流程。- 复制
template
到ss
. 在这种情况下,ss
是活动的电子表格。 - 修改工作表名称
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循环”中使用原始脚本。
参考 :
推荐阅读
- sas - 如何在SAS中将两列合并为一列
- azure - Azure 视频索引器下载网址
- rust - 当我们向变量添加新所有权时,旧所有权会发生什么?
- android - 如何在 FirebaseRecyclerAdapter 中添加项目 OnClickListener?
- javascript - 图像不跨越多个表列 docxjs
- java - Android Java Caller-Overlay (Info-PopUp)
- javascript - 简单组件不会出现在浏览器上
- python - 即使安装了模块,执行 shell 脚本后也找不到 python 模块
- ios - 通过可编码协议管理动态密钥以响应
- python-3.x - PC 上的 TensorFlow 对象检测 API