All Insights
March 2026

Sunday Coffee & Code: From Google Sheets to a working web app in Google AI Studio

By Steve Harris

Todayโ€™s experiment was taking the Google Sheets/App Script and Google Cloud Run solution Iโ€™d already built and seeing how far I could push it into a fuller web app using ๐—š๐—ผ๐—ผ๐—ด๐—น๐—ฒ ๐—”๐—œ ๐—ฆ๐˜๐˜‚๐—ฑ๐—ถ๐—ผ ๐—•๐˜‚๐—ถ๐—น๐—ฑ (and of course learn about ๐—•๐˜‚๐—ถ๐—น๐—ฑ in the process. I started by having Gemini create a PRD from the Clou Run version (with HTML and Vision scan fall back), and used that in AI Studio to generate a more complete app. ๐—ง๐—ต๐—ฒ๐—ป ๐—ฐ๐—ฎ๐—บ๐—ฒ ๐˜๐—ต๐—ฒ ๐—ฑ๐—ฒ๐—ฏ๐˜‚๐—ด๐—ด๐—ถ๐—ป๐—ด. Spent time letting the agent try to fix the APIFlash usage itself - I gave up waiting after 3 attempts and gave it a working example - was fine after that. One feature I did like: when running the code in Studio, it caught an error and offered a ๐—™๐—ถ๐˜… button. That was cool. Next was a Google Gemini API key problem. Interestingly, it responded by adding more logging to expose the underlying error, which was a sensible approach. It looked like secret handling was the issue, so I suggested it work around it by creating a new variable and pasting the key directly. Not as elegant as selecting a project and a secret, but effective. GMail integration needed a few more pieces: extra keys, a Google OAuth 2 Web App, callback URLs, and a new Client ID and Client Secret. The most persistent issue was the app not reliably recognising that I had already connected my Google account. After several attempts, I asked for more logging so I could inspect console messages in Chrome. That led me into watching cookies and session IDs in F12, which felt a bit less ๐˜ญ๐˜ฐ๐˜ธ-๐˜ค๐˜ฐ๐˜ฅ๐˜ฆ/๐˜ฏ๐˜ฐ-๐˜ค๐˜ฐ๐˜ฅ๐˜ฆ than advertised. In the end, It was eventually fixed and the account connection flow worked much like the Google Sheets version. ๐—ฅ๐—ฒ๐˜€๐˜‚๐—น๐˜: a working basic web app for website scanning and email drafting with a reasonable GUI rather than a batch job or App Script (screenshots attached). One other observation: the app initially used Vision to scan the test site. It did reasonably well, but not as accurately as an HTML scan. Since Vision was only meant as a fallback, I switched to HTML scan with Vision fallback - and that worked a treat. All in all, about 3 hours to get to a working app. A few reflections: โ€ข ๐—š๐—ผ๐—ผ๐—ด๐—น๐—ฒ ๐—ฆ๐—ต๐—ฒ๐—ฒ๐˜๐˜€ + ๐—”๐—ฝ๐—ฝ ๐—ฆ๐—ฐ๐—ฟ๐—ถ๐—ฝ๐˜ was the easiest, but limited by the 6-minute runtime. โ€ข ๐—š๐—ผ๐—ผ๐—ด๐—น๐—ฒ ๐—–๐—น๐—ผ๐˜‚๐—ฑ ๐—ฅ๐˜‚๐—ป batch job was simple and robust running in the background. โ€ข ๐—š๐—ผ๐—ผ๐—ด๐—น๐—ฒ ๐—”๐—œ ๐—ฆ๐˜๐˜‚๐—ฑ๐—ถ๐—ผ ๐—•๐˜‚๐—ถ๐—น๐—ฑ gave the nicest UI, but also the most complexity - which makes sense with a React front end. ๐—ง๐—ผ๐—ฑ๐—ฎ๐˜†โ€™๐˜€ ๐˜๐—ฎ๐—ธ๐—ฒ๐—ฎ๐˜„๐—ฎ๐˜†๐˜€: the shiny interface is great, but the complexity doesnโ€™t disappear - it just moves around (surprise, surprise); also you still need architectural and technical awareness to do anything mildly complex.

Want to Discuss This Topic?

Steve is always happy to have a direct conversation.