DASHBOARD
EXAMS
New exam
Lines starting with [time], [session] or [attempts] show only when the exam has a time limit, is opened from a session QR code, or has limited attempts. Empty sections are hidden.
Information the examinee enters before the exam
Choose one field as the examinee ID — it is used to count attempts and control retakes.
Exam schedule
Add a session for each exam date. Every session has its own QR code, which works only from its start time to its end time (examinees who scan early see a countdown). Attempts and results are linked to the session. Times use the system time zone (Asia/Riyadh — change it in Settings).
Import questionnaire
Questionnaire format
1. What is the capital of France? A. London B. Paris C. Rome Answer: B Points: 2 2. The sun rises in the east. Answer: True 3. What gas do plants absorb? Answer: SHORT = carbon dioxide | CO2 4. Describe the steps in a fire evacuation. Answer: ESSAY Points: 5
- Every question ends with an Answer: line. Points: is optional (default 1).
- Multiple choice: Answer: B (letter). True/False: Answer: True or False.
- Short answer: Answer: SHORT = text (alternatives separated by |) is auto-marked; Answer: SHORT alone is marked manually.
- Essay: Answer: ESSAY — marked manually in Results.
- Paste an image under a question (or on a choice line) to include it. Lines starting with // are ignored.
Results
FORMS
Registration, attendance and other forms with your own fields, including an electronic signature. Each form is scheduled, and every session has its own QR code.
New form
Restrictions
Limit who can submit: one per person, one per email, one per device. Deleting a response in Responses frees that person, email and device to submit again.
Fields
Drag order with ↑ ↓. Options are comma separated (dropdown, multiple choice, checkboxes); for Info text type the text to show. Mark one field as ID (e.g. Staff ID) to stop duplicate responses.
Registration period
A registration form has one QR code / link. It accepts responses while the form is Open and inside the period below.
Sessions
Add a session for each date. Every session has its own QR code, which accepts responses only from its start time to its end time (24-hour). The form must also be Open.
Response limit: the most responses this session accepts (e.g. 30 seats). When it is reached, the form shows “This session is full”. Leave blank for no limit.
Responses
Settings
Examiners & access
Activity log
Admin password & security
Changing the password signs out every other device that is signed in.
After 5 wrong passwords, sign-in from that device is blocked for 15 minutes and you get an email. Reset codes, alerts and lock-outs are sent with the Gmail set up in Email (Gmail).
Organisation & system name
Shown at the top of the exam pages, the admin page and the forms. Forms can have their own title. Leave a box blank to use the default.
Certificate template (all exams)
A Word (.docx) certificate for examinees who pass, with {{Name}}, {{ExamTitle}}, {{ExamDate}}, {{StaffID}} and {{DeptUnit}} where the details go. Used for every exam unless the exam has its own template (exam → Details & rules → Certificate).
System check
Checks the database, picture storage, email and the Google Sheet backup.
Email (retake links and results)
Emails are sent from your own Gmail account, using a Google App password (not your normal password). Create one at myaccount.google.com/apppasswords — 2-Step Verification must be on.
Move data & full backup
From the old Google Sheet: open it, choose File → Download → Microsoft Excel (.xlsx), then pick that file here. Exams, questions, sessions, results, retake approvals, forms and form responses are copied into Supabase.
A .json backup downloaded here, or an .xlsx backup from Google Drive, can also be imported here to restore everything. Dropdown lists, exam defaults, the certificate template and the admin password are not in the old Sheet — set them again in Settings.
Exam defaults
Every setting from an exam's Rules tab. New exams start with these. Apply to all exams also changes every existing exam (imported past exams are left as they are). The box on the left of each row chooses whether that setting is included — untick it to leave that setting as it is. Tick all · Untick all
Dropdown lists
Lists that examinees (and form users) choose from, e.g. Department Units, Positions, Hospitals. In an exam's Examinee details or a form's fields, set the field type to list from Settings and pick the list. One item per line.
Google Sheet backup (optional)
Keeps a live copy of your data in a Google Sheet — no Apps Script. Each tab of the Sheet pulls its data with one formula. Google refreshes it about once an hour and whenever the Sheet is opened.
- Create a new Google Sheet (sheets.new).
- Add one tab for each line below and name it as shown (a tab can be renamed later).
- In each tab, click cell A1 and paste that tab’s formula. If Google asks, click Allow access.
These formulas contain a secret key: anyone who has them can read your data, including answer keys. Keep the Sheet private, and change the key if it was shared by mistake.
Google Drive backup (Excel and / or JSON file)
Saves the whole system to your Google Drive as an Excel file (.xlsx), a .json file, or both — by hand or on a schedule. Any backup can be restored here, or downloaded from Drive and imported in Move data.
Times use the system time zone (). Older backups are deleted from Drive; 0 = keep all.
One-time setup: Apps Script (about 5 minutes)
- Open script.google.com → New project while signed in to the Gmail that should keep the backups. Click Untitled project and name it Exam Backup.
- Click Copy script below. In the editor select all the code (Ctrl+A), paste (Ctrl+V), then click 💾 Save.
- Allow Drive access: in the toolbar, pick the function authorize in the list next to ▶ Run, then click ▶ Run → Review permissions → choose your Gmail. On “Google hasn’t verified this app” click Advanced → Go to Exam Backup (unsafe) → Allow. The log should say Ready. (It is your own script, so this is safe.)
- Click Deploy → New deployment → the ⚙ next to Select type → Web app. Set Execute as: Me and Who has access: Anyone → Deploy.
- Copy the Web app URL, paste it below and click Save & test.
The script contains a secret key; only requests with that key are accepted, and it only touches files in its Online Exam Backups folder. If you change the key, copy the script again and update it (Deploy → Manage deployments → ✏ Edit → Version: New version → Deploy) — the Web app URL stays the same.
One-time setup: Google Cloud app
- Open Google Cloud → New project, name it e.g. Exam Backup, click Create.
- Open Google Drive API (check the new project is selected at the top) → Enable.
- Open Google Auth Platform → Get started: app name Exam Backup, User support email = your Gmail → Audience: External → Contact email = your Gmail → agree → Create.
- Go to Clients → + Create client → type Web application. Under Authorized redirect URIs click + Add URI and paste:
Click Create, then copy the Client ID and Client secret into the boxes below.
- Go to Audience → Publish app → Confirm, so the connection does not expire after 7 days.
Publish app greyed out? Open Branding, make sure App name, User support email and Developer contact information are filled, click Save, then reload the Audience page. Still greyed out? On Audience → Test users click + Add users and add your Gmail. It works the same, but Google asks you to click Connect Google Drive again every 7 days (the card will say so).
Google asks you to sign in and allow access. If it says “Google hasn’t verified this app”, click Continue — it is your own app. The system can only see the backup files it makes, not the rest of your Drive.
Import examinee submissions
- First row = headings: Timestamp, Email, Staff ID, Name, Unit, then one column per question.
- If a score-only result was imported before, the answers are added to it (no extra attempt). Uploading the same file again is safe: an attempt of the same person at the same time is skipped.
Connection
Change these in config.js.