잡담 & 시사이슈 등

구글 스프레드시트 Apps Script 원하는 범위내 문자열 찾아 데이터 뿌리기

IT매니절 2024. 8. 14. 16:00

 

원하는 기능의 엑셀 함수를 찾아 헤맸지만

vlookup의 경우 데이터를 찾고, 하나의 컬럼 데이터만을 뿌려주기에 적합하지 않았다

 

결국 VBA에 손댈 수 밖에 없다는 결론이 생겨 대충 FOR문을 돌렸다

자바스크립트라지만, Apps Script는 완전히 처음이라 헤맸다

검색해서 나온 코드를 그대로 붙여넣어도 원하는 결과가 나오지 않거나, 그 사이 업데이트가 되었는지 없는 함수라고 뜨기 일쑤였다.

 

어찌저찌 되긴 했다

 


const NowSheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
// 0번째 시트 정보를 가지고 온다
// 보통 검색기능을 이용한다면 0번째 시트에서 시작하기 때문.

  let selectedCell="";
  let findSheet=null;
  // 0번째 시트는 검색기능이 들어가므로, 데이터는 1번째 시트부터 시작
  for (let i = 1; i < 9; i++){
    const ISheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[i];
    
    const range= ISheet.getRange("A3:A50");  //데이터영역
    const textFinder = range.createTextFinder(NowSheet.getRange("A3").getValue());  //검색어 넣고
    const findNow = textFinder.matchEntireCell(false).matchCase(false).findAll();

    if(findNow.length > 0) {
      findNow.forEach(rg => {
        selectedSh = rg.getA1Notation().substring(0,1);
        selectedCell = rg.getRowIndex();
        findSheet = ISheet;
        return false;
      })
      break;
    }
  }

findSheet.getRange("B"+selectedCell+":F"+selectedCell).copyTo(NowSheet.getRange(6, 1));
// 복사할 시트.getRange("여기:저기").copyTo(결과를 보여줄 시트.getRange(뿌려줄 행, 뿌려줄 열));

 

 

textFinder를 사용할때 원래는 getCurrentMatch()를 썼었다

 

https://developers.google.com/apps-script/reference/spreadsheet/text-finder?hl=ko#getCurrentMatch()

getCurrentMatch()   Range   검색 기준과 일치하는 현재 셀을 반환합니다.

 

이렇게 적혀 있었으니까... 하지만 아무리 console.log를 찍어봐도 null값이 떴다

결국 findAll()로 forEach를 돌려서 찾기로 하였음

내 경우 데이터 영역이 작아 중복데이터는 없어서 제대로 나오는 것일뿐, 중복데이터가 있다면 손봐야 할 코드이다

 

matchEntireCell(false).matchCase(false)

textfinder에 쓰인 함수들인데 

 

matchEntireCell는 셀의 전체 내용과 일치하는지 유무를,
matchCase는 셀 텍스트의 대소문자가 일치하는지 유무를 설정한다

 

 

 

 

참고한 블로그

https://www.autooffice.co.kr/blog/2023/08/11/copying-data-between-sheets-in-apps-script/

https://www.autooffice.io/knowhow/write-formula-to-selected-cell-or-range

https://smart-worker.tistory.com/39