Chrome extension · v0.1.0

Push grades to assignments Classroom refuses to update.

Google's API blocks grade writes on assignments created directly in the Classroom UI. This extension runs inside your own browser, no OAuth, no servers, no data leaves your machine.

Why this exists

Webapp handles the API path. This handles the rest.

Your Sheet
Roll, name, grades
Sheet2Classroom
Parses, matches, previews
Assignment our webapp creates
Pushed via Classroom API ✓

Drafts, backups, restorable for 30 days.

Assignment Classroom UI created
API refuses grade writes ✗

Every third-party tool hits this wall. Google's design choice.

Extension reroute
Pushed via your browser ✓

No API, no OAuth — same flow as the webapp.

Webapp · the easy 95%

Use the webapp.Pick a course, paste your sheet, map columns, push. Drafts by default. Backups for 30 days. Sign in with Google and you're done.

Extension · for the API-blocked 5%

Add the Chrome extension.Google's API refuses grade writes on assignments their own UI created — every third-party tool hits this wall. The extension acts as your browser, not as an API client. No OAuth, no servers.

What it looks like

Five screens. Two minutes.

Real screenshots from the extension popup.

  1. 1

    Paste a TSV grade range

    Open the extension on a Classroom assignment. Auto-detects identifier + grade columns from your header row.

    Paste a TSV grade range
  2. 2

    Preview every match against the live roster

    See exactly which student each grade lands on. Mismatches are flagged; nothing is guessed.

    Preview every match against the live roster
  3. 3

    Resolve unmatched rows from a dropdown

    Personal-Gmail student? Hidden email? Pick the right student from the roster, or skip the row.

    Resolve unmatched rows from a dropdown
  4. 4

    Click apply — grades stream in

    One save per student. The popup shows live progress. Don’t close the tab — the extension drives it.

    Click apply — grades stream in
  5. 5

    Done. Every grade landed.

    Refresh the assignment if you want to see them in Classroom’s own UI.

    Done. Every grade landed.
Install

One click.

Auto-updates from then on.

What it can see

Scoped to one domain. One tab at a time.

No OAuth, no servers, no analytics. Audit-friendly by design.

Only Classroom
Host permission scoped to https://classroom.google.com/*. No other domain. No <all_urls>.
Only the active tab
activeTab grants access only when you click the icon, only for that tab, only for the duration of that interaction.
Local storage only
storageremembers your last pasted range so you don't re-paste. Lives in chrome.storage.local, never synced.
No OAuth, no identity
Uses your existing Classroom session. Doesn't prompt for credentials, doesn't request a Google scope.
Stuck?

Common errors and fixes.

“Couldn’t read Classroom session tokens.”
The page loaded before our token reader was ready. Refresh the Classroom tab and try again. If it persists, sign out and back in — Google occasionally rotates session cookies.
“HTTP 401” or “HTTP 403” on save
Your session expired mid-run, or you're viewing a course you don't own. Reload the tab and retry. The extension only writes grades on courses where you're the teacher.
The grade looks stale when I click the student
Classroom's tab held a cached value. The extension runs a one-student nav-bounce after each apply. If the UI still shows old, hard-refresh (Cmd+Shift+R / Ctrl+Shift+R) — the server save itself succeeded.
My school blocks installs from the Chrome Web Store
Some managed Chrome deployments restrict extension installs by default. Ask your IT team to allowlist extension ID idfbgmnhophmipceffhacmdeabnppmlp— that's all they need to push it to your account.

Ready to fill the API gap?

Two minutes, no account, no servers. Uninstall anytime from chrome://extensions.

Stuck on install or seeing an error not above? Email support@sheet2classroom.app