Auto-Connect (Default)
Loads automatically from the configured Google Sheet on every page open.
Google Sheet Link
Enter any sharable Google Sheet URL to load from a different source.
Upload CSV File
Manually upload an exported CSV file from Google Sheets.
Example: https://docs.google.com/spreadsheets/d/.../edit?usp=sharing
⚙️ Advanced setup (optional) — merge extra evaluation sheets & link quizzes to rotations
📊 Merge Multiple Evaluation Sheets Optional
Have evaluations split across more than one Google Form / sheet? Add each one here and the dashboard loads them together with your default sheet — all evaluations pooled per resident. Each sheet must use the same evaluation columns and be shared "Anyone with the link".
▶ How the mapping works
- Load quiz scores — each row is one resident, each column is one quiz (Quiz 1, Quiz 2, …). Up to 5 quizzes supported.
- Load the rotation schedule — each row is one resident with 13 blocks for the academic year. Block cells contain whatever rotation codes your program uses (e.g. EM-Main, PICU, Elective).
- Tell us which codes are "core" — quizzes are only auto-assigned to blocks matching these codes. The Nth matching block a resident does receives Quiz N. Consecutive matching blocks form a single ITER period whose exam % is the average of its quizzes.
- Override anytime — per-resident on the profile page via the Map manually button next to the quiz picker, or skip all of this and enter the exam % by hand.
1📚 Quiz & Exam Scores
Paste a Google Sheet URL (shared as "Anyone with the link") or upload a CSV. Each row is one resident, each column is one quiz/exam (Quiz 1, Quiz 2, …). Column labels can be anything — the app matches on "Quiz N" style.
#gid= in that tab's URL) instead of its name.2📅 Rotation Schedule
Your master annual rotation now lives in the Schedules tab (left menu). Load it there once — quiz-to-block matching picks it up automatically. Optional if you only enter exam % by hand.
3🎯 Core Rotation Codes
Which rotation labels in your schedule should receive quizzes? Enter a comma-separated list — partial matches work (e.g. EM-Main matches EM-Main-1). Quizzes are only auto-assigned to blocks whose code matches one of these.
EM-Main for in-hospital EM rotations, enter just that.
If you have two in-program codes like EM-Adult and EM-Peds, enter both separated by a comma.
Rotations that don't match (Electives, Research, External, etc.) are skipped — no quiz is auto-assigned to them.
| Name | Level | Specialty | Hospital | Start date | Status | Actions | |
|---|---|---|---|---|---|---|---|
| No residents in this year's roster yet. Use Import from Google Sheet names to pull in your current trainees, or Bulk paste from Excel. | |||||||
• Long format: Resident / Type / Date / Score / Max (one row per result)
• Wide format: Resident + a column per assessment (e.g. Quiz 1 (%), OSCE, Written Exam) — each column becomes an assessment type.
Make sure the sheet is shared with Anyone with the link.
R1, R2, R3) to fetch every level at once. The tab name becomes the resident's level label. For a hidden tab, enter its gid (the number after #gid= in its URL) instead.
| Resident | Level | Type | Score | % | Notes |
|---|---|---|---|---|---|
| No assessments loaded yet. Connect a Google Sheet or upload a CSV above. | |||||
Quiz 1 Final (%), OSCE, Written Exam). In wide mode, each column header becomes the assessment type and cell values are treated as percentages. When you list tab names above, the dashboard fetches each tab and tags every row with that tab's name as the resident's level. Preset types: Quiz, Written Exam, OSCE, Simulation, Case Presentation, Research, Chart Review, 360 Feedback — but any column name works.
Custom note
Sending emails...
Gmail API setup — step by step
- Go to Gmail API library → and click Enable.
- Go to OAuth consent screen →.
- User type: External (if first time).
- App name:
PD Dashboard - User support email + developer contact: your Gmail.
- Under Scopes, add:
.../auth/gmail.send - Under Test users, add your own Gmail address. Add any co-admins too.
- Go to Credentials →. Click + Create Credentials → OAuth client ID.
- Application type: Web application.
- Name:
PD Dashboard Web. - Authorized JavaScript origins: add
https://app.pdashboard.io - Authorized redirect URIs: leave empty (we use token flow, not auth code).
- Click Create.
- Copy the Client ID (looks like
1234567890-xxx.apps.googleusercontent.com) and paste it in the Client ID field in the dashboard, then click Save Client ID. - Click Connect Gmail → sign in → approve the Send email on your behalf permission.
- Done. Click 🚀 Send all selected via Gmail to send.
Email preview
| Resident | Level | Evals | H&PE | Pres/DDx | Activity | Punctuality | Overall | Status |
|---|
📅 Master annual rotation powers profile rotation strip + quiz matching
One row per resident, with the 13 block rotations across the year in columns (e.g. EM-KFMC, PEM-KFMC, Elective, Community). A leading index/number column is fine — the resident name is detected automatically, and title/level header rows (R4, R3…) are skipped. Loading this builds the rotation strip on each resident's profile and auto-matches quiz scores to the right block. Share it "Anyone with the link".
#gid= in that tab's URL) instead of its name.📎 Per-block schedule workbooks powers name lookup + per-block detail
A workbook with one tab per block (each tab lists residents by level with their rotation and shifts). Paste the workbook URL (shared "Anyone with the link"), then list the block tab names it contains. The lookup reads each tab you list and finds residents by name. Google won't serve hidden tabs by name — to read a hidden block, enter its gid (the number after #gid= in that block tab's URL) in the block-tab box instead of its name. Add one workbook per academic year if you keep them separate. Then search any name below to confirm whether — and in which block — they rotated with you (handy for rotators who aren't in your evaluation data).
Scores mapped from daily evaluations (/10) to ITER 1-4 scale. Knowledge-domain criteria can also use an exam score. Final Score is editable — override any value before auto-fill.
Console Script (Alternative Method)
If bookmarklet doesn't work: Open the ITER form in your browser → F12 → Console → Paste → Enter