기타등등/뭔가만들어보기

💚엑셀 데이터 중 서비스별 매출 합계 구하기

킹king 2020. 10. 27. 19:02
반응형

매월 매출을 엑셀로 뽑아서 서비스별로 총매출을 기록해야 함.

 

근데 이상하게 엑셀에서 파일을 열면 특정 열은 데이터가 밀려있어서, 일일히 수동으로 옮겨줘야함.

 

첫달에는 그냥 해봄.. 15분 걸림.. 열받아서 코드짬.

 

function sum() {
    var v = document.getElementsByTagName('input')[0].value;
    var _v = v.split(' ');

    var sort = [];
    var price = [];
    for (i = 0; i < _v.length; i++) {
        var start = _v[i].indexOf('member'); // m시작점
        var rg = _v[i][(start + 6)]; // 의문의 빈칸

        for (k = 0; k < _v[i].length; k++) { // 의문의 빈칸과 동일하면 전부 ,로 변경
            if (_v[i][k] === rg) {
                var rg2 = _v[i][k];
                _v[i] = _v[i].replace(rg2, ',');
            };
        };

        _v[i] = _v[i].replace(rg, ','); // 의문의 빈칸을 ,로 변경
        _v[i] = _v[i].split(',');

        if (_v[i][(_v[i].length - 1)] === '') { // 마지막 값이 비어있으면 앞에꺼 땡겨오기
            _v[i][(_v[i].length - 1)] = _v[i][(_v[i].length - 2)];
        };

        sort[i] = _v[i][0]; // 서비스 분류별로 나누기
        price[i] = _v[i][(_v[i].length - 1)]; // 가격 별로 나누기
        price[i] = Number(price[i]);
    };

    var pSum = 0;
    var sSum = 0;

    for (i = 0; i < sort.length; i++) {
        if (sort[i].indexOf('p') != -1) {
            pSum += price[i];
        } else if (sort[i].indexOf('s') != -1) {
            sSum += price[i];
        };
    };

    document.getElementsByClassName('aa')[0].innerText = pSum;
    document.getElementsByClassName('aa')[1].innerText = sSum;
}

[원하는 것]

1) 엑셀 데이터를 붙여넣어 배열에 값 저장

2) 밀려난 데이터 줄 맞춰주기

3) 서비스 종류에 따라 합계 뽑기

참고로 엑셀 붙여넣을 데이터는 이런식으로 되어있음!

[현실]

1) 쉬울줄 알았는데 엑셀의 '빈칸' 이게 그냥 스페이스바 공백도 아니고, 탭 공백도 아니고 하여튼 난감했음. 그래서 엑셀에서 데이터를 붙여넣기 전에 미리 빈칸행은 삭제하고 복사할까? 싶었는데, 이러면 번거로우니까 애초에 만들기로 한 동기에 어울리지 않는 것 같고... 그렇게 고민고민하다가 그 빈칸 자체를 잡아서 값 일치여부를 따져봤는데 이게 된다?!

 

[알게된 것]

- [ ] : 많이 써봄, 인덱스 안에 연산도 가능 [ (start + 6) ]

 

 

===

 

2020.10.27
2시간
오늘부터는 이론공부하려고했는데 어쩌다보니 갑자기 만들어야할게 생겨서 손을 대버림.
엑셀에서 특정 칸 데이터를 붙여넣으면 종류에따라 가격 합계를 구해주는거임.
별거 아니라 생각햇는데 엑셀에서 붙여넣으면 이상한 공백이 생기는데 별짓을 다 해도 공백이 안사라짐.. 보통 공백이 아님.. 애초에 공백이 아니고 칸같음.. 그래서 “저 빈칸을 선택”하는게 필요해짐 그나마 공통점은 member라는 단어 뒤에 저 칸이 생긴다는것임 근데 indexOf로 단어를 찾으면 한줄에 여러 단어가 있더라도 첫번째 단어의 인덱스 위치만 알려줌 띠로리 구글 뒤져봐도 안나옴 오키에서보니 반복문을 돌리라는데 일단 밥먹고옴 근데 밥먹다가 딱 생각남! 반복문하니까 그러면 첫번째 인덱스값을 변수로 저장해서 또 반복문으로 i를 첫번째 인덱스값부터 시작하게하고 두번째 인덱스값을 찾으면 또... 이짓을 하려다가 생각해보니 저게 겁나 많은데 미쳣나라는 생각이 들어서 또 포기.. 그래서 아니 그래서 여러개의 indexOf 찾기 자체를 포기해야할 시간이 온것같음 다행히 뒤에 숫자 다음에는 단순 빈칸이 오길래 일단 빈칸 기준으로 배열로 쪼개버림.
이제 배열에는 [apple.member 900] 이렇게 생긴 조합만 있음 앞에 apple이 서비스 종류별로 달라서 인덱스값이 바뀔수잇으니 indexOf로 member의 인덱스값을 찾아주고 그거에 6칸 뒤가 의문의 빈칸이니까 이걸 또 변수로 놓고 replace로 바꿔줌!! 이 과정에서 array[0][30]이게 가능하다는걸 알게되엇움 글고 replace에 바뀔값을 쓸때 array[0][(변수+6)] 이렇게하니까 안먹혀서 따로 변수에 저장해서 넣어야한다는것도... 그리고 이 변수들을 join()해주니까 ,로 잘 이어짐 와씨 여기까지하니까 두시간째라 일단 저장하고 껏는데 천재같고...대견하고.....
+값 옆으로 밀린경우를 join전에 먼저 잡아줘야할듯
+엑셀에서 열 안없애고 날것으 그대로 복붗도 테스트
+그러고보니 굳이 join할필요가... 그대로 sum가자

2020.10.28
1시간30분
제일 중요한 밀린값을 처리하는걸 해봄 다행히 이부분은 금방 끝남 규칙만 찾으면 만드는건 수월한듯 뭐때문에 시간이 걸렸더라 아 다 만들었고 제대로 작동하는데 자꾸 is defined오류가 떠서 뭔가싶었는데 버튼 만들어서 눌럿을때 작동하도록 함수안에 넣어주니까 오류가 사라짐 이것때문에 그런가봄 이제 이뿌게 css만 해주면되니까 거ㅓㅓㅓ의 끝 요새 드는 고민은 일단 어떻게든 해결은 하는데 이게 효율적으로 잘 짠 코드인지 검증받을 길이 없다는거...🤔흠