Created
December 11, 2024 20:29
-
-
Save luser/e1c955f49940e86d04ca3e40ea578f5c to your computer and use it in GitHub Desktop.
Dinner menu Google Sheet/Calendar App Script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var WEDNESDAY = 3; | |
function startup() { | |
checkCalendarEvents(); | |
}; | |
function edit(e) { | |
var sheet = SpreadsheetApp.getActiveSheet(); | |
var cells = sheet.getRange('A2:G2'); | |
var c = e.range.getColumn(); | |
if (e.range.getHeight() > 1 || e.range.getWidth() > 1 || e.range.getRow() != cells.getRow() || c < cells.getColumn() || c > cells.getLastColumn()) { | |
return; | |
} | |
var newtext = e.range.getValue(); | |
var which = e.range.getColumn() - cells.getColumn(); | |
var event = getEventForDay(getCalendar(), getDays()[which]); | |
if (event) { | |
event.setTitle(newtext.replace(/\n/g, ", ")); | |
} | |
} | |
function getCalendar() { | |
return CalendarApp.getCalendarById('<INSERT CALENDAR ID>'); | |
} | |
function getDays() { | |
var day = new Date(); | |
// Find next Sunday | |
if (day.getDay() > 0) { | |
day.setDate(day.getDate() + (7 - day.getDay())); | |
} | |
var days = []; | |
for (var i=0 ; i < 7; i++) { | |
days.push(day); | |
day = new Date(day); | |
day.setDate(day.getDate() + 1); | |
} | |
return days; | |
} | |
function getEventForDay(calendar, day) { | |
var events = calendar.getEventsForDay(day); | |
var tz = calendar.getTimeZone(); | |
// getEventsForDay is kind of terrible with all-day events. | |
events = events.filter(function(e) { | |
var d = e.isAllDayEvent() ? e.getAllDayStartDate() : e.getStartTime(); | |
return d.getDay() == day.getDay(); | |
}); | |
if (events.length == 1) { | |
return events[0]; | |
} else if (events.length == 0) { | |
// Create an event for this day | |
var e; | |
var title = day.getDay() > 4 ? 'Out/Pizza' : 'dinner'; | |
e = calendar.createAllDayEvent(title, day); | |
return e; | |
} | |
var fmt = Utilities.formatDate(day, tz, 'yyyy-MM-dd'); | |
Logger.log('Too many events for %s: %s', fmt, events.length); | |
return null; | |
} | |
function checkCalendarEvents() { | |
var sheet = SpreadsheetApp.getActiveSheet(); | |
var cells = sheet.getRange('A2:G2'); | |
var values = cells.getValues()[0]; | |
var calendar = getCalendar(); | |
var days = getDays(); | |
for (var i = 0; i < days.length; i++) { | |
var event = getEventForDay(calendar, days[i]); | |
if (event) { | |
values[i] = event.getTitle(); | |
} | |
} | |
cells.setValues([values]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment