매일 백업하고, 한 달 단위로 문서 분리하는 자동화 시스템 만들기 (코드 포함)

반응형

안녕하세요 😊
구글시트를 매일 쓰는 실무자분들이라면 시트 데이터 백업이 얼마나 중요한지 공감하실 거예요.
특히, 매일 데이터를 자동으로 백업하면서도
문서 용량이 커지지 않게 한 달 단위로 관리할 수 있다면 완전 실무 최적화겠죠?

오늘은 바로 그걸 해결하는 방법을 알려드릴게요!
👉 매일 자동 백업 + 한 달 단위 문서 분리 자동화 시스템입니다.


💡 어떤 문제를 해결하는 걸까요?

  • ✔️ 매일 시트 데이터를 백업하고 싶은데
  • ✔️ 문서가 너무 무거워져 느려짐...
  • ✔️ 수식 참조까지 자동으로 처리하고 싶고
  • ✔️ 매월 문서를 자동으로 구분해서 정리하면 완벽!

👉 이걸 한 번에 해결하는 구조입니다!


🧠 핵심 로직 요약

  1. 매일 지정된 시트 2개를 백업
  2. 시트 이름은 백업_시트명_2025-03-30 형식으로 자동 생성
  3. 한 달 단위로 2025_03_백업, 2025_04_백업 같은 구글시트 문서에 분리 저장
  4. 수식 참조도 자동으로 바뀌어요 (예: =시트1!A1 → =백업_시트1_2025-03-30!A1)
  5. 백업 대상 셀(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} 백업 완료`);
}

 

🛠️ 설정 방법

  1. Apps Script 열기
    구글시트 → 확장 프로그램 > Apps Script
  2. 코드 붙여넣기
  3. sourceSpreadsheetId와 backupFolderId 채우기
  4. 시간 기반 트리거 설정
    • 함수: monthlySeparatedBackup
    • 반복: 매일 원하는 시간

💬 꿀팁 + 실전 운영 전략

  • 📁 구글 드라이브에 📂 백업전용 폴더를 하나 만들어 정리하세요
  • 🧹 매달 새 문서에 자동 분리되므로 문서가 무거워지지 않아요
  • 📄 시트2의 수식만 자동으로 참조 시트 이름 변경 → 완전 무결한 자동화
  • 📥 추후 PDF 저장, 이메일 전송, 숨김 처리까지 확장도 가능

✅ 마무리 요약

728x90
반응형
그리드형

두루바퀴세상

자전거의 모든것 알고싶다면?? 두루바퀴세상 !!

    이미지 맵

    액셀, 구글시트 다른 글

    이전 글

    다음 글