68893236+KINDNICK@users.noreply.github.com 3fc2cae788 Add: 예약 현황(Schedule) 페이지 + 전체 네비게이션 Schedule 탭 추가
- Google Calendar 연동 예약 현황 페이지 (ko/en/ja/zh 4개 언어)
- Apps Script 프록시로 예약 일정만 노출 (이벤트 상세 비공개)
- localStorage 캐싱 + 인접 월 프리페치로 로딩 최적화
- 전체 36개 HTML 파일 인라인 헤더에 Schedule 네비게이션 링크 추가
- 스케줄 페이지 i18n.js 누락 수정 (언어 스위처 동작 복구)
- i18n JSON에 schedule 관련 번역 키 추가
- sitemap.xml에 schedule URL 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 01:23:12 +09:00

86 lines
2.8 KiB
JavaScript

/**
* Mingle Studio - Google Calendar Proxy
*
* Google Apps Script로 배포하여 사용
* 캘린더 일정을 조회하고, "//"가 포함되지 않은 일정이 있는 날을 "마감"으로 반환
*
* 설정 방법:
* 1. script.google.com 에서 새 프로젝트 생성
* 2. 이 코드 붙여넣기
* 3. CALENDAR_ID를 실제 캘린더 ID로 변경
* 4. 배포 → 웹 앱 → "모든 사용자"가 액세스 가능하도록 설정
* 5. 배포 URL을 js/schedule.js의 APPS_SCRIPT_URL에 입력
*/
// ★ 여기에 실제 캘린더 ID 입력
var CALENDAR_ID = 'minglestudio.mocap@gmail.com';
function doGet(e) {
var headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET',
'Content-Type': 'application/json'
};
try {
var params = e.parameter;
var year = parseInt(params.year) || new Date().getFullYear();
var month = parseInt(params.month) || (new Date().getMonth() + 1);
// 해당 월의 시작/끝
var startDate = new Date(year, month - 1, 1);
var endDate = new Date(year, month, 0, 23, 59, 59);
var calendar = CalendarApp.getCalendarById(CALENDAR_ID);
if (!calendar) {
return ContentService.createTextOutput(JSON.stringify({
error: 'Calendar not found'
})).setMimeType(ContentService.MimeType.JSON);
}
var events = calendar.getEvents(startDate, endDate);
var bookedDates = {};
for (var i = 0; i < events.length; i++) {
var title = events[i].getTitle();
// "//"가 포함된 일정은 무시 (내부 메모)
if (title.indexOf('//') !== -1) {
continue;
}
// 실제 예약 일정 → 해당 날짜를 마감 처리
var eventStart = events[i].getStartTime();
var eventEnd = events[i].getEndTime();
// 종일 이벤트는 endTime이 마지막날+1일 00:00이므로 하루 빼기
if (events[i].isAllDayEvent()) {
eventEnd = new Date(eventEnd.getTime() - 1);
}
// 여러 날에 걸친 일정 처리
var current = new Date(eventStart.getFullYear(), eventStart.getMonth(), eventStart.getDate());
var endDay = new Date(eventEnd.getFullYear(), eventEnd.getMonth(), eventEnd.getDate());
while (current <= endDay) {
var dateKey = Utilities.formatDate(current, Session.getScriptTimeZone(), 'yyyy-MM-dd');
bookedDates[dateKey] = true;
current.setDate(current.getDate() + 1);
}
}
var result = {
year: year,
month: month,
bookedDates: Object.keys(bookedDates).sort()
};
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({
error: error.message
})).setMimeType(ContentService.MimeType.JSON);
}
}