onEdit() 触发器删除已编辑的单元格 eventId,然后创建新单元格

onEdit() trigger to delete edited cells eventId and then create new one

我有以下脚本,当调用该脚本时,将根据来自 google 工作表的输入在 google 日历中创建事件。 'onOpen()' 和 'scheduleShifts()' 函数按预期工作,如果您有任何改进,我将非常乐意实现它们。

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); 
  }
  }
}

我遇到的问题是基于 onEdit() 触发器,我希望触发器删除与编辑数据对应的 eventId,在这种情况下,它只是事件的标题,然后创建一个基于编辑数据的新事件。但是,当我编辑单元格数组中的数据时,google 日历中没有任何更改。对此问题的任何帮助将不胜感激。

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){
    }
  }

为清楚起见,google 表格中的列为:开始时间/结束时间/志愿者/事件 ID。数据来自单元格范围 A8:D12

主要问题:

  • 您正在使用一个简单的触发器,它不能用于访问需要授权的服务(参见 Simple Triggers > Restrictions)。
  • onEdit 函数没有检查编辑的单元格是否在正确的范围内。
  • onEdit 函数不检索日历事件,只是一个 undefined 值,因为数组 e.source.getActiveSheet().getRange(8, 3, 1, 5).getValues() 只有一个元素。

解决方案:

  • Install your onEdit trigger. You can do that manually, following these steps,或以编程方式执行一次 installTrigger(参见下面的代码示例)。
  • 使用 event object 检查在删除相应事件之前编辑了哪个单元格。
  • 调用 CalendarApp.getEventById(iCalId) 获取您要检索的日历事件。

代码示例:

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("");
  }
}

其他问题:

在您提供的电子表格中,eventId 位于 E 列,但根据 scheduleShifts,它们位于 D 列(对应于电子表格中的 Description)。我建议您相应地修改您的功能:

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); 
    }
  }
}