기존 코드를 모두 지우고, 아래 코드를 붙여넣습니다:
function doGet(e) {
var cache = CacheService.getScriptCache();
var cached = cache.get('schedule_json');
if (cached) {
return ContentService.createTextOutput(cached).setMimeType(ContentService.MimeType.JSON);
}
var ss = SpreadsheetApp.getActiveSpreadsheet();
var schedule = [];
var titleMatch = ss.getName().match(/(\d{4})/);
var year = titleMatch ? titleMatch[1] : String(new Date().getFullYear());
ss.getSheets().forEach(function(sheet) {
var data = sheet.getDataRange().getValues();
var headerIdx = -1;
for (var i = 0; i < Math.min(5, data.length); i++) {
for (var j = 0; j < data[i].length; j++) {
if (String(data[i][j]).trim() === '강좌 일자') {
headerIdx = i;
break;
}
}
if (headerIdx >= 0) break;
}
if (headerIdx === -1) return;
var headers = data[headerIdx].map(function(h) { return String(h).trim(); });
var uidIdx = -1;
for (var j = 0; j < headers.length; j++) {
if (headers[j] === '고유번호' || headers[j].endsWith('고유번호')) {
uidIdx = j;
break;
}
}
var ci = {
uid: uidIdx,
date: headers.indexOf('강좌 일자'),
time: headers.indexOf('강좌 시간'),
teacher: headers.indexOf('성명'),
course: headers.indexOf('강좌명')
};
var cur = { uid: null, teacher: '', course: '', time: '' };
for (var i = headerIdx + 1; i < data.length; i++) {
var row = data[i];
var uid = ci.uid >= 0 ? row[ci.uid] : null;
var dateVal = ci.date >= 0 ? row[ci.date] : null;
var teacher = ci.teacher >= 0 ? row[ci.teacher] : '';
var course = ci.course >= 0 ? row[ci.course] : '';
var timeVal = ci.time >= 0 ? row[ci.time] : '';
if (uid !== '' && uid !== null && uid !== undefined) {
cur.uid = Number(uid);
}
if (teacher) cur.teacher = String(teacher).trim();
if (course) cur.course = String(course).trim();
if (timeVal) cur.time = String(timeVal).trim();
var dateInfo = parseDateVal_(dateVal, year);
if (!dateInfo) continue;
if (!cur.uid || !cur.course) continue;
schedule.push({
uid: cur.uid,
course: cur.course,
teacher: cur.teacher,
date: dateInfo.date,
day: dateInfo.day,
time: cur.time,
makeup: null
});
}
});
var output = JSON.stringify({
schedule: schedule,
count: schedule.length,
updatedAt: new Date().toISOString()
});
cache.put('schedule_json', output, 300);
return ContentService.createTextOutput(output).setMimeType(ContentService.MimeType.JSON);
}
function parseDateVal_(val, defaultYear) {
if (!val) return null;
if (val instanceof Date && !isNaN(val)) {
return {
date: Utilities.formatDate(val, Session.getScriptTimeZone(), 'yyyy-MM-dd'),
day: ['일','월','화','수','목','금','토'][val.getDay()]
};
}
var s = String(val).trim();
var m = s.match(/(\d+)월\s*(\d+)일/);
if (m) {
var month = ('0' + m[1]).slice(-2);
var day = ('0' + m[2]).slice(-2);
var dayOfWeek = '';
var dm = s.match(/\(([월화수목금토일])\)/);
if (dm) dayOfWeek = dm[1];
return { date: defaultYear + '-' + month + '-' + day, day: dayOfWeek };
}
m = s.match(/^(\d{4})-(\d{2})-(\d{2})/);
if (m) return { date: m[1] + '-' + m[2] + '-' + m[3], day: '' };
m = s.match(/^(\d{4})[-/.](\d{1,2})[-/.](\d{1,2})/);
if (m) return { date: m[1] + '-' + ('0' + m[2]).slice(-2) + '-' + ('0' + m[3]).slice(-2), day: '' };
return null;
}