【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

}

  • 请看运行效果:

贵州省
浏览 8215
5
38
分享
38 +1
28
5 +1
全部评论 28
 
小可耐
· 湖北省
回复
 
狂飙的蜗牛
学习学习!!!
· 广西
回复
 
正金
这个位置需要更改下,数组赋值定义不对的呀
· 广东省
回复
 
小妤
向大佬学习
· 广东省
回复
 
上官邪星
wps2019 for linux中(国产麒麟系统),使用…=data数组的方法,得到的是空白,只能一条一条来(…=data[x])。 还有一个问题,使用数组方法复制单元格区域,如a1:b2,data[0]的内容等于a1a2的内容…判大佬能解惑为感。
· 湖南省
回复
 
公子我姓张
合并后如何保持原表格式
· 天津
回复
 
蒸蒸日上
6的
· 四川省
回复
 
谢宝宝
为何提示map没定义
· 广西
回复
 
一夜鱼龙舞
data[0][0='工作表名称'] 编译错误 data[0][0=='工作表名称']
· 安徽省
回复
一夜鱼龙舞
这种合并只有数据没有格式,合并区域与首张工作表范围一致,更多时候是需要按照单元格格式全部合并
· 安徽省
回复
 
不想说的
有没有素材啊,代码不对
· 江苏省
回复
 
WPS_1699164669
看了教程,受益匪浅。
· 广西
回复
 
C
学习了,进步特别大,对工作帮助很大
· 安徽省
回复
 
......
学了真的受益匪浅,一点点进步,跟着大佬进步
· 河南省
回复
 
白泽
看了这个教程,对我受益匪浅,真的特别好用,解决了我工作上的一大难题
· 广东省
回复
 
念珠
你好 插入模块后 函数公式不会继续了 可以教教吗
· 青海省
回复
 
百迅科技
非常实用,感谢大佬分享,学习了!
· 山西省
回复
 
轻轻一吻
大佬特厉害,特想跟大佬学习
· 江苏省
回复
 
佳
非常实用!跟着大佬学习,飞速提升自己!
· 河南省
回复
 
雅腾照明有限公司李浩18981461271
向优秀的人学习提升自己的能力
· 四川省
回复
 
庸俗
向大佬学习
· 江苏省
回复