Skip to content
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"workspaces": [
"packages/br-cal",
"packages/br-script",
"packages/cal-to-sheet",
"packages/discover-dl",
"packages/lm-sync"
],
Expand Down
7 changes: 7 additions & 0 deletions packages/cal-to-sheet/appsscript.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"timeZone": "America/Chicago",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
}
89 changes: 89 additions & 0 deletions packages/cal-to-sheet/cal-to-sheet.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
const die = msg => {
throw Error(msg);
};
const NonNullish = (x, msg) => x || die(msg);

function getCalendarEventUrl(calendarId, eventId) {
return `https://calendar.google.com/calendar/event?cid=${calendarId}&eid=${eventId}`;
}

/**
* Updates the spreadsheet with events from the specified Google Calendar.
*/
function updateSheetFromCalendar(_nonce, io = {}) {
const {
// Get the spreadsheet and sheet
ss = SpreadsheetApp.getActiveSpreadsheet(),
sheet = ss.getActiveSheet() || ss.getSheets()[0],
sheetName = sheet.getName(),
// Get the calendar
calendar = NonNullish(
CalendarApp.getCalendarsByName(sheetName),
`cannot find calendar ${sheetName}`,
)[0],
// Get today's date (for the start of the query)
today = new Date(),
ui = SpreadsheetApp.getUi(),
} = io;

const calendarId = calendar.getId();

const firstRow = 1; // The first row to write data to (header row assumed above)
const clearExistingData = true; // Set to true to clear existing data before updating

today.setHours(0, 0, 0, 0); // Start of the day

// Get events from the calendar (you can adjust the date range as needed)
const events = calendar.getEvents(
today,
new Date(today.getTime() + 365 * 24 * 60 * 60 * 1000),
); // Events for the next year
Comment on lines +37 to +40
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd rather get all the events, past or future, but only 1 for repeating events. Like a .ics export.


// Prepare data for the sheet
const eventData = events.map(event => [
event.getTitle(),
event.getStartTime(),
event.getEndTime(),
event.getLocation(),
event.getDescription(),
getCalendarEventUrl(calendarId, event.getId()),
]);

// Clear existing data if specified
if (clearExistingData && sheet.getLastRow() > 0) {
sheet
.getRange(firstRow, 1, sheet.getLastRow(), sheet.getLastColumn())
.clearContent();
}

// Write the event data to the sheet
if (eventData.length > 0) {
sheet
.getRange(firstRow, 1, eventData.length, eventData[0].length)
.setValues(eventData);

// Add headers if the sheet was empty or cleared
if (clearExistingData || sheet.getLastRow() === 0) {
sheet.insertRowBefore(firstRow);
sheet
.getRange(firstRow, 1, 1, 6)
.setValues([
[
'Title',
'Start Time',
'End Time',
'Location',
'Description',
'Calendar Link',
],
]);
sheet.getRange(firstRow, 1, 1, 6).setFontWeight('bold');
}
} else {
ui.alert(
'Info',
'No events found in the specified calendar for the given date range.',
SpreadsheetApp.Ui.ButtonSet.OK,
);
}
}
9 changes: 9 additions & 0 deletions packages/cal-to-sheet/menu.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* Adds a custom menu to the spreadsheet.
*/
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Calendar Sync')
.addItem('Update from Calendar', 'updateSheetFromCalendar')
.addToUi();
}
6 changes: 6 additions & 0 deletions packages/cal-to-sheet/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"scripts": {
"pull": "clasp pull",
"push": "clasp push"
}
}