녕하세요, 리스틀리입니다.😀

지난 피드백 중 '간단한 데이터베이스 만들기'를 주제로 요청하신 분이 계셨습니다. 그런데 실제 데이터베이스 구축은 MySQL, MS SQL, Oracle 등 전문 프로그램이 필요하며, 데이터를 조회하는 과정에서 SQL 언어 이해가 필요한 어려운 작업이다보니😢 어떤 방식으로 레터를 구성해야 많은 분들이 활용하기 좋을지 고민이 많았어요. 


그래서 오늘은! 데이터를 저장하고 불러오는 아주 기본적인 데이터베이스의 개념에 집중하여, 구글 시트와 앱스크립트를 이용해 누구나 쉽게 데이터를 하나의 시트로 모을 수 있는 방법을 소개하려고 합니다. 또한 파일의 추가, 삭제, 수정이 반영되는 스크립트 예제도 준비해 두었어요!(복/붙해서 사용 가능!)


'앱스크립트'가 낯선 분들도 걱정 마시고 오늘의 단계별 가이드를 따라와주세요.😆

STEP 1. 폴더를 생성하고 빈 시트를 만들어주세요.

구글 드라이브에서 '+ 신규' 버튼을 클릭하여 새 폴더를 생성합니다. 이 폴더는 빈 시트와 이후에 만들 데이터가 담긴 폴더를 함께 담아둘 용도일 뿐이므로, 저는 폴더 이름을 '임시폴더'로 지었습니다.
생성된 폴더 안에 빈 스프레드시트 하나를 생성합니다. 비어있는 시트에 여러 파일을 불러올 예정이에요. 시트의 파일명도 마음에 드는 것으로 설정해주세요. 저는 '데이터 모아보기'로 파일명을 설정해 두었습니다.
그리고 위 이미지와 같이 '임시폴더'안에, 원본 데이터들이 담길 하위 폴더도 생성해줍니다. 저는 하위 폴더 이름을 '누적데이터'라고 지었습니다. 이 폴더 안에 합치고 싶은 파일들을 넣어줄겁니다. 

STEP 2. 하위폴더 안에 데이터를 담아주세요.

폴더 안에 리스틀리로 스크랩한 그룹 추출 결과물을 넣었습니다. 리스틀리의 '구글시트로 내보내기' 기능을 사용하여 추출물을 간단하게 스프레드시트로 모아볼 수 있었습니다.😄
이 예제에서는 각 파일의 스크랩 일자를 파일명에 포함하여 추후 해당 파일명도 같이 출력되도록 구성할 예정입니다. 파일명은 제가 임의로 수정하였습니다.

여기서 주의하실 점은 한 폴더에 담긴 각각의 파일들은 데이터 열의 구조가 동일해야 한다는 점인데요. 그래야 나중에 한 시트에 모았을 때 같은 데이터가 같은 열에 표시될 수 있기 때문입니다.

(구조가 다른 데이터를 취합하려면 난이도가 훅 올라갑니다.😖)


여기까지 하셨다면 모든 준비가 끝났습니다!


STEP 3. 앱스크립트 실행, 스크립트를 붙여넣고 폴더 ID 넣기

STEP1 에서 만든 빈 시트로 돌아가 확장프로그램 → Apps Script를 클릭해주세요.

그럼 위와같은 화면을 만나게 되실텐데요. 위 빨간 네모로 표시된 기본값을 삭제하고 아래 녹색 박스 영역의 스크립트를 복사하여 붙여넣어주세요. 그리고 스크립트 내 빨간 글씨로 강조된 부분을 꼭 확인해주세요.
function mergeSheets() {
var folderId = "폴더ID를 입력하세요"; // 여기에 특정 폴더 ID를 입력하세요.
var sheetName = "시트1"; // 데이터를 모을 시트 이름
var ss = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = ss.getSheetByName(sheetName);
if (!targetSheet) {
targetSheet = ss.insertSheet(sheetName);
}

// 첫 행을 제외하고 시트의 모든 데이터를 삭제합니다.
var lastRow = targetSheet.getLastRow();
if (lastRow > 1) {
// 2행부터 마지막 행까지 삭제합니다.
targetSheet.deleteRows(2, lastRow - 1);
}

// 지정된 폴더에서 스프레드시트 파일을 찾아 각 파일의 데이터를 수집합니다.
var folder = DriveApp.getFolderById(folderId);
var files = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
var allData = [];

while (files.hasNext()) {
var file = files.next();
var fileData = SpreadsheetApp.openById(file.getId());
var sheets = fileData.getSheets();

for (var i = 0; i < sheets.length; i++) {
var sheetData = sheets[i].getDataRange().getValues();
for (var j = 1; j < sheetData.length; j++) { // 첫 번째 행(타이틀 행)을 제외하고 데이터 수집
// 각 행의 맨 앞에 파일명을 추가합니다.
allData.push([file.getName()].concat(sheetData[j]));
}
}
}

// 수집된 데이터를 시트에 추가합니다.
if (allData.length > 0) {
targetSheet.getRange(2, 1, allData.length, allData[0].length).setValues(allData);
}
}
[참고] 위 스크립트는 다음과 같은 프롬프트를 기반으로 챗GPT로 생성한 것입니다. 내용을 참고하여 원하시는 방식으로 응용해 보세요.😉

