Tengo la siguiente secuencia de comandos que, cuando se llama, creará eventos en un calendario de Google en función de las entradas de las hojas de Google. Las funciones 'onOpen()' y 'scheduleShifts()' funcionan como se esperaba, si tiene alguna mejora, estaría más que feliz de implementarla.
function onOpen(){ var ui = SpreadsheetApp.getUi(); var menu = ui.createMenu("Sync to Calendar") menu.addItem("Schedule Shifts Now", "scheduleShifts") menu.addToUi(); } function scheduleShifts(){ var spreadsheet = SpreadsheetApp.getActiveSheet(); var calendarId = spreadsheet.getRange("C4").getValue(); var eventCal = CalendarApp.getCalendarById(calendarId); var signups = spreadsheet.getRange("A8:D12").getValues(); for (let x = 0; x < signups.length; x++) { var shift = signups[x]; var startTime = shift[0]; var endTime = shift[1]; var volunteer = shift[2]; var eventId = shift[3]; if (eventId == ""){ var newEvent = eventCal.createEvent(volunteer, startTime, endTime); var newEventId = newEvent.getId(); spreadsheet.getRange(8 + x, 4).setValue(newEventId); } } }El problema que tengo se basa en el activador onEdit (), quiero que el activador elimine el eventId que corresponde a los datos editados, en este caso, es simplemente el título del evento y luego crea un nuevo evento basado en el datos editados. Sin embargo, cuando edito datos de la matriz de celdas, nada cambia en el calendario de Google. Cualquier ayuda para este problema sería apreciada.
function onEdit(e){ var editedData = e.source.getActiveSheet().getRange(8, 3, 1, 5).getValues()[2]; var event = editedData[3] try{ // print(event); event.deleteEventSeries(); shift[3] = ''; } catch(e){ } }Para mayor claridad en las hojas de Google, las columnas son: Hora de inicio / Hora de finalización / Voluntario / ID de evento. con los datos del rango de celdas A8: D12
onEdit no verifica si la celda editada está en el rango correcto.onEdit no recupera el evento del calendario, solo un valor undefined , porque la matriz e.source.getActiveSheet().getRange(8, 3, 1, 5).getValues() tiene solo un elemento.onEdit . Puede hacerlo manualmente, siguiendo estos pasos , o mediante programación, ejecutando installTrigger una vez (consulte el ejemplo de código a continuación). function installTrigger() { var ss = SpreadsheetApp.getActive(); ScriptApp.newTrigger("onEditTrigger") .forSpreadsheet(ss) .onEdit() .create(); } function onEditTrigger(e) { var range = e.range; var FIRST_ROW = 8; // First row to check var LAST_ROW = 12; // Last row to check var TITLE_COL = 3; // Column index where to check changes var ID_COL = 5; // Column index with event id var colIndex = range.getColumn(); var rowIndex = range.getRow(); if (colIndex === TITLE_COL && rowIndex >= FIRST_ROW && rowIndex <= LAST_ROW) { var sheet = range.getSheet(); var eventIdRange = sheet.getRange(rowIndex, ID_COL); var eventId = eventIdRange.getValue(); var event = CalendarApp.getEventById(eventId); event.deleteEvent(); eventIdRange.setValue(""); } } En la hoja de cálculo que proporcionó, los eventId están ubicados en la columna E, pero de acuerdo con scheduleShifts , están en la columna D (correspondiente a la Description en su hoja de cálculo). Te sugiero que modifiques tu función en consecuencia:
function scheduleShifts(){ var spreadsheet = SpreadsheetApp.getActiveSheet(); var calendarId = spreadsheet.getRange("C4").getValue(); var eventCal = CalendarApp.getCalendarById(calendarId); var signups = spreadsheet.getRange("A8:E12").getValues(); for (let x = 0; x < signups.length; x++) { var shift = signups[x]; var startTime = shift[0]; var endTime = shift[1]; var volunteer = shift[2]; var description = shift[3]; var eventId = shift[4]; if (eventId == ""){ var newEvent = eventCal.createEvent(volunteer, startTime, endTime); var newEventId = newEvent.getId(); spreadsheet.getRange(8 + x, 5).setValue(newEventId); } } }