简单自定义WPS JS宏函数(二)

1.分行函数 弹出一个窗口输入分隔符 只能选择连续的区域(按列选,或单个单元格或单元格区域)
将这些数据按分隔符分开,并复制非本列的数据
分行后本列数据被分,其余列数据保持一致

function SplitRows(){
	if(Selection.Columns.Count > 1){
		MsgBox("只能同时分一列数据!");
	}else{
		let x = InputBox("请输入分隔符", "分行");
		if(x == "\\n")x = '\n';
		if(x){
			let anchorPoint = Selection.Address();
			let res = anchorPoint.split(':')[0];
			res = res.split('$')
			let col = res[1];//获取列标
			let row = 0;
			let max = 0;
			if(res.length > 2){
				row = parseInt(res[2]);//获取行号
				max = Selection.Rows.Count + row;//计算最大行号
			}else {
				row = 1;
				max = Selection.Cells(Selection.Rows.Count,1).End(xlUp).Row + 1;
			}
			let offset = 0;//处理时会不断插入行,记录插入的行数
			for(let i = row;i < max + offset;i++){
				let data = Range(col + i).Value2;
				if(data && typeof(data)=='string'){//跳过空白单元格
					res = data.split(x);
					res.filter((item,index,array) => { return item; });
					let length = res.length;//分行后的结果数
					if(length > 1){//只有结果数大于1需要处理
					//console.log(length);
						offset = offset + length - 1;
						for(let j = 1;j < length;j++){
							//console.log(j);
							Rows(i).Copy(undefined);
							Rows(i + 1).Select();
							Selection.Insert(xlShiftUp, undefined);
						}
						for(let j = 0;j < length;j++)Range(col + (i + j)).Value2 = res[j];
						i = i + length - 1;
					}
				}
			}
		}else MsgBox("分隔符不能为空!");
	}
}

2.合并单元格函数
只能选择连续的区域(按列选,或单个单元格或单元格区域)
将连续的区域合并

//Columns(1).Address().split('$')[2]数字转列码       console.log(Columns('A').Column);列码转数字
//console.log(Range("A1").MergeArea.Address());获取被合并到的单元格
//区域内不能存在合并的单元格    可先拆分并填充内容再处理
function MergeAdjacentContent(){
	let anchorPoint = Selection.Address();
	let res = anchorPoint.split(':')[0];
	res = res.split('$')
	let col = Columns(res[1]).Column;//获取列标
	let row = 0;
	let maxRow = 0;
	let maxCol = Selection.Columns.Count + col;
	if(res.length > 2){
		row = parseInt(res[2]);//获取行号
		maxRow = Selection.Rows.Count + row;//计算最大行号
	}else {
		row = 1;
		maxRow = Selection.Cells(Selection.Rows.Count,1).End(xlUp).Row + 1;
	}
	let map = new Map();
	//遍历区域计算分布
	for(let j = col;j < maxCol;j++){
		let colStr = Columns(j).Address().split('$')[2];
		for(let i = row;i < maxRow;i++){
			let data = Range(colStr + i).Value2;
			if(data){//忽略空白单元格
				if(map.has(data)){
					map.set(data, Union(map.get(data), Range(colStr + i)));
				}else map.set(data, Range(colStr + i));
			}else if(Range(colStr + i).MergeCells){//如果是合并的单元格,以左上角的值为准
				let cell = Range(colStr + i).MergeArea.Address().split(':')[0];
				while(cell.indexOf('$')!=-1)cell = cell.replace('$', '');
				data = Range(cell).Value2;
				if(data){//忽略空白单元格
					if(map.has(data)){
						map.set(data, Union(map.get(data), Range(colStr + i)));
					}else map.set(data, Range(colStr + i));
				}else console.log("空单元格");
			}
			else console.log("空单元格");
		}
	}
	//Map遍历
	for(let [key, value] of map){
		value.Select();
		//console.log("取值" + key + "的所属区域为" + Selection.Address());
		let r = Selection.Address().split(',');
		for(let i = 0;i < r.length;i ++){
			if(r[i].indexOf(':') != -1)Range(r[i]).Merge();//存在:说明为区域,进行合并
		}	
	}
}

3.展开IP段函数

//输入IP范围   将其展开为一个个IP   格式 xxx.xxx.xxx.xxx/xx x代表数字0-9
//展开格式    xxx.xxx.xxx.xxx
function ExpandIPRange(x){
	let res = x.Value2.split('/');
	let mask = parseInt(res[1]);//取出掩码
	let IPList = res[0].split('.');
	for(let i = 0;i < 4;i ++)IPList[i] = parseInt(IPList[i]);//将IP转化为数字
	//计算不变点的位置
	let pos = Math.floor(mask / 8);
	let offset = mask % 8;
	let rank = Math.pow(2, 8 - offset);
	IPList[pos] = Math.round(Math.floor(IPList[pos] / rank) * rank);
	//计算统一的前缀
	let prefix = "";
	let tmp = "";
	let result = "";
	if(pos > 0){
		prefix = prefix + IPList[0]
		for(let i = 1;i < pos; i ++)prefix =  prefix + '.' + IPList[i];
	}
	for(let i = 0;i < rank;i ++){
		if(pos > 0)tmp = prefix + '.' + (IPList[pos] + i);
		else tmp = prefix + i;//计算可变点的值,并加入前缀
		if(pos < 3)//只有可变点后面还有才需要计算
			for(let j = pos + 1;j < 4;j ++)
				for(let k = 0;k < 255; k ++){
					tmp =  tmp + '.' + k;
				}
		result = result + tmp + '\n';
	}
	return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡海航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值