【JSA进阶案例分享之客户跟进记录汇总】-数组与集合实操演示
EnterZero
创作者俱乐部成员
今天通过案例给大家分享JS中数组[]与集合{}的结合应用,希望大家看完有所收获。
本篇案例来自某同学的工作实操,每日需要从CRM系统下载对应客户的跟进记录汇总汇报给领导。
如图需要跟进负客户负责人汇总跟进时间、联系电话、跟进记录,再根据级别填入汇总如下图汇报报表:
正常情况下这是一件低效率的重复性工作,现在我们通过JSA能快速处理这类工作代码如下。
代码截图:
PS:代码中有写入函数公式来对原数据进行合并,其实可以在循环集合中用代码一起处理,之所以用函数是给大家提供一种解题思路,有时候代码完成不了可以与函数公式组合使用。
运行效果:
基本上点击即结束,1S不到。
需要复制代码的如下:
function 报表记录汇总(){
Application.Calculation =xlCalculationManual;//关闭自动计算,提升宏运行速度。
var ws=ActiveWorkbook.Sheets("SheetJS"),ws2=ActiveWorkbook.Sheets("汇报报表");//固定对象表格,防止数据错乱。
var row=ws.Range("b1").End(xlDown).Row;//获取最后一行行号。
ws.Range("a:a").Insert(xlShiftToRight);//A列左侧插入一列。
ws.Range(`e2:e${row}`).Value2 = ws.Range(`e2:e${row}`).Value();//清理电话格式,文本转数字。
ws.Range(`a2:a${row}`).Formula = "=\"(跟进时间:\"&M2&\")\"&E2&\" \"&L2";//利用函数公式在A列合并要汇总的数据。
//ws.Range(`d2:d${row}`).Formula =;//忽略这两行,原主有他用。
//ws.Range(`h2:h${row}`).Formula =;//忽略这两行,原主有他用。
Application.Calculation =xlCalculationAutomatic//打开自动计算,确保函数公式计算正确。
Application.Calculation =xlCalculationManual;//关闭自动计算,提升宏运行速度。
//ws.Range(`a2:a${row}`).Value2 = ws.Range(`a2:a${row}`).Value();//清理公式,转为值,避免数据错误,可忽视这以上三步。
//对整理完成的数据,将所需内容封装进集合date中,方便后续调用到汇总报表。
//下面使用的是针对大量循环迭代数据的固定封装套路:对象.reduce((p,v)=>{代码块;return p;},new map());
//这里是对选定的区域每一行内容打包成数组进行迭代,中间通过数组与集合的配合对迭代行进行处理,处理完成后封装进map集合。
var date=ws.UsedRange.Value2.slice(1).reduce((p,v)=>{
var key=v[7]+v[2]+v[3];//设定集合的键,这里以姓名加级别组合为集合的键。
//Console.log(key);
var arr=[];//重置数组arr为空
if (p.has(key)){//判断p集合中是否有这个键,也就是姓名+级别。
var arr=p.get(key);//有这个键,则提取这个键对应的值,值为一个数组。
arr.push(v[0]);//在这个数组中添加A列内容+换行符。
//Console.log(arr.join("\n"));
}else{//如果不存在该键,则执行以下代码。
arr.push(v[0]);//将A列内容+换行符添加进数组arr。
//Console.log(arr.join("\n"));
p.set(key,arr);//对集合P新增键key,新增值arr
}
return p;//返回集合P到MAP对象。
},
new Map());
ws2.Activate();
var row2=ws2.Range("d8").End(xlDown).Row;//获取汇报报表的最后一行行号。
var rngs=ws2.Range(`d8:d${row2}`);//获取负责人单元格区域。
for (var rng of rngs){//使用FOR循环,迭代获取负责人信息。
var rngbb=rng+"B+类"+rng.Offset(0,1).Value(),rngb=rng+"B类"+rng.Offset(0,1).Value();//设定名字+级别+来源的变量。
var rngc=rng+"C类"+rng.Offset(0,1).Value(),rngf=rng+"F类"+rng.Offset(0,1).Value();//设定名字+级别+来源的变量。
switch (true){//通过switch判断设定的变量在date中是否存在对应的键,存在则将对应的值写入对应的报表单元格。
case date.has(rngbb):{
try{rng.Offset(0,5).Value2=date.get(rngbb).join("\n");
}catch(err){};
};
case date.has(rngb):{
try{rng.Offset(0,6).Value2=date.get(rngb).join("\n");
}catch(err){};
};
case date.has(rngc):{
try{rng.Offset(0,7).Value2=date.get(rngc).join("\n");
}catch(err){};
};
case date.has(rngf):{
try{rng.Offset(0,8).Value2=date.get(rngf).join("\n");
}catch(err){};
};
default:{break;}
}
}
Application.Calculation =xlCalculationAutomatic//打开自动计算
}
其中解释一下几个数组和集合的方法,这里分别用到了:
数组的arr.push(),这个方法是像数组内从最后面添加数据;
集合的map.has(),这里has是查找集合中是否有这个键,返回的是布尔值flase与true;
map.get(),这里get是通过键查找值,返回的是一个数组;
map.set(),这里set是往map集合中添加键值对,键为一个字符串,值可以是一个字符串也可以是一个数组,值可以默认为空。
本期中有不懂的方法可以评论区回复,我会解答,祝大家学习愉快,哈哈!下期再见!
社区管理员
创作者俱乐部成员
创作者俱乐部成员