반응형
안녕하세요 😊
구글시트를 매일 쓰는 실무자분들이라면 시트 데이터 백업이 얼마나 중요한지 공감하실 거예요.
특히, 매일 데이터를 자동으로 백업하면서도
문서 용량이 커지지 않게 한 달 단위로 관리할 수 있다면 완전 실무 최적화겠죠?
오늘은 바로 그걸 해결하는 방법을 알려드릴게요!
👉 매일 자동 백업 + 한 달 단위 문서 분리 자동화 시스템입니다.
💡 어떤 문제를 해결하는 걸까요?
- ✔️ 매일 시트 데이터를 백업하고 싶은데
- ✔️ 문서가 너무 무거워져 느려짐...
- ✔️ 수식 참조까지 자동으로 처리하고 싶고
- ✔️ 매월 문서를 자동으로 구분해서 정리하면 완벽!
👉 이걸 한 번에 해결하는 구조입니다!
🧠 핵심 로직 요약
- 매일 지정된 시트 2개를 백업
- 시트 이름은 백업_시트명_2025-03-30 형식으로 자동 생성
- 한 달 단위로 2025_03_백업, 2025_04_백업 같은 구글시트 문서에 분리 저장
- 수식 참조도 자동으로 바뀌어요 (예: =시트1!A1 → =백업_시트1_2025-03-30!A1)
- 백업 대상 셀(A1, D5 등)만 수식 치환으로 안전하게 처리
✅ 전체 코드 (Google Apps Script)
반응형
function monthlySeparatedBackup() {
const sourceSpreadsheetId = "외부문서ID"; // 원본 문서 ID
const sheetNames = ["시트1", "시트2"];
const backupFolderId = "백업폴더ID"; // 구글 드라이브 폴더 ID
const now = new Date();
const year = now.getFullYear();
const month = ('0' + (now.getMonth() + 1)).slice(-2);
const today = Utilities.formatDate(now, Session.getScriptTimeZone(), "yyyy-MM-dd");
const monthKey = `${year}_${month}`;
const backupFileName = `${monthKey}_백업`;
const folder = DriveApp.getFolderById(backupFolderId);
let targetFile;
const files = folder.getFilesByName(backupFileName);
if (files.hasNext()) {
targetFile = files.next();
} else {
const newFile = SpreadsheetApp.create(backupFileName);
const file = DriveApp.getFileById(newFile.getId());
folder.addFile(file);
DriveApp.getRootFolder().removeFile(file);
targetFile = file;
}
const targetSpreadsheet = SpreadsheetApp.openById(targetFile.getId());
const sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetId);
const nameMap = {};
sheetNames.forEach(sheetName => {
const sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
if (!sourceSheet) return;
const backupName = `백업_${sheetName}_${today}`;
const existing = targetSpreadsheet.getSheetByName(backupName);
if (existing) targetSpreadsheet.deleteSheet(existing);
const copiedSheet = sourceSheet.copyTo(targetSpreadsheet);
SpreadsheetApp.flush();
Utilities.sleep(500);
copiedSheet.setName(backupName);
nameMap[sheetName] = backupName;
});
const cellsToUpdate = ["셀"];
const sheet2BackupName = nameMap["시트2"];
const targetSheet2 = targetSpreadsheet.getSheetByName(sheet2BackupName);
if (targetSheet2) {
cellsToUpdate.forEach(cell => {
const range = targetSheet2.getRange(cell);
range.clearDataValidations();
const formula = range.getFormula();
if (!formula) return;
let updatedFormula = formula;
for (let oldSheet in nameMap) {
const newSheet = nameMap[oldSheet];
const regex = new RegExp(`'?${oldSheet}'?!`, "g");
updatedFormula = updatedFormula.replace(regex, `'${newSheet}'!`);
}
range.setFormula(updatedFormula);
});
}
Logger.log(`✅ ${monthKey} 백업 완료`);
}
🛠️ 설정 방법
- Apps Script 열기
구글시트 → 확장 프로그램 > Apps Script - 코드 붙여넣기
- sourceSpreadsheetId와 backupFolderId 채우기
- 시간 기반 트리거 설정
- 함수: monthlySeparatedBackup
- 반복: 매일 원하는 시간
💬 꿀팁 + 실전 운영 전략
- 📁 구글 드라이브에 📂 백업전용 폴더를 하나 만들어 정리하세요
- 🧹 매달 새 문서에 자동 분리되므로 문서가 무거워지지 않아요
- 📄 시트2의 수식만 자동으로 참조 시트 이름 변경 → 완전 무결한 자동화
- 📥 추후 PDF 저장, 이메일 전송, 숨김 처리까지 확장도 가능
✅ 마무리 요약
728x90
반응형
그리드형
댓글