School cover planning

Weekly Cover Sheet

Choose an absent teacher, add whole-day or period absences, then publish a simple Mon–Fri cover overview.

Defaults to the current ISO week.

Input

Add an absence

Output

Weekly cover overview

Publish

Google Sheet live update

Recommended: use a Google Sheet as the live document staff check. Paste a Google Apps Script web app URL here, then press update when the weekly overview is ready.

Google Sheet setup script

Create a Google Sheet, copy its Sheet ID from the URL, open Extensions → Apps Script, paste this script, replace PASTE_YOUR_SHEET_ID_HERE, then deploy as a Web App.

const SPREADSHEET_ID = 'PASTE_YOUR_SHEET_ID_HERE';

function doGet() {
  return jsonOutput({ ok: true, message: 'Cover Sheet script is live' });
}

function doPost(e) {
  try {
    const payload = JSON.parse(e.postData.contents || '{}');
    const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
    const sheetName = 'Week ' + payload.week;
    const sheet = ss.getSheetByName(sheetName) || ss.insertSheet(sheetName);

    const rows = [['Day','Period','Time','Absent teacher','Lesson','Cover','Cover note']];
    (payload.rows || []).forEach(r => rows.push([
      r.day || '',
      r.period || '',
      r.time || '',
      r.absentTeacher || '',
      r.lesson || '',
      r.coverName || '',
      r.coverNote || ''
    ]));

    sheet.clear();
    sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
    sheet.getRange(1, 1, 1, rows[0].length).setFontWeight('bold');
    sheet.setFrozenRows(1);
    sheet.autoResizeColumns(1, rows[0].length);

    return jsonOutput({ ok: true, week: payload.week, rows: rows.length - 1 });
  } catch (err) {
    return jsonOutput({ ok: false, error: String(err) });
  }
}

function jsonOutput(obj) {
  return ContentService
    .createTextOutput(JSON.stringify(obj))
    .setMimeType(ContentService.MimeType.JSON);
}