diff --git a/package.json b/package.json index 286cddb..85ef72a 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "workspaces": [ "packages/br-cal", "packages/br-script", + "packages/cal-to-sheet", "packages/discover-dl", "packages/lm-sync" ], diff --git a/packages/cal-to-sheet/appsscript.json b/packages/cal-to-sheet/appsscript.json new file mode 100644 index 0000000..50abad2 --- /dev/null +++ b/packages/cal-to-sheet/appsscript.json @@ -0,0 +1,7 @@ +{ + "timeZone": "America/Chicago", + "dependencies": { + }, + "exceptionLogging": "STACKDRIVER", + "runtimeVersion": "V8" +} \ No newline at end of file diff --git a/packages/cal-to-sheet/cal-to-sheet.js b/packages/cal-to-sheet/cal-to-sheet.js new file mode 100644 index 0000000..6f53166 --- /dev/null +++ b/packages/cal-to-sheet/cal-to-sheet.js @@ -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 + + // 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, + ); + } +} diff --git a/packages/cal-to-sheet/menu.js b/packages/cal-to-sheet/menu.js new file mode 100644 index 0000000..6b6f63d --- /dev/null +++ b/packages/cal-to-sheet/menu.js @@ -0,0 +1,9 @@ +/** + * Adds a custom menu to the spreadsheet. + */ +function onOpen() { + SpreadsheetApp.getUi() + .createMenu('Calendar Sync') + .addItem('Update from Calendar', 'updateSheetFromCalendar') + .addToUi(); +} diff --git a/packages/cal-to-sheet/package.json b/packages/cal-to-sheet/package.json new file mode 100644 index 0000000..fd66de6 --- /dev/null +++ b/packages/cal-to-sheet/package.json @@ -0,0 +1,6 @@ +{ + "scripts": { + "pull": "clasp pull", + "push": "clasp push" + } +}