This calendar auto-fetches your Toronto Programs sheet every time it loads, and again every 30 minutes while it stays open — the Apps Script keeps the sheet itself fresh every 6 hours, so between the two, this stays live with no manual step.
Show me how the Sheet gets set up (one-time)
1. Google Sheet with tabs named Programs, InternalEvents, and IshangaSchedule.
2. Programs row 1 headers: Title, Level, SubLevel, Cost, Price, Mode, Date, EndDate, Time, Venue, Link, Lat, Lng, EventKey — filled in automatically by the Apps Script.
3. InternalEvents and IshangaSchedule are created by running ensureInternalEventsSheet / ensureIshangaScheduleSheet once in the Apps Script editor.
4. Share → General access → Anyone with the link → Viewer (applies to the whole spreadsheet, all tabs).
5. Use each tab's own gviz/tq?tqx=out:csv&gid=... export link (the gid differs per tab) in the fields below.
Couldn't load the Programs sheet — check it's shared as "Anyone with the link → Viewer" and that the URL is the gviz CSV export link, not the normal edit link.
Works regardless of any browser sandbox restrictions: open your Sheet's published CSV link (or use Claude in Chrome to pull the site directly), select all, and paste the raw text below — CSV or JSON both work, auto-detected.
Show extraction prompt (for Claude in Chrome, or to hand to anyone helping)
Go to https://online.innerengineering.com/en/search — set the location filter to "Toronto, Ontario, Canada" and clear other filters so every program shows. Extract every program listing (aim for the next 6 months of listings, or as many as the page shows) into a JSON array. For each program use exactly this shape:
[{
"title": "string",
"level": "string (e.g. Inner Engineering, Inner Engineering Online, Hatha Yoga, Bhava Spandana, Samyama, Miracle of Mind / Free Session, Shoonya, Other)",
"cost": "free" or "paid",
"price": "string, e.g. $85 CAD, or empty string if free",
"mode": "online" or "in-person" or "hybrid",
"date": "YYYY-MM-DD (start date)",
"endDate": "YYYY-MM-DD (same as date if single day)",
"time": "string, e.g. 7:00 PM - 9:00 PM EST",
"venue": "string",
"link": "direct registration URL"
}]
Return ONLY the JSON array. No commentary, no markdown fences.
Paste CSV or JSON below:
Couldn't read that as CSV or JSON — check it includes the header row (Title, Level, Cost...) if it's CSV, or valid brackets if it's JSON.
Lets volunteers attach coordinator notes to synced programs, and lets anyone with the passcode add/edit/delete custom events (Core Team Meetings, Trainings, Satsangs). Both use the same Web App — deployed from the Apps Script that syncs this sheet (ask Claude for the setup section at the top of that file if you don't have it yet).
Web App URL (ends in /exec):
Shared passcode (must match SHARED_PASSCODE in the script):
Add Custom Event
For internal things this calendar should track that aren't on the Isha website — core team meetings, coordinator meetings, trainings, satsangs.