모둠편성기 · 자리배치 · 1인1역 같은 도구는 기본적으로 내 브라우저 안에만 데이터를 저장해요. 학교컴 ↔ 집컴 ↔ 태블릿에서 같은 데이터를 쓰고 싶다면 Google 시트를 공용 저장소로 연결하면 돼요. 비용 0원, 구글 계정만 있으면 됩니다.
SciT 데이터 같은 이름 입력function myFunction())를 전부 지우기/* ============================================================
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)로 바꿔야 해요.Ctrl+S(또는 💾 저장 아이콘) 눌러서 저장SciT Sync 등 아무거나 입력SciT Cloud v1 (아무거나 가능)https://script.google.com/macros/s/AKfycb.../exec
TOKEN 값저장: ☁ 클라우드 버튼 → [☁ 지금 상태 클라우드에 저장]
불러오기: 다른 기기에서 ☁ 클라우드 버튼 → [📥 클라우드에서 불러오기]
저장은 학급명(key) 기준이라서, "1학년 3반"으로 저장한 데이터는 다른 기기에서 학급명을 "1학년 3반"으로 맞춰놓고 불러와야 나와요.
SciT_Data 탭). 학기말 백업이나 엑셀 편집도 자유롭게!Apps Script에 다시 들어가서 TOKEN 값을 확인하면 돼요. 원한다면 바꾸고 배포 관리 → 수정(연필) → 버전: 새 버전 → 배포하면 업데이트됩니다.
새 배포를 또 하면 URL이 매번 새로 생깁니다. 기존 배포를 유지하려면 배포 관리 → 수정(연필)로 업데이트하세요. 여러 개 배포하면 기존 URL도 계속 동작합니다.
토큰만 공유하면 같은 시트를 함께 씁니다. 다만 덮어쓰기 관리가 없어서 추천하지는 않아요. 동학년 공유가 필요하면 선생님별로 시트를 분리하거나, 학급명(key)로 구분하세요.
저장은 시트에 로그 방식으로 쌓입니다(덮어쓰기 X). 시트가 너무 커지면 오래된 행을 직접 지워도 됩니다. 최신 행만 불러오므로 기능상 문제는 없어요.
시트는 선생님 본인의 Google Drive에 있고, URL을 몰라도 아무도 접근할 수 없어요. URL이 유출돼도 TOKEN이 맞지 않으면 저장/조회 모두 거부됩니다. 실명 학생 데이터를 다루므로 토큰은 복잡하게 설정하세요.
학급 보드·라이브 응답기·퀴즈 대결처럼 학생이 함께 접속하는 앱은 기본으로 과학쌤과학습이 배포한 공용 주소를 씁니다. 그런데 앱스스크립트는 계정마다 하루 실행 시간과 동시 접속 한도가 있어서, 한 주소에 여러 학교가 몰리면 수업 중에 느려지거나 막힐 수 있습니다.
위 안내대로 학교(또는 선생님) 계정으로 스크립트를 한 번 배포하고 그 주소를 아래에 넣으면, 이 브라우저의 모든 앱이 그 주소를 씁니다. 한도를 각자 쓰게 되어 서로 방해하지 않아요. 퀴즈 대결처럼 30명이 동시에 붙는 앱을 쓰신다면 꼭 해 두시길 권합니다.