Populate Zoom Room resource calendar in Google from Blackbaud LMS schedule
- Your classroom assignments are reasonably up-to-date in the Blackbaud LMS
- You are using Google resource calendars to schedule your Zoom Rooms.
- You are using something (e.g. SchoolCal) to sync class schedule information into Google resource calendars.
- You are accessing the Blackbaud LMS with sufficient privileges to create advanced lists, see courses, etc.
- You are creating the
Schedule Zoom Rooms
sheet and script with a Google user with sufficient permissions to be able to update all of the affected resource calendars.
-
In SchoolCal, configure the template for your flow that syncs into your resource calendars to include the section's Blackbaud Group ID. (For example, the value for our
Description
field in the template is[GroupID={{Section.InternalClassId}}]
-
Define the Current Year Courses advanced list in the Blackbaud LMS.
-
Create the Schedule Zoom Rooms sheet in Google Sheets.
-
Import the advanced list into the
Current Year Courses
worksheet in the sheet. (Easiest way is to use Blackbaud-to-Google Lists.) -
Populate the
Resource Calendars
sheet. (Easiest way is to call the Google Calendar API:GET https://www.googleapis.com/calendar/v3/users/me/calendarList
as a user subscribed to all the relevant resource calendars). -
Copy the relevant/desired/all group IDs into the
Group ID
column of theZoom Rooms
worksheet (this is manual to preserve the linkage between Group ID and Zoom Room URL). -
Manually click through the bulletin boards of each course that has an associated resource claendar on the
Zoom Rooms
sheet and copy-and-paste in the courses Zoom Room URL. -
Clone this repository and install dependencies:
git clone git@github.com:groton-school/schedule-zoom-room.git cd schedule-zoom-room npm install
-
In the sheet, in the
Extensions
menu, open theApps Script
. -
Copy the project ID of the script:
https://script.google.com/u/0/home/projects/<project ID>/edit
-
Use
clasp
(included as a script dependency) to connect the cloned repo to the project and deploy the project into the script:npx clasp clone <project-id> npm run deploy
-
In the Google Cloud console, create a new project.
- Set up the OAuth consent screen. The only scope you need to add is
https://www.googleapis.com/auth/calendar
- Enable the Google Calendar API
- Copy the project number from the Project Dashboard.
- Set up the OAuth consent screen. The only scope you need to add is
-
In the script, visit the Project Settings and change the project from the default to the project number you copied from the Google Cloud Project.
-
Switch to the Editor and run
syncToResourceCalendars
. Give the script access to all the scopes that it requests.https://www.googleapis.com/auth/calendar
so that the script's OAuth token will have sufficient scope to list and update calendar events (in the resource calendars).https://www.googleapis.com/auth/spreadsheets
to access the spreadsheet of data (to which the script is attached)https://www.googleapis.com/auth/script.external_request
so the script can make external requests to the Google Calendar API (because it batches the requests, it needs to useUrlFetchApp
rather than the built-inCalendarApp
API).
-
Switch to the Triggers and schedule
syncToResourceCalendars
to run periodically (e.g. every day after SchoolCal updates the resource calendars).
- At the start of each term, the
Current Year Courses
will need to be updated (again, easy if you're using Blackbaud-to-Google Lists). The Group IDs column inZoom Rooms
will need to be updated afterwards to include any new Group IDs (shown in place of the column header if there are any missing). - At the start of each term, classes that have resource calendars but no Zoom Room URL will need to be updated manually by visiting their bulletin board (links and the field to update are both in
Zoom Rooms
).
This was previously a much more manual script that facilitated generating ICS files from teacher's schedules to be imported into the Google resource calendars. While there is still a fair bit of manual setup to make this work, the end result is both a) resilient to schedule changes, b) automatically syncing once setup, c) less dependent on the human involved being careful. All good things.
- The
heroku
branch is the initial version, designed to run on Heroku as a PHP-processed form. - The
google-app-engine
branch is a conversion and continuing development of theheroku
branch, designed to run as a PHP-processed form on Google App Engine.
Current development in the main
branch is in Typescript, compiled by clasp
into Google Apps Script attached to a Google Sheet.