【WPS应用案例】JS宏批量合并工作表
创作者俱乐部成员
题目:
在一个工作簿中有多张工作表,每个工作表的列数相同,格式相同,但行数不同。要求将工作表合并在一起,并且只保留第一张工作表的标题,其它工作表只要数据部分,同时在合并后的数据前面插入一列工作表名称,以便能追溯数据来源于哪张工作表。
原数据如下:
合并后的数据如下:
下面,就让我们用JS宏来实现一键合并功能。
第一步:在“开发工具”选项卡中点击“WPS宏编辑器”。
第二步:在WPS宏编辑器中点击插入菜单,插入一个模块,并输入以下代码。
// 定义一个名为"合并工作表"的函数。
function 合并工作表(){
// 创建一个空数组,用于存储从各个工作表中获取的数据。
let data=[]
// 获取名为"合并"的工作表。
let tsh=Sheets.Item('合并')
// 初始化一个变量i为1。这个变量用于判断合并到第几张工作表了,以便确定是否删除标题行
i=1
// 对所有的工作表进行遍历。
for(sh of Sheets){
// 如果当前工作表的名字不是"合并"工作表的名字...
if(sh.Name!=tsh.Name){
// 获取当前工作表的一个区域(从A1开始并且包括其周围的连续区域),并将其值存储到ar变量中。
ar=sh.Range('a1').CurrentRegion.Value2
// 如果i大于1,则从数组ar中删除1行,因为本例中只有一行标题,所以是splice(0,1),如果有n行标题,那就是splice(0,n)
if(i>1) ar.splice(0,1)
// 在数组ar的前面新增一列,存放每个工作表的工作名称,并将数据写入新数组br。
br=ar.map((col)=>[sh.Name,...col])
// 将br数组中的所有元素添加到data数组中,每循环一次,就写入一次,即实现了数据合并。
data=data.concat(br)
// 增加i的值,表示我们已经处理完一个工作表。
i++
}
}
// 将data数组的第一行的第一个元素(即索引为0的元素)设置为'工作表名称'。
data[0][0='工作表名称']
// 将"合并"工作表的A1单元格及其周围区域的大小调整为data数组的长度和第一行的元素数量,并将data数组的值赋给这个区域。
tsh.Range('a1').Resize(data.length,data[0].length).Value2=data
}
请看运行效果: