Why I built Sheet2Classroom in a weekend
A founder story. Why a TA grading problem turned into a product, what shipped in 48 hours, and where researxr fits in.
The short version: I was a TA, I had 51 midterms to grade, I had a Google Sheet with the grades in column D, and I had a Google Classroom assignment waiting for them. Merging those two things is supposed to be one click. It was fifty-one clicks. I got annoyed. Forty-eight hours later this site was live.
Saturday, 9:47 AM — the trigger
I was halfway through entering grades one at a time into Classroom when I realised I'd mis-typed someone's score and needed to scroll back through the student list to find them. Classroom's grading UI is designed for "grade one student as you look at their submission," which is great for essays and terrible for numeric tests where the marking happened on paper and already lives in a sheet.
I looked for an import button. There is one — it accepts a CSV with a specific header format. I tried it. It rejected half my rows because one student had a percent sign after their grade and another had written "85/100". I tried again after cleaning the CSV. It rejected rows where the email didn't exactly match the one Classroom had for that student. I gave up and went back to single-click entry.
Saturday, 10:30 AM — the Apps Script detour
My first instinct was Apps Script. Classroom's API is officially available inside Apps Script, so "write a script that reads my sheet and posts to Classroom" should work in fifteen minutes. It almost did — I had a working prototype by lunch that handled one specific sheet format and one specific assignment.
Then I tried to generalize it. That's where Apps Script stopped being the right tool:
- UI options are
HtmlServiceor the sidebar builder. Both feel like 2012. - Quotas are shared across the account. A teacher who runs my script alongside their other scripts hits the URL-fetch limit quickly.
- Distribution means copy-pasting a script into every teacher's account, or publishing a Workspace add-on (which requires its own review process).
- Apps Script runs as the user. That's nice for privacy, but it meant every teacher would see scary "this script wants permission to access all your Drive files" warnings because Apps Script can't narrow scopes the way a proper web app can.
I scrapped it around 3 PM.
Saturday, 4 PM — Sunday night — the real build
Next.js 16, NextAuth v5, the googleapis SDK, Vercel. I spent Saturday evening on Google OAuth and the first two wizard steps (course picker, sheet paste). Sunday was everything else: column mapping, grade parsing, the preview table, the actual push to Classroom, a rudimentary restore feature.
A few design choices from that weekend that survived:
- Drafts by default.I'd already panicked once from a typo-grade going live. The Classroom API separates
draftGradefromassignedGrade. Wiring the default to draft was two lines of code and a big reduction in anxiety. - Backup before overwrite. Every push captures the existing state so the teacher can restore. I built this after accidentally pushing the wrong column on my own test run.
- No Drive scope. See this post for the full reasoning — short version, the teacher pastes a sheet URL, we only read that one file.
- Name-based fallback matching. Half the students in my own classes signed in with personal Gmail accounts, whose email the API hides. I needed a fallback that worked without extra scopes. It was either this or harassing students to switch accounts.
Monday — the first three real users
I shared the link with three other TAs at my institution. The first one tried it with a sheet that had a merged-cell header and came back with a bug report within eleven minutes. The second one tried it with a letter-grade column (A, B+, C−) that I hadn't planned for and I pushed a grade-parser update by Monday night. The third one imported 138 grades into three assignments in fifteen minutes and then emailed me asking if they could pay for it.
That email is why this is a product and not a gist.
Where researxr fits in
Sheet2Classroom is the first thing I've shipped under researxr, a small studio I'm building for education-adjacent tools that are too niche to be venture-fundable but too useful to not exist. The thesis is that classroom workflows are full of 50-click problems that never get fixed because the market for any one of them is too small to build a company around — but a studio can ship five of them a year and each one makes a few hundred teachers' lives measurably easier.
That's the direction. Sheet2Classroom itself is staying free (see the FAQ on the homepage for the "why"). Future researxr tools may or may not be.
What's next
Google OAuth verification is in review as of this writing — that unlocks the app for teachers outside the initial test group. Once verified I'll open the waitlist more broadly and start shipping the backlog: push templates, re-run last push, grade transformations (curve, scale, pass/fail), and an Apps Script alternative for folks who really do want to stay inside the sheet.
If you're a teacher who wants to try it now, the landing pagehas a waitlist form. If you're an IT admin deciding whether to whitelist it, the scope post is the one to read. If you're another solo dev staring at a 50-click problem at your own institution, go build the fix. A weekend is all it takes.