TEACHER · CLOUD SYNC SETUP

☁ 클라우드 동기화 설정

왜 필요한가요?

모둠편성기 · 자리배치 · 1인1역 같은 도구는 기본적으로 내 브라우저 안에만 데이터를 저장해요. 학교컴 ↔ 집컴 ↔ 태블릿에서 같은 데이터를 쓰고 싶다면 Google 시트를 공용 저장소로 연결하면 돼요. 비용 0원, 구글 계정만 있으면 됩니다.

💡 이 설정은 한 번만 하면 돼요. 이후엔 각 도구에서 ☁ 버튼 누르면 자동 저장/불러오기.
1

Google 시트 새로 만들기

  1. sheets.new 클릭해서 빈 시트 생성
  2. 왼쪽 위 파일명에 SciT 데이터 같은 이름 입력
📁 이 시트 하나가 모든 도구(모둠편성/자리/역할 등)의 공용 데이터 저장소가 돼요. 하나만 만들면 됩니다.
2

Apps Script 열기 & 코드 붙여넣기

  1. 방금 만든 시트 상단 메뉴에서 확장 프로그램 → Apps Script 클릭
  2. 새 창이 열리면 기본 코드(function myFunction())를 전부 지우기
  3. 아래 코드를 [복사] 버튼으로 복사해서 붙여넣기
/* ============================================================
   SciT Cloud Sync · Google Apps Script
   - 이 스크립트는 현재 시트에 데이터를 저장/조회합니다.
   - 배포: 새 배포 → 유형: 웹 앱 → 액세스: "모든 사용자"
   ============================================================ */

// ★★★ 반드시 바꾸세요: 나만 아는 비밀 문자열로! ★★★
const TOKEN = '여기에_내_비밀_토큰_문자열';

const SHEET_NAME = 'SciT_Data';

function doPost(e) {
  try {
    const body = JSON.parse(e.postData.contents);
    if (body.token !== TOKEN) {
      return json({ok: false, error: 'invalid token'});
    }

    const action = body.action;

    if (action === 'ping') {
      return json({ok: true, ping: true, now: new Date().toISOString()});
    }

    const sheet = getOrCreateSheet_();

    if (action === 'save') {
      const ts = new Date().toISOString();
      sheet.appendRow([ts, body.tool || '', body.key || '', JSON.stringify(body.data || {})]);
      return json({ok: true, savedAt: ts});
    }

    if (action === 'load') {
      const values = sheet.getDataRange().getValues();
      // 최신 기록부터 역순 검색
      for (let i = values.length - 1; i >= 1; i--) {
        const [ts, tool, key, dataStr] = values[i];
        if (tool === body.tool && key === body.key) {
          return json({ok: true, data: JSON.parse(dataStr), savedAt: ts});
        }
      }
      return json({ok: true, data: null});
    }

    if (action === 'list') {
      const values = sheet.getDataRange().getValues();
      const seen = {};
      for (let i = values.length - 1; i >= 1; i--) {
        const [ts, tool, key] = values[i];
        if (tool === body.tool && !seen[key]) {
          seen[key] = ts;
        }
      }
      const items = Object.keys(seen).map(k => ({key: k, savedAt: seen[k]}));
      return json({ok: true, items});
    }

    return json({ok: false, error: 'unknown action'});
  } catch (err) {
    return json({ok: false, error: String(err)});
  }
}

function doGet(e) {
  return json({ok: true, service: 'SciT Cloud Sync', now: new Date().toISOString()});
}

function getOrCreateSheet_() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(SHEET_NAME);
  if (!sheet) {
    sheet = ss.insertSheet(SHEET_NAME);
    sheet.appendRow(['timestamp', 'tool', 'key', 'data']);
    sheet.setFrozenRows(1);
  }
  return sheet;
}

function json(obj) {
  return ContentService
    .createTextOutput(JSON.stringify(obj))
    .setMimeType(ContentService.MimeType.JSON);
}
⚠️ 붙여넣은 뒤 맨 윗줄의 TOKEN을 반드시 수정하세요. 아무도 모르는 비밀 문자열(예: jwkst-2026-spring)로 바꿔야 해요.
  1. 위에서 Ctrl+S(또는 💾 저장 아이콘) 눌러서 저장
  2. 프로젝트 이름 물어보면 SciT Sync 등 아무거나 입력
3

