구글시트, 업무 자동화 특별 스터디 (3강) | 크롤링 100% 자동화 함수 만들기😎
라이브 114 회
2022년11월05일
위캔두 Plus
강의 소개
1. 데이터 가공 핵심 원리! - 이중 배열 살펴보기
오늘 강의에서는 빠른 데이터 가공을 위해 꼭 알아야 할 이중 배열의 기본 원리를 알아봅니다.
이후 기초 명령문 예제와 함께 이중 배열로 데이터를 불러오고 읽는 방법에 대해 알아봅니다.
2. 구글 Apps Sciprt 반복문(For) 사용법
오늘 강의에서는 Apps Script 반복문(For)의 기본 사용법을 간단한 예제와 함께 학습합니다.
이후 반복문을 활용해 나만의 MyTextJoin 함수를 제작하고 구글 시트에 바로 활용하는 방법을 알아봅니다.
3. 구글시트를 활용한 웹 데이터 크롤링 함수
마지막 주제로 Apps Script로 웹 데이터를 크롤링하기 위한 마스터코드 스니펫과 기본 사용법을 알아봅니다.
이후 웹 크롤링 명령문을 활용해 네이버 연관 검색어를 실시간으로 크롤링하는 구글시트 함수를 제작합니다.
라이브 미션
- 사전미션 ① : 학생 점수를 등급(A-F)로 변환하는 함수
/** * 학생의 성적을 A-F 등급으로 계산합니다. * * @param score 성적을 입력합니다. * @customfunction */ function getGrade(score) { var grade =""; /* if (점수조건) { grade = ...; } else if () { grade = ..; } else () { grade = ..; } */ }
보충 자료
📌 Apps Script 자동화 스터디 (3일차) - 예제 파일 및 코드
/**
* 범위 내 각 단어를 구분자로 병합합니다.
*
* @param delimiter 단어를 병합할 구분자입니다.
* @param data 병합할 단어가 입력된 범위입니다.
* @customfunction
*/
function myTextJoin(delimiter,data) {
var result = "";
/*
for 반복문 기본문법
for (var row = 0; row <= 마지막값; row++) {
var 값 = 배열[row][col];
}
*/
/* 단어의 마지막 글자를 자르는 구분 substring(시작위치,마지막위치)
단어.substring(시작위치,끝위치)
*/
/**
Array의 forEach 문을 사용하는 방법도 있습니다!
① Row를 하나씩 돌아가며 Loop
data.forEach(function(row) {
Logger.log(row[i])
});
② 각 항목을 하나씩 돌아가며 Loop
data.forEach(function(row) {
row.forEach(function(col) {
Logger.log(col);
});
});
★주의! Apps Script V8 스크립트 이후, For Each 문이 For 문으로 변경되었습니다.
for Each 대신, for (var key in obj) 구문으로 사용합니다.
자세한 설명은 아래 링크 참고!
https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_for_eachvariable_in_object
*/
}
/**
* 네이버 연관검색어 목록을 반환합니다.
*
* @param value 연관검색어를 검색할 단어입니다.
* @customfunction
*/
function getNaverSearch(value) {
/*
네이버 연관검색어 조회 URL
https://ac.search.naver.com/nx/ac?q=검색단어&frm=nv&st=100
*/
/*
Javascript 웹 크롤링 기본 문법
var response = UrlFetchApp.fetch(url);
var webContent = response.getContentText();
var jsonData = JSON.parse(webContent);
*/
/**
간혹, 언어 인코딩이 EUC-KR일 경우 한글이 깨지는 문제가 있어요!
그럴 땐, 아래와 같이 설정을 추가하면 됩니다.
var fetchOption = {"content-type": "text/html;charset=EUC-KR"};
var response = UrlFetchApp.fetch(URL, fetchOption);
var webContent = response.getContentText("EUC-KR");
*/
/*
배열의 모든 값을 한 문장으로 합치기
Array.join(구분자);
구분자 생략 시, 쉼표(,)로 연결합니다.
*/
}
✅ Apps Script 자동화 스터디 (3일차) - 강의 완성 코드
/**
* 학생의 성적을 A-F 등급으로 계산합니다.
*
* @param score 성적을 입력합니다.
* @customfunction
*/
function getGrade(score) {
var grade ="";
if (score == 90) {
grade = "A";
} else if (score >= 80) {
grade = "B";
} else if (score >= 70) {
grade = "C";
} else if (score >= 60) {
grade = "D";
} else {
grade= "F";
}
return grade;
/* if (점수조건) {
grade = ...;
} else if () {
grade = ..;
} else () {
grade = ..;
}
*/
}
function arrayTest() {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSheet();
var rng = activeSheet.getRange("A1:B9");
Logger.log(rng.getValues());
}
/** ---- Apps Script ---
* 배열[0] -> [학생명, 점수]
* 배열[0][0] -> 학생명
* 배열[2][1] -> 76.0
*
* [ [학생명, 점수],
* [이은지, 82.0],
* [김하늘, 76.0],
* [박진성, 52.0],
* [최수종, 95.0],
* [김아라, 77.0],
* [정수빈, 62.0],
* [황현성, 81.0],
* [이현우, 92.0] ]
*
*/
/** ---- VBA -----
* 배열(0,0)
* [ 학생명, 점수 ;
* 이은지, 82.0 ;
* 김하늘, 76.0;
* 박진성, 52.0;
* 최수종, 95.0;
* 김아라, 77.0;
* 정수빈, 62.0;
* 황현성, 81.0;
* 이현우, 92.0 ]
*
*/
function runningTotal() {
var result = 0;
for (var i = 1; i <=10; i+=2) {
result += i;
Logger.log(result);
}
/**
* For i = 1 to 10
* i ~~
* Next
*/
}
/**
* 범위 내 각 단어를 구분자로 병합합니다.
*
* @param delimiter 단어를 병합할 구분자입니다.
* @param data 병합할 단어가 입력된 범위입니다.
* @customfunction
*/
function myTextJoin(delimiter,data) {
var result = "";
/**
* <---- data --->
*
* [ [제품명,가격]
* [햄버거, 5000]
* [피자, 8000]
* ....
* [김치찌개,5500] ]
*
*/
for (var i = 0; i <= data.length -1; i++) { var d = data[i]; /** * i = 0 일 때, * d = [제품명, 가격] * * i = 1 * d = [햄버거, 5000] */ //result = result + d[0] + delimiter; //result += d[0] + delimiter; if (d[0].length > 0) {
result += d[0] + delimiter ;
// result = 결과1,결과2,결과3,,,,결과10, <- 쉼표 제거 } } //문장.substring(시작위치, 종료위치) -> 문장 반환
result = result.substring(0,result.length-delimiter.length);
return result;
/*
for 반복문 기본문법
for (var row = 0; row <= 마지막값; row++) {
var 값 = 배열[row][col];
}
*/
/* 단어의 마지막 글자를 자르는 구분 substring(시작위치,마지막위치)
단어.substring(시작위치,끝위치)
*/
/**
Array의 forEach 문을 사용하는 방법도 있습니다!
① Row를 하나씩 돌아가며 Loop
data.forEach(function(row) {
Logger.log(row[i])
});
② 각 항목을 하나씩 돌아가며 Loop
data.forEach(function(row) {
row.forEach(function(col) {
Logger.log(col);
});
});
★주의! Apps Script V8 스크립트 이후, For Each 문이 For 문으로 변경되었습니다.
for Each 대신, for (var key in obj) 구문으로 사용합니다.
자세한 설명은 아래 링크 참고!
https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_for_eachvariable_in_object
*/
}
/**
* 네이버 연관검색어 목록을 반환합니다.
*
* @param value 연관검색어를 검색할 단어입니다.
* @customfunction
*/
function getNaverSearch(value) {
/*
네이버 연관검색어 조회 URL
https://ac.search.naver.com/nx/ac?q=검색단어&frm=nv&st=100
*/
var url = "https://ac.search.naver.com/nx/ac?q="+value+"&frm=nv&st=100"
/*
Javascript 웹 크롤링 기본 문법
var response = UrlFetchApp.fetch(url);
var webContent = response.getContentText();
var jsonData = JSON.parse(webContent);
*/
var response = UrlFetchApp.fetch(url);
var webContent = response.getContentText();
var jsonData = JSON.parse(webContent);
//Logger.log(jsonData);
var result = jsonData.items;
//Logger.log(result);
var sResult = result.join();
//Logger.log(sResult);
return sResult;
/*
{
query=[햄버거],
items=[[[햄버거], [햄버거 칼로리], [햄버거 만들기], [햄버거 데우기], [햄버거 패티], [햄버거 맛집], [햄버거집], [햄버거빵], [햄버거병], [햄버거연구소]]]
}
*/
/**
간혹, 언어 인코딩이 EUC-KR일 경우 한글이 깨지는 문제가 있어요!
그럴 땐, 아래와 같이 설정을 추가하면 됩니다.
var fetchOption = {"content-type": "text/html;charset=EUC-KR"};
var response = UrlFetchApp.fetch(URL, fetchOption);
var webContent = response.getContentText("EUC-KR");
*/
/*
배열의 모든 값을 한 문장으로 합치기
Array.join(구분자);
구분자 생략 시, 쉼표(,)로 연결합니다.
*/
}
댓글 1
로그인 후 댓글을 작성할 수 있습니다.
강민준🤗
2024.08.12 09:55
좋은 강의 정말 감사합니다🙇♂️