- 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>
86 lines
2.8 KiB
JavaScript
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);
|
|
}
|
|
}
|