如何防止 Google 表格和日历之间的 Apps 脚本重复预订

How to prevent Double Booking in Apps Script between Google Sheets and Calendar

我正在制作一个电子表格,它可以帮助我们自动安排会议。我想确保我的团队不会将会议安排在同一日期和时间。如何将其添加到我现有的可用代码中? (我在任何地方都找不到这个答案!!)

function addEvents(){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lr = ss.getLastRow();
  var cal = CalendarApp.getCalendarById("c_kdaqhj8lkd7u68s8thinbnjpik@group.calendar.google.com");

  var data = ss.getRange("A2:F"+ lr).getValues();

  for(var i = 0;i<data.length;i++){

    if(cal.getEvents(data[i][1], data[i][2])==null || cal.getEvents(data[i][1], data[i][2]).length==0 ){

      cal.createEvent(data[i][0], data[i][1], data[i][2],{guests: ''+data[i][3]+','+data[i][4]+'', description:data[i][5]});
}

} }

function onOpen() {
    var ui = SpreadsheetApp.getUi();
   ui.createMenu('Sync to Calendar')
        .addItem('Schedule events now', 'addEvents')
        .addToUi()

}

谢谢!

我的回答与 Cooper 提供的类似,所以我将发布此内容以帮助您 sheet 正确维护。

我在 onEdit() 期间添加了一个行为,当用户在 sheet 中添加一组现有的开始和结束日期时,最近的 added/edited 行会自动删除。

这可以减少对日历的调用次数,但代价是在编辑期间不断检查 sheets。

欢迎使用下面的代码

function onEdit(e) {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var currentSheet = SpreadsheetApp.getActiveSheet();
  var cell = currentSheet.getActiveCell();
  var cellValue = cell.getValue();
  var date, dates, occurences, limit;

  // newly added date in active sheet
  if (cell.getColumn() == 2) { 
    date = [cellValue, cell.offset(0, 1).getValue()];
  }
  else if (cell.getColumn() == 3) {    
    date = [cell.offset(0, -1).getValue(), cellValue];
  }

  // traverse other sheets
  sheets.forEach(function(sheet){
    var sheetName = sheet.getName();

    // dates from other sheets
    dates = sheet.getRange(2, 2, sheet.getLastRow(), 2).getValues();

    occurences = 0;

    // check if dates in other sheets have the newly added date
    for(var index in dates){
      if(JSON.stringify(dates[index]) === JSON.stringify(date)) {
        // increment if found
        occurences++;
      }
    }
    if(sheet.getName() != currentSheet.getName()) {
      // should not occur in other sheets
      limit = 0;
    }
    else {
      // should occur at most once in the active sheet
      limit = 1;
    }
    // if date was found more than the limit
    if (occurences > limit) {
      // prompt user that the newly added date is present in other sheets
      SpreadsheetApp.getUi().alert('WARNING!: Dates are already booked in ' + sheetName + '. Deleting newly added event.');

      // delete newly added date
      currentSheet.deleteRow(cell.getRow());
    }
  });
}