[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Ready to go live with new BAPC?



Done. The system should now be live.

One change: I have created an address bapc admin gmail com to serve as the human point of contact. (It forwards to me.) Let's use that instead of benvlehmann gmail com in public-facing materials just so that it doesn't have to change when I move.

I have also attached the current versions of the user guide and scripting documentation. The user guide is attached in both markdown and HTML format.

Cheers,
Ben

Boston Area Physics Calendar (BAPC) â?? User Guide

This guide is for anyone who wants to submit an event to the BAPC or receive the weekly listing. No account or web access is requiredâ??everything works by email.


Submitting an event

Send an email to the BAPC submission address (your list administrator will provide it; it is also shown at the bottom of each weekly digest).

Important: The subject line must contain â??Createâ?? (case-insensitive; e.g. â??Createâ?? or â??Create: colloquiumâ??). Messages whose subject doesnâ??t include â??Createâ?? are not processed as new submissions. (Replace, Delete, Cancel, and Uncancel use different subject lines; see below.)

Required format: Use the structured format in the body of your email. You must include Date: and Time:. Location:, Event:, Speaker:, Title:, and Abstract: are optional. Order doesnâ??t matter, but the spelling of those labels does.

Date: Friday, December 13, 2024
Time: 3:00 PM
Location: MIT Room 4-270
Event: Colloquium
Speaker: Jane Smith (Harvard)
Title: Dark Matter Searches at the LHC
Abstract: We present new results from...

Zoom link: https://example.com/meeting

What happens after you submit

Tip: Submit as early as you can. The digest is sent once a week (typically Friday afternoon). Events that start after that mailing wait until the following weekâ??s digest; nearer-term events can also trigger a list update (see above).

Note: New submissions are only accepted from senders whose email address ends with .edu (e.g. you mit edu). If your institution uses a different domain, contact the list administrator.


Modifying or removing an event

You can change or remove an event by email using the BAPC ID from your confirmation email in the subject line (e.g. Replace BAPC-m5x2k3a7b2). Anyone who knows the ID can perform these actions unless your list administrator has enabled sender authorization (only the original submitter or an administrator may modify events).

What you want to doSubject line (case-insensitive)Body
Replace the event with new detailsReplace BAPC-##### (use your eventâ??s ID, e.g. Replace BAPC-m5x2k3a7b2)One event in the same structured format (Date:, Time:, Location:, Event:, Speaker:, Title:, Abstract:, etc.)
Delete the event from the calendarDelete BAPC-#####Empty or any text (ignored)
Cancel the event (mark as cancelled but leave on calendar)Cancel BAPC-#####Empty or any text (ignored)
Uncancel a previously cancelled eventUncancel BAPC-#####Empty or any text (ignored)

Receiving the weekly digest

If youâ??re on the BAPC mailing list, youâ??ll get one weekly digest email (usually Friday afternoon). It lists all events on the BAPC calendar for the following calendar week (Sunday through Saturday), grouped by date.


Optional: Subscribe to the calendar

If your institution allows it, you can add the BAPC Google Calendar to your own calendar (e.g. Google Calendar, Outlook). Youâ??ll then see BAPC events alongside your other events without waiting for the digest.


If something goes wrong


For administrators

If you manage the BAPC automation, set ADMIN_EMAIL in the script configuration to your address.

Look up BAPC IDs for upcoming events: Send an email to the submission address with subject Status (body ignored). You will receive a reply in the same thread listing all future calendar events, each with its BAPC ID, title, time, location, and submitter (when known). Use those IDs in Replace BAPC-#####, Delete BAPC-#####, Cancel BAPC-#####, or Uncancel BAPC-##### subjects to modify events.


Summary

I want toâ?¦What to do
Submit an eventEmail the submission address with subject containing Create and the structured format in the body. (.edu addresses only.)
Replace an eventEmail with subject Replace BAPC-##### and the new event in the body (same format).
Delete an eventEmail with subject Delete BAPC-#####.
Cancel an eventEmail with subject Cancel BAPC-#####.
Uncancel an eventEmail with subject Uncancel BAPC-#####.
Get the weekly listingBe on the BAPC mailing list; youâ??ll receive the digest automatically, plus BAPC Update emails for late additions, corrections, and cancellations before the next digest.
See events in my calendarUse the subscription link at the bottom of the digest, or ask the list administrator.
Fix or ask about somethingContact the BAPC list administrator.

The submission address, calendar subscription link (when configured), and a link for each event are included in each weekly digest.

# Boston Area Physics Calendar (BAPC) â?? User Guide

This guide is for anyone who wants to **submit an event** to the BAPC or **receive** the weekly listing. No account or web access is requiredâ??everything works by email.

---

## Submitting an event

Send an email to the BAPC submission address (your list administrator will provide it; it is also shown at the bottom of each weekly digest).

**Important:** The **subject line must contain â??Createâ??** (case-insensitive; e.g. â??Createâ?? or â??Create: colloquiumâ??). Messages whose subject doesnâ??t include â??Createâ?? are not processed as new submissions. (Replace, Delete, Cancel, and Uncancel use different subject lines; see below.)

**Required format:** Use the **structured format** in the **body** of your email. You must include **Date:** and **Time:**. **Location:**, **Event:**, **Speaker:**, **Title:**, and **Abstract:** are optional. Order doesnâ??t matter, but the spelling of those labels does.

```
Date: Friday, December 13, 2024
Time: 3:00 PM
Location: MIT Room 4-270
Event: Colloquium
Speaker: Jane Smith (Harvard)
Title: Dark Matter Searches at the LHC
Abstract: We present new results from...

Zoom link: https://example.com/meeting
```

- **Date** and **Time** are required.
- **Date:** Use a full date (e.g. â??Friday, December 13, 2024â?? or â??December 13, 2024â??). If you include the weekday, it must match the date. Past dates are rejected.
- **Time:** Only the following formats are supported; any other format will be rejected.
  - **Single time** (event duration is then **1 hour by default**): `3:00 PM`, `3pm`, `15:00`. Use hour (1â??12 with am/pm, or 0â??23 in 24-hour style), optional `:minutes`, optional space and am/pm.
  - **Time range** (explicit start and end): `3:00 PM - 4:30 PM`, `15:00 - 16:30`, `3:00 PM to 4:30 PM`. Use a hyphen, en dash, minus sign, or the word â??toâ?? between the two times; the end time must be after the start time.
- **Location**, **Event** (event type or series, e.g. â??Colloquiumâ??), **Speaker**, **Title** (talk title), and **Abstract** are optional.
- **Calendar title:** The event title shown on the calendar and in the digest is built from **Event**, **Speaker**, and **Title** (not from **Abstract**). Examples when all three are present: `[Colloquium] Jane Smith: Dark Matter Searches at the LHC`. If only some are present, the title is shortened (e.g. `Jane Smith: Dark Matter Searches`, `Colloquium`, or `Untitled event` if none are given).
- **Abstract** may span multiple lines; everything after `Abstract:` until the next **field label** is treated as the abstract. A field label is a line that starts with one or two words followed by a colon (e.g. `Zoom link:`). The abstract is stored in the calendar event description (not in the title). Whether abstracts appear in the weekly digest email depends on list configuration.
- **Extra fields** (e.g. `Zoom link:`, `Registration:`, `Pizza:`) use the same one- or two-word label format. They are not parsed as Date/Time/etc., but are kept in the event note on the calendar. Put them after the abstract (or anywhere outside the abstract block).
- Avoid starting a line in your abstract with text that looks like a field label (one or two words and a colon), or the abstract may end early at that line.
- Submissions that donâ??t follow this format are marked for manual review and will not be added to the calendar until corrected.

---

## What happens after you submit

- Your email is processed automatically (usually within an hour).
- The event is added to the BAPC calendar.
- It will appear in the **next weekly digest** email (see below).
- If the event starts **before the next weekly digest** is sent, the mailing list also receives a separate **BAPC Update** email announcing the late addition (with the new event details and a summary of upcoming events).
- If the system is configured to notify submitters, you will receive a **confirmation email** that includes a **BAPC ID** (e.g. `BAPC-m5x2k3a7b2`) for each event. **Save this ID**â??you need it to replace, delete, cancel, or uncancel the event later (see below).
- If the system canâ??t parse your submission, an administrator may contact you to fix it; you can then resubmit.

**Tip:** Submit as early as you can. The digest is sent once a week (typically Friday afternoon). Events that start after that mailing wait until the following weekâ??s digest; nearer-term events can also trigger a list update (see above).

**Note:** New submissions are only accepted from senders whose email address ends with **.edu** (e.g. `you mit edu`). If your institution uses a different domain, contact the list administrator.

---

## Modifying or removing an event

You can change or remove an event by email using the **BAPC ID** from your confirmation email in the subject line (e.g. `Replace BAPC-m5x2k3a7b2`). Anyone who knows the ID can perform these actions unless your list administrator has enabled **sender authorization** (only the original submitter or an administrator may modify events).

| What you want to do | Subject line (case-insensitive) | Body |
|---------------------|----------------------------------|------|
| **Replace** the event with new details | `Replace BAPC-#####` (use your eventâ??s ID, e.g. `Replace BAPC-m5x2k3a7b2`) | One event in the same structured format (Date:, Time:, Location:, Event:, Speaker:, Title:, Abstract:, etc.) |
| **Delete** the event from the calendar | `Delete BAPC-#####` | Empty or any text (ignored) |
| **Cancel** the event (mark as cancelled but leave on calendar) | `Cancel BAPC-#####` | Empty or any text (ignored) |
| **Uncancel** a previously cancelled event | `Uncancel BAPC-#####` | Empty or any text (ignored) |

- **Keep your BAPC ID private**â??it is the only credential needed to modify the event (when sender authorization is off). The ID is not shown on the public calendar; it appears only in your confirmation email.
- For **Replace**, the body must be exactly one event in the same structured format as a new submission. If the body doesnâ??t parse correctly, the message is marked for manual review.
- **Replace** or **Cancel** on an upcoming event (before the next weekly digest is sent) may trigger a separate **update email** to everyone on the BAPC mailing list, so subscribers see corrections or cancellations without waiting for Friday. **Delete** does not send a list update (only a confirmation to you).

---

## Receiving the weekly digest

If youâ??re on the BAPC mailing list, youâ??ll get one **weekly digest email** (usually Friday afternoon). It lists all events on the BAPC calendar for the **following calendar week** (Sunday through Saturday), grouped by date.

- Between digests, you may receive a **BAPC Update** email when someone **adds**, **corrects**, or **cancels** an event that starts before the next weekly mailing. New-event updates include the late addition and a summary of upcoming events.
- No sign-up is needed beyond being on the list.
- The digest is plain text and works in any email client and on locked-down networks.
- Each event in the digest includes a **link to that event** (opens the event in Google Calendar in a browser). Use this to see full details. Use the **BAPC ID** from your confirmation email for Replace/Delete/Cancel/Uncancel.

---

## Optional: Subscribe to the calendar

If your institution allows it, you can add the BAPC Google Calendar to your own calendar (e.g. Google Calendar, Outlook). Youâ??ll then see BAPC events alongside your other events without waiting for the digest.

- The digest email includes a **subscription link** at the bottom (when configured by the administrator). Use that link to add the BAPC calendar in one click. If no link is shown, ask the list administrator for the calendar link or ID.
- Calendar subscription is optional; email is enough to stay informed.

---

## If something goes wrong

- **My event didnâ??t appear in the digest.**  
  Submissions are processed periodically; it may show up in the next digest. If it still doesnâ??t appear, your message may have been unparseableâ??contact the list administrator and consider resubmitting using the structured format above. If you use a non-.edu address, new submissions are not accepted; contact the administrator.

- **I made a mistake in my submission.**  
  If you have the **BAPC ID** from your confirmation email, send an email with subject **Replace BAPC-#####** (use your ID) and put the corrected event in the body using the same structured format. Otherwise, ask the administrator to remove or correct the original.

- **I need to cancel or remove my event.**  
  Send an email with subject **Cancel BAPC-#####** to mark it cancelled (title will be prefixed with â??CANCELLED: â??), or **Delete BAPC-#####** to remove it from the calendar. Use the BAPC ID from your confirmation email.

- **I cancelled an event by mistake.**  
  Send an email with subject **Uncancel BAPC-#####** to remove the â??CANCELLED: â?? prefix and restore the normal title.

- **I need to submit at the last minute.**  
  You can submit anytime. Your event will be added to the calendar. If it starts before the next weekly digest, the mailing list also gets a **BAPC Update** announcing the late addition (plus an upcoming-events summary); otherwise it appears in the next weekly digest.

---

## For administrators

If you manage the BAPC automation, set **`ADMIN_EMAIL`** in the script configuration to your address.

**Look up BAPC IDs for upcoming events:** Send an email to the submission address with subject **`Status`** (body ignored). You will receive a **reply in the same thread** listing all future calendar events, each with its **BAPC ID**, title, time, location, and submitter (when known). Use those IDs in `Replace BAPC-#####`, `Delete BAPC-#####`, `Cancel BAPC-#####`, or `Uncancel BAPC-#####` subjects to modify events.

- Only mail from **`ADMIN_EMAIL`** is honored; other sendersâ?? `Status` messages are ignored.
- New submissions can also include the BAPC ID in the admin notification email when that option is enabled.
- Events created before BAPC IDs were introduced may show â??no BAPC IDâ??; edit those directly in Google Calendar.

---

## Summary

| I want toâ?¦              | What to do                                                                 |
|------------------------|----------------------------------------------------------------------------|
| Submit an event        | Email the submission address with subject containing **Create** and the structured format in the body. (.edu addresses only.) |
| Replace an event       | Email with subject **Replace BAPC-#####** and the new event in the body (same format). |
| Delete an event        | Email with subject **Delete BAPC-#####**. |
| Cancel an event        | Email with subject **Cancel BAPC-#####**. |
| Uncancel an event      | Email with subject **Uncancel BAPC-#####**. |
| Get the weekly listing | Be on the BAPC mailing list; youâ??ll receive the digest automatically, plus **BAPC Update** emails for late additions, corrections, and cancellations before the next digest. |
| See events in my calendar | Use the subscription link at the bottom of the digest, or ask the list administrator. |
| Fix or ask about something | Contact the BAPC list administrator.                                 |

The submission address, calendar subscription link (when configured), and a link for each event are included in each weekly digest.
# BAPC Automation â?? Scripts Setup

This folder contains the Google Apps Script code for the Boston Area Physics Calendar (BAPC) automation. Events are submitted by email, processed into a Google Calendar, and a weekly digest is sent to the listserv.

## One-time setup

### 1. Gmail account

- Create a Gmail account for submissions (e.g. `bapc submit gmail com`; Gmail disallows hyphens in addresses).
- Enable 2FA and set a recovery email/phone.
- This account will own the Apps Script project and the calendar.

### 2. Google Calendar

- In Google Calendar, create a new calendar for BAPC events.
- In **Settings** â?? **Integrate calendar** â?? **Calendar ID**, copy the ID (e.g. `xxxxx group calendar google com`).
- Optionally share the calendar read-only with subscribers.

### 3. Apps Script project

- Go to [script.google.com](https://script.google.com).
- Create a new project (same Google account as the Gmail/Calendar).
- In the project, create one script file per `.gs` file in the `appsscript/` folder:
  - `Config.gs`
  - `EmailParser.gs`
  - `CalendarService.gs`
  - `ProcessEmails.gs`
  - `WeeklyDigest.gs`
  - `DigestSchedule.gs`
  - `EventUpdateNotice.gs`
  - `AdminStatus.gs`
- Copy-paste the contents of each file from `appsscript/` into the matching file in the script editor.
- **V8 runtime:** The project must use the V8 runtime (Rhino is deprecated). If you see a deprecation warning: open **Project Settings** (gear icon) and enable **Chrome V8 runtime**. If you use clasp, `appsscript.json` in this repo already sets `runtimeVersion: "V8"`; run `clasp push` to apply it.

### 4. Enable Advanced Calendar API

In the Apps Script editor: **Extensions** â?? **Apps Script services** (or **+** next to â??Servicesâ??) â?? add **Google Calendar API** (v3). The project uses only the Advanced Calendar API for calendar access (no built-in CalendarApp).

### 5. Set configuration

Edit `Config.gs` in the script editor and set:

- `BAPC_CALENDAR_ID` â?? your BAPC calendar ID.
- `DIGEST_RECIPIENT` â?? the BAPC listserv address (e.g. `bapc lists example edu`).
- `DIGEST_SUBJECT_PREFIX` â?? subject line prefix for the weekly digest.
- `DIGEST_WEEKDAY`, `DIGEST_HOUR`, `DIGEST_MINUTE`, `DIGEST_TIMEZONE` â?? when the weekly digest runs (must match the `sendWeeklyDigest` trigger). Used to decide whether Create/Replace/Cancel sends a list update.
- `SEND_LIST_UPDATE_ON_CHANGE` â?? if `true`, email `DIGEST_RECIPIENT` on successful Create/Replace/Cancel when the event starts before the next digest (default `true`). Create notices include an upcoming-events summary (from now through the end of the next digest Sunâ??Sat week).
- `UPDATE_NOTICE_SUBJECT_PREFIX` â?? subject prefix for list update emails (default `BAPC Update`).
- `CALENDAR_SUBSCRIPTION_LINK` â?? full URL to subscribe to the BAPC calendar (included in the digest footer). From Calendar settings â?? Integrate calendar, or the web view link (e.g. `https://calendar.google.com/calendar/u/0?cid=...`). Leave empty to use generic text instead.
- `ADMIN_EMAIL` â?? admin address for unparseable submission alerts, successful-submission copies (with BAPC IDs), the **Status** command, and authorized modifications when `REQUIRE_SENDER_AUTHORIZATION_FOR_MODS` is `true`. From this address, email subject **Status** to the submission inbox to receive an in-thread reply listing all upcoming events with their BAPC IDs.
- `SUBMIT_EMAIL` â?? the submission address (e.g. `bapc submit gmail com`), used in the digest footer.
- `SUBJECT_FILTER_WORD` â?? subject must contain this phrase (case-insensitive) for **new submissions**. Default `Create`. Replace/Delete/Cancel/Uncancel use subject lines like `Replace BAPC-#####`, `Delete BAPC-#####`, `Cancel BAPC-#####`, `Uncancel BAPC-#####` and are handled separately.
- `REQUIRE_EDU_DOMAIN` â?? if `true`, only senders from `.edu` domains can submit new events.
- `REQUIRE_SENDER_AUTHORIZATION_FOR_MODS` â?? if `true`, Replace/Delete/Cancel/Uncancel require the sender to be the original submitter or `ADMIN_EMAIL`; if `false` (default), knowing the BAPC ID in the subject is sufficient.
- `LABEL_PROCESSED` / `LABEL_UNPARSEABLE` â?? optional; defaults are `BAPC/Processed` and `BAPC/Unparseable`. Labels are created automatically if they donâ??t exist.

### 6. Triggers

In the Apps Script editor: **Triggers** (clock icon) â?? **Add Trigger**.

1. **Process submissions (e.g. every hour or every minute)**  
   - Function: `processIncomingSubmissions`  
   - Event: Time-driven â?? Hour timer â?? Every hour (or Minute timer if you use per-minute processing)  
   - Processes only messages whose subject matches one of: **Status** (admin only), **Create** (new submission), **Replace BAPC-#####**, **Delete BAPC-#####**, **Cancel BAPC-#####**, **Uncancel BAPC-#####** (case-insensitive). Other unread threads in the inbox are marked read and skipped (so they are not re-scanned every run).

2. **Weekly digest (Friday afternoon)**  
   - Function: `sendWeeklyDigest`  
   - Event: Time-driven â?? Week timer â?? Friday, 4pmâ??5pm (choose your time).

Save and authorize the project when prompted (calendar and Gmail access).

### 7. Optional: Gmail labels and filters

- You can create Gmail labels `BAPC/Processed` and `BAPC/Unparseable` manually; the script will create them if missing.
- Optionally create a filter so incoming mail to the submission address gets a label like `BAPC` for easier filtering.

## Adding multiple editors

- In the Apps Script project: **Share** â?? add people as **Editor**.
- They can edit scripts and triggers; keep Gmail/Calendar credentials (the account that owns the project) documented in a secure place for handoff.

## Optional: Deploy with clasp

[clasp](https://github.com/google/clasp) lets you push and pull Apps Script code from the command line. The script files live in `appsscript/`, so clasp needs a **project link** (`.clasp.json`) and **rootDir** set so `clasp push` sends that folder.

**If you see "Project settings not found"** when running `clasp push`, you need to create or fix `.clasp.json` as below.

### First-time clasp setup (choose one)

**Option A â?? Create a new Apps Script project from this repo**

From the `BAPC` folder:

1. Install and log in: `npm install -g @google/clasp` then `clasp login`
2. Create the project: `clasp create --type standalone --title "BAPC Automation"`
3. Open the new `.clasp.json` and add a line so it looks like this (keep your real `scriptId`):

   ```json
   {
     "scriptId": "abc123...",
     "rootDir": "appsscript"
   }
   ```

   `rootDir` tells clasp to push the contents of `appsscript/` (your `.gs` files and `appsscript.json`), not the repo root.
4. Push: `clasp push`

**Option B â?? You already have the Apps Script project (e.g. created in the browser)**

1. Get the script ID from the project URL: `https://script.google.com/d/<SCRIPT_ID>/edit`
2. Copy the example file: `cp .clasp.json.example .clasp.json`
3. Edit `.clasp.json` and replace `YOUR_SCRIPT_ID_HERE` with your script ID
4. From the `BAPC` folder: `clasp push`

### After setup

- **Push:** From `BAPC`, run `clasp push` to upload everything in `appsscript/`.
- **Pull:** `clasp pull` overwrites local `appsscript/` with the projectâ??s current files; use with care.
- Config (e.g. `BAPC_CALENDAR_ID`) is only in the script editor; clasp syncs file contents only.

## Gmail quotas (consumer `@gmail.com` accounts)

The script runs as the **submission Gmail account** (the project owner). Two limits matter:

| Limit | Consumer (`@gmail.com`) | What counts |
|-------|-------------------------|-------------|
| Email read/write | 20,000 / day | Each `GmailApp.search`, `getMessages`, `markRead`, `addLabel`, etc. Loading a thread/message counts; calling `getSubject()` / `getPlainBody()` on an already-loaded message generally does not. |
| Email recipients (send) | 100 / day | Each `GmailApp.sendEmail` / `MailApp.sendEmail` **recipient** (admin alerts, submitter confirmations, digest, list updates). |

Quotas use a **rolling 24 hours from the first Gmail/Mail call** in the windowâ??not midnight and not â??since you deployed a fix.â?? After a burst (e.g. re-scanning the same unread failure notifications every minute), you can still see `Service invoked too many times for one day: gmail` on `GmailApp.search` even when the inbox is empty; every trigger fails on the first Gmail call until the window resets.

**Checks:** Apps Script â?? **Executions** (how often `processIncomingSubmissions` runs; failures at line 12 mean quota is already exhausted). Run `logQuotaDiagnostics()` from the editor for unread count and remaining **send** quota (`MailApp.getRemainingDailyQuota()`).

**Production:** Use an **hourly** trigger, not every minute. Keep `NOTIFY_*` off during heavy testing. The processor skips `search` when inbox unread count is 0 and scopes search to `SUBMIT_EMAIL` when configured.

## Testing

- **Parser:** In the script editor, run `testEmailParser()`. Check the **Execution log** for parsed events and unparseable cases.
- **Quotas:** Run `logQuotaDiagnostics()` and check **Executions** if you hit Gmail quota errors.
- **Process flow:** Send test emails to the submission address using the structured format (one valid, one invalid or gibberish). Run `processIncomingSubmissions()` once from the editor. Check the calendar and Gmail labels.
- **Digest:** Temporarily set `DIGEST_RECIPIENT` to your own email. Run `sendWeeklyDigest()`. Confirm the digest looks correct, then set `DIGEST_RECIPIENT` back to the listserv.
- **List updates:** With `DIGEST_RECIPIENT` set to your email, **Create**, **Replace**, or **Cancel** a test event whose start is before the next configured digest (`DIGEST_WEEKDAY` / `DIGEST_HOUR` in `DIGEST_TIMEZONE`). Confirm you receive a `BAPC Update` message; for Create, confirm it includes an upcoming-events section. **Delete** should not send one.

## File summary

| File               | Purpose                                              |
|--------------------|------------------------------------------------------|
| `Config.gs`        | Calendar ID, listserv, digest schedule, list-update flags, subscription link, admin email, labels, submit email, subject filter, .edu requirement, `DIGEST_INCLUDE_ABSTRACT` |
| `EmailParser.gs`   | Parse Date/Time/Location/Event/Speaker/Title/Abstract; compose calendar summary; append Abstract to description; HTML-to-plaintext |
| `CalendarService.gs` | Advanced Calendar API only: create events (with BAPC-ID and submitter in extendedProperties), find by BAPC-ID, replace/delete/cancel/uncancel; duplicate check by start + title |
| `DigestSchedule.gs` | Next digest datetime and eligibility for mailing-list update emails |
| `EventUpdateNotice.gs` | Format and send Create/Replace/Cancel update emails to `DIGEST_RECIPIENT` (Create includes upcoming summary) |
| `AdminStatus.gs`    | Admin **Status** command: list future calendar events with BAPC IDs; in-thread reply to `ADMIN_EMAIL` |
| `ProcessEmails.gs`  | Time-driven: read mail â?? route by subject (Status / Create / Replace/Delete/Cancel/Uncancel BAPC-#####) â?? parse â?? calendar ops â?? list updates â?? label; .edu check for new submissions; optional sender auth for modifications (`REQUIRE_SENDER_AUTHORIZATION_FOR_MODS`) |
| `WeeklyDigest.gs`   | Friday: following Sunâ??Sat week from calendar (Advanced API) â?? digest email to listserv; shared listing helpers for late-addition notices; optional abstracts via `DIGEST_INCLUDE_ABSTRACT` |

**Time format (structured submissions):** The `Time:` field accepts either a single time (event duration defaults to **1 hour**) or a range: `3:00 PM - 4:30 PM`, `3:00 PM â?? 4:30 PM`, or `3:00 PM to 4:30 PM`. Single times: e.g. `3:00 PM`, `3pm`, `15:00`. No other formats are accepted. See `EmailParser.gs` and `BAPC_USER_GUIDE.md` for the full spec.

See also `bapc_automation_plan.md` in this repo for background and design.


On Sep 8, 2026, at 10:06, Ken Olum <kdo cosmos phy tufts edu> wrote:

Hi, Ben.  Here is the message I propose to send to the bapc list.  If it
seems OK, please make sure there are no test events in the calendar
and change the system to post the digest and late/canceled/modified
events to bapc cosmos phy tufts edu, and I'll send this out.

                                        Ken

----------------------------------------------------------------------

Hi, everyone.  Thanks to lots of great work by Ben Lehmann, we have
automated the bapc.  To post events, instead of sending email to
bapc-events, please email the automated system at bapc submit gmail com,
following the instructions at https://cosmos.phy.tufts.edu/bapc.html .
The system will then send a weekly digest to this mailing list,
bapc cosmos phy tufts edu.  You can also look at the Google calendar, or
incorporate it into your calendar, by going to
https://calendar.google.com/calendar/u/0/embed?src="" group calendar google com

To create an event, you must be sending from a ".edu" email address.
If this causes a problem, let me and Ben <benvlehmann gmail com> know,
and we'll see what we can do.

If you have to submit an event after the calendar has gone out, or to
cancel or modify an event, please again follow the instructions at
https://cosmos.phy.tufts.edu/bapc.html.  The system will then distribute
a notice of your event or your changes to everyone on the mailing list.
To cancel or modify an event you can send from any email address, but
you'll need the "BAPC ID" that the system sends you in response to your
original posting.

If the automated system fails (but please give it a few minutes to
process your request) or can't deal with what you need to do, you can
send directly to bapc cosmos phy tufts edu from any email subscribed to
that list and your message will go out to everyone.  But please use the
automated system if you can.

Ken