首页 > 解决方案 > 如何使用 onEdit 触发器修改/更新谷歌日历事件?

问题描述

所以我一直在使用谷歌应用脚​​本在谷歌表单上进行试验-日历表。我能够从表单提交中自动将事件添加到谷歌日历。但是当用户编辑他们的回复时,我仍然在努力直接修改事件。

因此,新提交的第一个 endtime 将被转换为对象,然后检查是否会与其他用户的另一个提交发生冲突:

function getEndTime(request){
  request.endTime = new Date(request.dateout.getTime() + 24 * 60 * 60 * 1000);
}


function getConflicts(request){
  var conflicts = request.calendar.getEvents(request.date, request.endTime);
  if (conflicts.length > 0) {
    request.status = "Conflict";
  } else {
    request.status = "Approve";
  }
} 

如果没有冲突,日历将被更新

function updateCalendar(request){
  var event = request.calendar.createEvent(
    "Booked",
    request.date,
    request.endTime
    )
}

这是 onFormSubmit 函数(带有表单提交触发器):

function main(){
  var request = new Submission(lastRow);
  getEndTime(request);
  getConflicts(request);
  draftEmail(request);
  if (request.status == "Approve") updateCalendar(request);
  sendEmail(request);
}

这是 onEdit 函数(带有 onEdit 触发器)和 change() 函数:

function Change() {
  this.statusArray = sheet.getRange(1, lastColumn, lastRow, 1).getValues();
  this.statusArray = [].concat.apply([], this.statusArray);
  this.index = this.statusArray.indexOf('');
  if (this.index == -1) return;
  this.dateArray = sheet.getRange(1, lastColumn - 4, lastRow, 1).getValues();
  this.dateArray = [].concat.apply([], this.dateArray);
  this.dateoutArray = sheet.getRange(1, lastColumn - 3, lastRow, 1).getValues();
  this.dateoutArray = [].concat.apply([], this.dateoutArray);
}

function onEdit() {
  var change = new Change();
  while (change.index != -1) {
    change.status = change.statusArray[change.index];
    change.row = change.index + 1;
    var request = new Request(change.row);
    if (change.status == 'Sent: Conflict') {
      change.statusArray[change.index] = 'Conflict';
      request.status = 'Conflict';
      sendEmail(request);
      sheet.getRange(change.row, lastColumn).setValue('Sent: Conflict');
    } else {
      getEndTime(request);
      change.statusArray[change.index] = 'Approve';
      updateCalendar(request);
      sendEmail(request);
      sheet.getRange(request.row, lastColumn).setValue('Sent: Approve');
      break;
        }
    }
    change.index = change.statusArray.indexOf('');
  }

即使有这组代码,编辑提交总是会和之前自己的提交发生冲突。(例如,如果我在 5 月 17 日到 5 月 19 日第一次提交到 book,然后我将其编辑到 5 月 17 日到 5 月 21 日,我编辑的提交将与之前自己的提交发生冲突)。如何删除以前的事件,然后在编辑时将其替换为新的自己提交?先感谢您!

标签: javascriptgoogle-apps-scriptgoogle-sheetsgoogle-calendar-api

解决方案


您应该使用补丁更新方法来更改现有事件。

如果你想完全删除它,那么你应该使用删除方法。


推荐阅读