Автор скрипта @OlegROA
Дисклеймер публикации
Не забывайте читать комментарии внутри скрипта!
Сам скрипт: js-код для выгрузки ГУЧ (2025-26)
Выгрузка ГУЧ по всем учебным группам классов на заданную неделю
Формирование csv-файла с информацией по всем учебным группам классов школы на заданную неделю.
Формат строки: класс;группа;учитель;предмет;кол-во учеников;нагрузка
Если в группе нагрузку на заданной неделе делят несколько учителей, то по данной группе будет выгружена информация для каждого учителя.
1. ОБЯЗАТЕЛЬНО заходите в старую админку, на любую страницу.
2. Открываете в браузере панель инструментов разработчика.
3. Переходите на закладку Консоль.
4. Открываете файл со скриптом и копируете все его содержимое в окно консоли (в ФайрФоксе возможно придется подтвердить вставку кода ручным вводом указанной фразы).
5. Жмете Enter.
После успешного завершения работы скрипта, в зависимости от браузера, будет предложено сохранить csv-файл или он автоматически будет сохранен в папку «Загрузки». Наименование файла — «ГУЧ (NN неделя).csv».
Сортировка по классу, группе, ФИО учителя.
Кодировка текста в файле «Windows-1251», так что его сразу можно открывать в Excel и сортировать/фильтровать по нужным критериям.
!!! В СКРИПТЕ НИЧЕГО МЕНЯТЬ НЕ НУЖНО — ВСЕ ПАРАМЕТРЫ СКРИПТ
!!! ЗАПРОСИТ У ПОЛЬЗОВАТЕЛЯ САМ.
!!! Максимум — в следующем учебном году придётся изменить
!!! значение константы year_id на 14.
const year_id = 13; // Идентификатор учебного года (2025-2026)
// Глобальные переменные
var week_num = 0;
var grps = [];
var hours = 0;
(async () => {
// Функция преобразования текста из кодировки UTF-8
// в кодовый массив Windows-1251
async function toWin(s){
let code = [];
for(let i = 0; i < s.length; i++){
let c = s.charCodeAt(i);
if (c == 0x401){
code.push(0xA8);
} else if (c == 0x451){
code.push(0xB8);
} else if (c < 0x410){
code.push(c);
} else {
code.push(c - 848);
};
};
return (new Uint8Array(code));
};
// Функция чтения одной страницы данных в формате JSON
async function fetchOne(url) {
const res = await fetch(url);
const json = await res.json();
return(json);
};
// Функция чтения всех страниц данных в формате JSON
async function fetchAll(url) {
if (url.indexOf("?") == -1){
url += "?per_page=1000";
} else {
url += "&per_page=1000";
}
let recs = [];
let page = 0, pages = 0;
while (true){
page += 1;
const res = await fetch(url +"&page="+ page);
const hdr = await res.headers;
recs.push(...(await res.json()));
pages = hdr.get("x-pagination-total-pages") || hdr.get("pages");
if (!pages || (page >= pages)){break};
};
return(recs);
};
// Запрос номера недели
let d = new Date, dt = d.getTime(); d.setMonth(8, 1);
if (d.getTime() > dt){d.setFullYear(d.getFullYear() - 1);};
week_num = Math.ceil((dt - d.getTime()) / 8.64e7 / 7);
week_num = prompt("Введите номер учебной недели:", week_num);
if (!week_num || !week_num.trim()){return;};
// Формируем список всех классов
let cls = [];
let data = await fetchAll("core/api/class_units?academic_year_id="+ year_id +
"&with_home_based=true");
for (let cl of data){
if ((cl.class_level_id >= 1) && (cl.class_level_id <= 12)){
cls.push([cl.name, cl.id]);
};
};
cls.sort();
// Основной цикл - обход классов
for (let cls_data of cls){
console.log(cls_data[0]);
// Читаем список групп класса - только группы с назначенным учителем
let grp = await fetchAll("jersey/api/groups?academic_year_id="+ year_id +
"&class_unit_id="+ cls_data[1] +
"&only_with_teachers=true&with_teacher_loads=true");
if ((!grp) || (!grp.length)){continue};
// Обходим группы и формируем строку вывода
for (let g of grp){
for (let th of (g.teachers || [])){
thl = (th.teacher_loads || []).filter(function (ld){
return ld.week_number == week_num
});
if ((!thl) || (thl.length != 1) || (thl[0].real_hours <= 0)){continue;};
grps.push(cls_data[0] +";"+ g.name +";"+
(th.full_name || "???") +";"+ g.subject_name +";"+
g.student_count +";"+ thl[0].real_hours);
hours += thl[0].real_hours;
};
};
};
if (!grps.length){
console.log("Нет учебных групп с назначенными учителями и нагрузкой!");
} else {
grps.sort();
let csv = "Класс;Группа;ФИО учителя;Предмет;Учеников;Нагрузка\n"+ grps.join("\n");
// Создание файла формата CSV в кодировке Windows-1251
// и сохранение его браузером
const link = document.createElement("a");
const file = new Blob([await toWin(csv)], {type:'text/csv'});
link.href = URL.createObjectURL(file);
link.download = "ГУЧ ("+ week_num +" неделя).csv";
link.click();
URL.revokeObjectURL(link.href);
console.log("Всего учебных групп: "+ grps.length);
console.log("Общая нагрузка, часов: "+ hours);
};
})()