웹앱으로 배포

  1. 오른쪽 위 파란 [배포] 버튼 → 새 배포 클릭
  2. 왼쪽 톱니바퀴 아이콘 클릭 → 웹 앱 선택
  3. 설명: SciT Cloud v1 (아무거나 가능)
  4. 다음 사람으로 실행:
  5. 액세스 권한이 있는 사용자: 모든 사용자 ★★★ 중요!
  6. [배포] 클릭 → 권한 승인 요청 시 [액세스 승인] → 내 구글 계정 선택 → "고급 → 안전하지 않음으로 이동" → 허용
  7. 완료되면 웹 앱 URL이 나와요. 복사해서 메모장에 붙여놓기
⚠️ "모든 사용자" 선택 안 하면 브라우저에서 접근 불가능해요. 걱정 마세요 — 위에 설정한 TOKEN이 맞아야만 데이터가 저장/조회되므로 URL만 알아도 남이 못 써요.
📝 결과 URL 예시:
https://script.google.com/macros/s/AKfycb.../exec
4

웹앱에 연결하기

  1. 모둠편성기 등 도구를 열기
  2. 상단의 ☁ 클라우드 버튼 클릭
  3. ① 연결 설정 란에:
    • Apps Script 웹앱 URL → 3단계에서 받은 URL
    • 비밀번호 토큰 → 2단계에서 바꿨던 TOKEN
  4. [💾 설정 저장][🔌 연결 테스트] 클릭 → "연결 성공!" 나오면 OK
✅ 설정은 브라우저에 저장되므로 기기마다 한 번씩 설정하면 돼요 (학교컴 + 집컴 각 1회).
URL과 토큰만 같으면 두 기기가 같은 데이터를 주고받습니다.
5

쓰는 방법

저장: ☁ 클라우드 버튼 → [☁ 지금 상태 클라우드에 저장]

불러오기: 다른 기기에서 ☁ 클라우드 버튼 → [📥 클라우드에서 불러오기]

저장은 학급명(key) 기준이라서, "1학년 3반"으로 저장한 데이터는 다른 기기에서 학급명을 "1학년 3반"으로 맞춰놓고 불러와야 나와요.

📊 저장된 데이터는 Google 시트에서 바로 확인할 수 있어요 (SciT_Data 탭). 학기말 백업이나 엑셀 편집도 자유롭게!

자주 묻는 질문

Q. 토큰을 까먹었어요

Apps Script에 다시 들어가서 TOKEN 값을 확인하면 돼요. 원한다면 바꾸고 배포 관리 → 수정(연필) → 버전: 새 버전 → 배포하면 업데이트됩니다.

Q. URL이 바뀌었어요

새 배포를 또 하면 URL이 매번 새로 생깁니다. 기존 배포를 유지하려면 배포 관리 → 수정(연필)로 업데이트하세요. 여러 개 배포하면 기존 URL도 계속 동작합니다.

Q. 여러 선생님이 같이 써도 되나요?

토큰만 공유하면 같은 시트를 함께 씁니다. 다만 덮어쓰기 관리가 없어서 추천하지는 않아요. 동학년 공유가 필요하면 선생님별로 시트를 분리하거나, 학급명(key)로 구분하세요.

Q. 데이터가 삭제되나요?

저장은 시트에 로그 방식으로 쌓입니다(덮어쓰기 X). 시트가 너무 커지면 오래된 행을 직접 지워도 됩니다. 최신 행만 불러오므로 기능상 문제는 없어요.

Q. 보안이 걱정돼요

시트는 선생님 본인의 Google Drive에 있고, URL을 몰라도 아무도 접근할 수 없어요. URL이 유출돼도 TOKEN이 맞지 않으면 저장/조회 모두 거부됩니다. 실명 학생 데이터를 다루므로 토큰은 복잡하게 설정하세요.

🏫 우리 학교 수집기 주소

학급 보드·라이브 응답기·퀴즈 대결처럼 학생이 함께 접속하는 앱은 기본으로 과학쌤과학습이 배포한 공용 주소를 씁니다. 그런데 앱스스크립트는 계정마다 하루 실행 시간과 동시 접속 한도가 있어서, 한 주소에 여러 학교가 몰리면 수업 중에 느려지거나 막힐 수 있습니다.

위 안내대로 학교(또는 선생님) 계정으로 스크립트를 한 번 배포하고 그 주소를 아래에 넣으면, 이 브라우저의 모든 앱이 그 주소를 씁니다. 한도를 각자 쓰게 되어 서로 방해하지 않아요. 퀴즈 대결처럼 30명이 동시에 붙는 앱을 쓰신다면 꼭 해 두시길 권합니다.