구글스크립트를 사용하여 특정 폴더 안에 있는 모든 구글시트 파일들의 데이터를 하나의 시트에 합치는 앱스크립트가 필요해. 스크립트는 다음과 같은 로직을 따라서 가독성이 좋고 설명이 간단하게 만들어줘.

1. 특정 폴더의 ID를 사용하여 폴더 안에 있는 모든 스프레드시트 파일들의 목록과 데이터를 가져와줘.
2. 각 파일에서 모든 시트의 데이터를 순회하며 첫 행(제목행)을 제외한 모든 데이터를 수집해줘. 각 데이터 행 앞에는 해당 데이터가 속한 파일의 이름을 추가해줘.
3. 선택된 목표시트(시트1)에 데이터를 수집해줘. 만약 시트 안에 데이터가 있으면 첫행을 제외한 모든 행을 삭제하고 수집한 데이터는 2행부터 삽입해줘. 
*폴더 ID 확인하는 법 & 시트 이름 대조하기*

폴더ID는 생성한 하위 폴더의 URL 뒷쪽에 위치해 있는데요.


https://drive.google.com/drive/u/0/folders/1gF0VnSFH38usdllkwjmlsdn

위와같이 folders/ 뒤에 붙은 난수 형태의 긴 문자열이 폴더 ID입니다.

주의하실 점! 스크립트에 " " 따옴표 없이 ID만 입력하시면 작동하지 않으니 꼭 따옴표 사이에 원하시는 폴더 ID를 붙여넣으세요.😉 

그리고 스크립트 내 시트1 부분은 데이터를 모을 시트 하단의 이 부분과 동일해야합니다. 만약 시트 이름을 변경하고 싶으시다면, 스크립트에서도 동일한 이름으로 바꿔주시면 됩니다. (파일 이름과는 상관이 없어요.)

STEP 4. 스크립트 실행, 권한 설정하기
위 스크립트에서 폴더 ID를 변경하고, 시트 이름을 확인했다면 저장 → 실행 버튼을 순서대로 클릭합니다.
최초로 스크립트를 생성했다면 위와 같이 승인 팝업이 뜨는데요. 
권한검토를 클릭하신 후 화면에서 안내하는대로 계정을 선택하고, 권한을 '허용'합니다.

액세스 권한을 허용하면 자동으로 앱스크립트가 실행되고, 화면 하단에서 실행이 시작되었다는 알림을 확인할 수 있습니다. 잠시 기다리면 실행이 완료됩니다.   
STEP 5. 불러온 데이터 확인하기
'누적데이터' 폴더 안의 모든 데이터가 제가 지정한 시트로 불러와진 것을 확인 할 수 있었습니다. 1행은 타이틀을 위해 남겨두었기 때문에, 각 데이터에 알맞는 타이틀을 넣고 필터도 걸어주었습니다. 파일명을 날짜로 만들어 두었기때문에, 오름차순으로 필터를 설정하니 날짜순으로 정렬된 데이터를 확인할 수 있었어요.

STEP 6. 스크립트 재실행하기

파일을 불러왔다면 설정한 폴더 안에 파일이 추가/삭제되거나, 파일 내부의 데이터 자체가 수정되었을 경우 어떻게 반영되는지도 살펴보아야겠죠?

저는 알아보기 쉽도록 "키보드_240301" 파일을 폴더에서 삭제하고 "키보드_240229" 파일을 새로 폴더에 넣어두었습니다. 그리고, "키보드_240302" 파일에서는 임의로 한칸의 데이터의 내용을 바꿔놓았어요.

폴더나 대상파일 안에서 어떤 수정이 있었다면 다시 앱스크립트를 켜서 실행버튼을 클릭해주세요. 그럼 데이터가 변경된 내용으로 업데이트됩니다.😉


짠! 0229 파일의 데이터가 새로 추가되었고, 0301파일의 데이터는 반영되지 않았네요. 
그리고 0302 데이터에서 수정된 내용도 업데이트 된 것을 확인할 수 있었습니다.

오늘은 구글시트를 통해 한 폴더 속에 있는 여러개의 데이터를 특정 시트에 모아 유동적으로 연동해 보았습니다. 다음 시간에는 이렇게 생성한 데이터 모음 안에서 간단한 검색 기능을 만드는 예제를 다뤄보려고 합니다. (관련 의견을 남겨주신 구독자님 감사합니다~)


부디 오늘의 레터가 하시는 업무에 조금이나마 도움이 되었길 바랍니다.😍

💌
오늘의 뉴스레터, 어떻게 보셨나요?
뉴스레터에서 다뤄줬으면 하는 내용이 있으시다면
아래 버튼을 클릭해 소중한 의견을 남겨주세요.
💚 지난 주 리스틀리 뉴스레터 구독자님의 코멘트! 💚

"사진 다운로드법 알려주세요"
관련 주제를 다뤘던 지난 뉴스레터 링크를 첨부합니다.❤️

리스틀리 뉴스레터를 처음 받아보셨나요?
본 메일은 리스틀리 마케팅 정보 수신에 동의하신 회원님을 대상으로 발송되었습니다.