【JSA进阶案例分享之客户跟进记录汇总】-数组与集合实操演示

EnterZero
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集合中添加键值对,键为一个字符串,值可以是一个字符串也可以是一个数组,值可以默认为空。

本期中有不懂的方法可以评论区回复,我会解答,祝大家学习愉快,哈哈!下期再见!

四川省
浏览 94
1
3
分享
3 +1
3
1 +1
全部评论 3
 
WPS 冲浪队长
WPS 冲浪队长

社区管理员

老师您好 创作者申请已通过,还请添加管理员企微进群~
· 广东省
回复
EnterZero
EnterZero

创作者俱乐部成员

好的 谢谢
· 四川省
回复
 
EnterZero
EnterZero

创作者俱乐部成员

· 四川省
回复