구글시트, 업무 자동화 특별 스터디 (4강) | 실시간 검색 + 구글 드라이브 연동까지!💡
라이브 115 회
2022년11월12일
위캔두 Plus
강의 소개
1. Apps Script 마지막 행 검색 함수
오늘 강의에서는 상황별 마지막 행을 올바르게 검색하는 방법과 코드로 구현하는 방법을 단계별로 알아봅니다.
이후 Apps Sciprt로 시트의 마지막 행을 반환하는 함수를 직접 제작하고 사용하는 방법을 알아봅니다.
2. 실시간 인기 검색어 및 구글드라이브 연동
이후 '시그널' 홈페이지의 실시간 인기검색어 TOP 10 목록을 구글시트에 출력하는 방법을 알아봅니다.
마지막으로 구글시트와 구글 드라이브를 연동하여 실시간 인기검색어 목록을 메모장 파일로 저장하는 방법을 알아봅니다.
라이브 미션
- 사전미션 ① : 네이버 연관검색어 일괄 조회 서식 만들기
/** * ● 도전! 사전미션 풀기 * 네이버 연관검색어를 일괄 검색합니다. **/ function listSearchResult() { // 구글스프레드시트 기본 변수 선언 var app = SpreadsheetApp; var ss = app.getActiveSpreadsheet(); var activeSheet = ss.getActiveSheet(); // 시트에 사용된 마지막 행 찾기 var endRow = activeSheet.getLastRow(); // 두번째 행부터 마지막 행까지 돌아가며 연관검색어 출력합니다. for (var i = 2; i <= endRow; i++) { // Hint ① : activeSheet.getRange().getValue(); // Hint ② : activeSheet.getRange().setValue(getNaverSearch(검색단어)); } // 검색 완료 팝업 알림창 띄우기 // Hint : app.getUi().alert } /** * 네이버 연관검색어 목록을 반환합니다. * * @param value 연관검색어를 검색할 단어입니다. * @customfunction */ function getNaverSearch(value) { var url = "https://ac.search.naver.com/nx/ac?q="+value+"&frm=nv&st=100" var response = UrlFetchApp.fetch(url); var webContent = response.getContentText(); var jsonData = JSON.parse(webContent); var result = jsonData.items; var sResult = result.join(); return sResult; } /** * 나만의 커스텀 메뉴를 등록합니다 * (Apps Script 자동화 2번째 강의 참고해주세요!) **/ function initCustomMenu() { var ui = SpreadsheetApp.getUi(); var menu = ui.createMenu("커스텀메뉴"); var submenu = ui.createMenu("네이버관련"); submenu.addItem("연관검색어일괄조회","listSearchResult"); menu.addSubMenu(submenu); menu.addSeparator(); menu.addItem("실시간인기검색어조회","printRealtimeSearch"); menu.addSeparator(); menu.addItem("드라이브저장","saveToDrive"); menu.addToUi(); } function onOpen() { initCustomMenu(); }
보충 자료
📌 Apps Script 자동화 스터디 (4일차) - 예제 파일 및 코드
/**
* 시그널 홈페이지에서 실시간 인기검색어 Top 10 목록을 반환합니다.
* @customfunction
*/
function getRealtimeSearch() {
// ● 시그널 실시간 인기 검색어 조회 api 링크 : https://api.signal.bz/news/realtime/
/*
Apps Script 웹 데이터 크롤링 마스터 코드 스니펫
var url = "URL주소"
var response = UrlFetchApp.fetch(url);
var webContent = response.getContentText();
var jsonData = JSON.parse(webContent); //JSON일 경우 데이터 변환
*/
/*
아래 코드를 사용해 배열의 각 항목을 새로운 배열로 감쌀 수도 있습니다.
a.forEach((value,index,array) => array[index] = [value]);
*/
}
/**
* 현재 활성화된 시트를 구글드라이브에 엑셀 파일로 저장합니다.
*/
function saveToDrive() {
/* ● 현재 시간을 출력하는 마스터코드 스니펫 */
var currentTime = Utilities.formatDate(new Date, Session.getTimeZone(), "yyMMddHHmmss")
/* 구글 드라이브 변수 선언 및 파일 생성
var folder = DriveApp.getFolderByID 또는 GetFoldersByName
folder.createFile(...)
DriveApp 클래스 전체 목록은 아래 링크를 참고하세요.
https://developers.google.com/apps-script/reference/drive/drive-app */
}
/**
* 실시간 인기검색어 Top10 목록을 시트에 출력합니다.
*/
function printRealtimeSearch() {
/*
구글스프레드시트 기본 변수 선언
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
*/
/* 현재 활성화된 시트 마지막 행 찾기 */
/* 현재 시간을 지정한 날짜 서식으로 반환합니다. (2회차 강의 참고) */
var displayTime = Utilities.formatDate(new Date, Session.getTimeZone(), "y-M-d H:m:s")
/* 실시간 인기 검색어 목록 받아온 후, 현재 시간과 함께 시트에 출력하기*/
}
/**
* 특정 열의 마지막 데이터가 입력된 행 번호를 반환합니다.
*/
function getEndRow() {
/*
구글스프레드시트 기본 변수 선언
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
*/
/* 특정 열에서 마지막으로 비어있는 셀 찾기 */
// Hint ① : activeSheet.getMaxRows() -> 활성화 된 시트의 사용가능한 전체 행 개수 (기본값 : 1,000)
// Hint ② : Range.getNextDataCell(SpreadSheetApp.Direction.방향) -> 현재 셀에서 연속된 범위의 끝으로 이동 (Ctrl+방향키)
// Hint ③ : Range.getRow() -> 현재 셀의 행 번호 반환
}
✅ Apps Script 자동화 스터디 (4일차) - 강의 완성 코드
//
/**
* ● 도전! 사전미션 풀기
* 네이버 연관검색어를 일괄 검색합니다.
**/
function listSearchResult() {
// 구글스프레드시트 기본 변수 선언
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
// 시트에 사용된 마지막 행 찾기
var endRow = getEndRow(1);
// 두번째 행부터 마지막 행까지 돌아가며 연관검색어 출력합니다.
for (var i = 2; i <= endRow; i++) {
// Hint ① : activeSheet.getRange().getValue();
// Hint ② : activeSheet.getRange().setValue(getNaverSearch(검색단어));
var searchValue = activeSheet.getRange(i,1).getValue();
var searchResult = getNaverSearch(searchValue);
activeSheet.getRange(i,2).setValue(searchResult);
}
// 검색 완료 팝업 알림창 띄우기
// Hint : app.getUi().alert
app.getUi().alert("연관검색어 출력을 완료했습니다.");
}
/**
* 네이버 연관검색어 목록을 반환합니다.
*
* @param value 연관검색어를 검색할 단어입니다.
* @customfunction
*/
function getNaverSearch(value) {
var url = "https://ac.search.naver.com/nx/ac?q="+value+"&frm=nv&st=100"
var response = UrlFetchApp.fetch(url);
var webContent = response.getContentText();
var jsonData = JSON.parse(webContent);
var result = jsonData.items;
var sResult = result.join();
return sResult;
}
/**
* 나만의 커스텀 메뉴를 등록합니다
* (Apps Script 자동화 2번째 강의 참고해주세요!)
**/
function initCustomMenu() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu("커스텀메뉴");
var submenu = ui.createMenu("네이버관련");
submenu.addItem("연관검색어일괄조회","listSearchResult");
menu.addSubMenu(submenu);
menu.addSeparator();
menu.addItem("실시간인기검색어조회","printRealtimeSearch");
menu.addSeparator();
menu.addItem("드라이브저장","saveToDrive");
menu.addToUi();
}
function onOpen() {
initCustomMenu();
}
//
/**
* 시그널 홈페이지에서 실시간 인기검색어 Top 10 목록을 반환합니다.
* @customfunction
*/
function getRealtimeSearch() {
// ● 시그널 실시간 인기 검색어 조회 api 링크 : https://api.signal.bz/news/realtime/
/*
Apps Script 웹 데이터 크롤링 마스터 코드 스니펫
var url = "URL주소"
var response = UrlFetchApp.fetch(url);
var webContent = response.getContentText();
var jsonData = JSON.parse(webContent); //JSON일 경우 데이터 변환
*/
var url = "https://api.signal.bz/news/realtime/"
var response = UrlFetchApp.fetch(url);
var webContent = response.getContentText();
var jsonData = JSON.parse(webContent); //JSON일 경우 데이터 변환
var top10 = jsonData.top10;
var result = [];
for (var i = 0; i <= top10.length - 1; i++) { result.push([top10[i].keyword]); //Logger.log(top10[i].keyword); } return result; /* 아래 코드를 사용해 배열의 각 항목을 새로운 배열로 감쌀 수도 있습니다. a.forEach((value,index,array) => array[index] = [value]);
*/
/**
* [{state=s, rank=1.0, keyword=삼남매가 용감하게}, {rank=2.0, state=s, keyword=슈룹}, {keyword=천원짜리 변호사 12회, rank=3.0, state=s}, {state=s, keyword=최성빈, rank=4.0}, {state=s, rank=5.0, keyword=이재윤}, {state=s, keyword=날씨, rank=6.0}, {state=s, rank=7.0, keyword=이재명}, {keyword=권성동 이태원 세월호처럼, rank=8.0, state=s}, {keyword=김은혜, state=+, rank=9.0}, {keyword=리커창 한반도 비핵화, rank=10.0, state=-}]
* */
}
/**
* 현재 활성화된 시트를 구글드라이브에 엑셀 파일로 저장합니다.
*/
function saveToDrive() {
/* ● 현재 시간을 출력하는 마스터코드 스니펫 */
var currentTime = Utilities.formatDate(new Date, Session.getTimeZone(), "yyMMddHHmmss")
//1EjdPaRc9sByc_vJtMaimKcNoRGwtx_ub
var gFolder = DriveApp.getFolderById("1EjdPaRc9sByc_vJtMaimKcNoRGwtx_ub");
var result = getRealtimeSearch();
var strResult = result.join();
gFolder.createFile(currentTime+"실시간인기검색어.txt",strResult);
/* 구글 드라이브 변수 선언 및 파일 생성
var folder = DriveApp.getFolderByID 또는 GetFoldersByName
folder.createFile(...)
DriveApp 클래스 전체 목록은 아래 링크를 참고하세요.
https://developers.google.com/apps-script/reference/drive/drive-app */
}
/**
* 실시간 인기검색어 Top10 목록을 시트에 출력합니다.
*/
function printRealtimeSearch() {
/*
구글스프레드시트 기본 변수 선언
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
*/
/* 현재 활성화된 시트 마지막 행 찾기 */
/* 현재 시간을 지정한 날짜 서식으로 반환합니다. (2회차 강의 참고) */
var displayTime = Utilities.formatDate(new Date, Session.getTimeZone(), "y-M-d H:m:s")
/* 실시간 인기 검색어 목록 받아온 후, 현재 시간과 함께 시트에 출력하기*/
}
/**
* 특정 열의 마지막 데이터가 입력된 행 번호를 반환합니다.
*/
function getEndRow(colNo) {
// endRow = getEndRow(1);
/*
구글스프레드시트 기본 변수 선언
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
*/
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
var maxRow = activeSheet.getMaxRows();
var maxRange = activeSheet.getRange(maxRow,colNo);
var lastRange = maxRange.getNextDataCell(SpreadsheetApp.Direction.UP);
var endRow = lastRange.getRow();
return endRow;
//var lastRow = activeSheet.getLastRow();
//Logger.log("endRow: " + endRow + " , lastRow :" + lastRow);
/* 특정 열에서 마지막으로 비어있는 셀 찾기 */
// Hint ① : activeSheet.getMaxRows() -> 활성화 된 시트의 사용가능한 전체 행 개수 (기본값 : 1,000)
// Hint ② : Range.getNextDataCell(SpreadSheetApp.Direction.방향) -> 현재 셀에서 연속된 범위의 끝으로 이동 (Ctrl+방향키)
// Hint ③ : Range.getRow() -> 현재 셀의 행 번호 반환
}
현재 시간 출력 명령문은 2번째 강의를 참고해보시겠어요?
https://www.oppadu.com/%ec%97%91%ec%85%80-live-113%ea%b0%95/
6분 10초를 확인해보시길 바랍니다. :)
감사합니다.