分享

WPS JS宏 巧用indexOf()方法实现智能填充出生日期,性别,年龄等信息

 优美的代码 2023-04-14 发布于广东
  小编一直在思考一个问题, 我们的JS宏代码只能一表用,使用十麻烦,当一个工作薄的代码要完成一个工作薄的工作任务,无法像office 脚本那样,写一个脚本代码可以十分方便多表使用。于是,想了一个办法,试着写了一段代码,复制过来就可以使用,智能识别字段,填充到指定列中去。以下一段身份证信息提取的代码。代码中分别使用了,replace()方法去除身份证前后的空字符串,因为从网页下载下来的身份证码是带有空字符的,这是小编长期工作中获得经验。所以在对身份证信息提取,判断身份证是否正确,事先对空字符串进行了处理。

代码解释:

1、toString()方法,将数字转为文本字符。

2、test() 方法用于检测一个字符串是否匹配某个模式。

3、substr() 方法可在字符串中抽取从 开始 下标开始的指定数目的字符。。

4、split() 方法用于把一个字符串分割成字符串数组。

5、substring(beginIndex,endIndex ) 方法返回字符串的子字符串。

beginIndex -- 起始索引(包括), 索引从 0 开始。

endIndex -- 结束索引(不包括)。

6、testid(id)是一个带参函数,以便调用。

//身份证校验及信息获取函数
function testid(id) {
	//校验身份证号码长度
	if(id==undefined){
		juDge=false;
		reText="所检验值为空"
		return;
	}else{
		id=id.toString()
		id=id.replace(/(^\s*)|(\s*$)/g,"")  //去除空格
	}
	if (!(id.length==18)){
		juDge=false;
		reText="长度不合法"
		return;
	}
   // 1 "验证通过!", 0 //校验不通过 // id为身份证号码
    var format = /^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/;
    //号码规则校验
    if(!format.test(id)){
    	juDge=false;
     reText="不合法";
     return;
    }
    //区位码校验
    //出生年月日校验  前正则限制起始年份为1900;
      year = id.substr(6,4),//身份证年
      month = id.substr(10,2),//身份证月
      date = id.substr(12,2),//身份证日
      time = Date.parse(month+'-'+date+'-'+year),//身份证日期时间戳date
      now_time = Date.parse(new Date()),//当前时间戳
      dates = (new Date(year,month,0)).getDate();//身份证当月天数
    if(time>now_time||date>dates){
    	juDge=false;
     
      	 reText="不合法"
      	  return;
    }
    //获取性别
    sex=id.substr(16,1)%2
    //获取区划代码
    qhNumber=id.substr(0,6)
    //校验码判断
    var c = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);  //系数
    var b = new Array('1','0','X','9','8','7','6','5','4','3','2'); //校验码对照表
    var id_array = id.split("");
    var sum = 0;
    for(var k=0;k<17;k++){
      sum+=parseInt(id_array[k])*parseInt(c[k]);
    }
    if(id_array[17].toUpperCase() != b[sum%11].toUpperCase()){
    	juDge=false;
    	 reText="不合法"
    	 
    	 return;
    }else{
    	juDge=true;
    	reText="合法"
    	return;
    }
        
		
} 
//年龄计算
function age(id,todayDate){
	id=id.toString()
	id=id.replace(/(^\s*)|(\s*$)/g,"")  //去除空格
	year = id.substr(6,4),//身份证年
    month = id.substr(10,2),//身份证月
    date = id.substr(12,2),//身份证日
	//获取当前年月日并计算年龄
	toYear =todayDate.substring(0,4);
	toMonth=todayDate.substring(4,6);
	toDate =todayDate.substring(6,8);
	Age =toYear - year;
	if(toMonth <month|| (toMonth == month && toDate <date)){
			Age--
		}
}

这段代码正式调用了以上自定义函数。

代码解释:

1、indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果没有找到匹配的字符串则返回 -1。 indexOf() 方法区分大小写。使用这种方法自动判断身份证号码所在的列,要填充的出生日期,性别,年龄或区域代码等字段所在的列。

2、reText=="合法"?id.Interior.ColorIndex=xlColorIndexNone:id.Interior.ColorIndex=7是一个三元表达式,如何身份证号码合法则单元格背影为白色,否则为粉红色。

3、Offset(Row,Column)方法为单元格偏移,参数Row为偏移的行数,Colunn为偏移的列数。

//信息填充
function 身份证身份证填充表格(){
	Sheets("数据表").Activate();
	rngArr=Range('a1',Range('zz1').End(xlToLeft))
	todayDate=InputBox("请输入年龄计算结束日期:格式如“20220831”")
	var dateColumn=0
	var sexColumn=0
	var ageColumn=0
	var IDColumn=0
	for(var IDstr of rngArr){
		//Range().Columns
		if(IDstr.Value2.indexOf("出生日期")>-1 || IDstr.Value2.indexOf("出生年月")>-1){
			var dateColumn=IDstr.Column	
		}
		if(IDstr.Value2.indexOf("性别")>-1){
			var sexColumn=IDstr.Column	
		}
		if(IDstr.Value2.indexOf("年龄")>-1){
			var ageColumn=IDstr.Column	
		}
		if(IDstr.Value2.indexOf("身份证")>-1 && IDstr.Value2.indexOf("类型")<0){
			var IDColumn=IDstr.Column
		}		
	}
	IdArr=Range(Cells(2,IDColumn),Cells(9999,IDColumn).End(xlUp))
	Console.log(IdArr.length)
	for(var id of IdArr){
		if(id.Row>1){
	        testid(id.Value2)
	        reText=="合法"?id.Interior.ColorIndex=xlColorIndexNone:id.Interior.ColorIndex=7
	        IDstr.Value2.indexOf("身份证")>-1 && IDstr.Value2.indexOf("类型")<0
	        if(dateColumn!=0){
	        	reText=="合法"?id.Offset(0,dateColumn-IDColumn).Value2=year+month+date:""
	        }
	        if(sexColumn!=0){
	        	reText=="合法"?id.Offset(0,sexColumn-IDColumn).Value2=sex:""
	        }
	        if(ageColumn!=0){
	        	 age(id,todayDate)
	        	 reText=="合法"?id.Offset(0,ageColumn-IDColumn).Value2=Age:""
	        } 
		}
	}
}

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多