如何将Google日历事件的ID转换为正确的格式,以便Calendar API可以在脚本中读取?

时间:2019-04-01 23:24:00

标签: google-apps-script calendar

我正在尝试编写一个能够同时执行以下操作的脚本:1)根据工作表中提供的日期更新我Google日历上现有活动的日期和标题,以及2)通过电子邮件将更新的日期发送给活动的日期客人(因此日历上的活动会更新)。

我能够使用CalendarApp.getEventById(eventId)成功更新事件的日期和标题。但是,我真的希望事件通知在事件的日期更新后重新发送给每个来宾。使用CalendarApp似乎无法做到这一点(如果可能,请告诉我如何做!)。在此question中对此进行了努力之后,我现在正尝试使用Calendar.Events.patch更新事件并将更新发送给所有事件的来宾。

我一直遇到的问题 是,我的createEvent脚本在工作表中记录的eventId的格式以“ @ google.com”结尾。 CalendarApp可以很好地读取此格式,而Calendar.Events.patch无法读取此格式。我已经尝试将其编码为base64,因为这似乎是Calendar.Events.patch所寻找的格式,但是我认为我仍然缺少一些东西。

当我运行下面的代码时,错误返回“ API调用calendar.events.get失败,并显示错误:未找到。”

function updateEvent(calendarId, eventId, email) {
  var vSS = SpreadsheetApp.getActiveSpreadsheet();
  var vS = vSS.getActiveSheet();
  var eventId = vS.getRange("R2").getValue(); //R2 is the cell where my eventId is logged

//My attempt to encode my eventId to base64
  var base64data = eventId;
  var encoded = Utilities.base64Encode(base64data,Utilities.Charset.UTF_8);

  var vEventName = vS.getRange("M3").getValue();
  var newstartTime = vS.getRange("M5").getValue();
  var newendTime = vS.getRange("M6").getValue();
  var event = Calendar.Events.get('example@gmail.com', encoded);
  if(event.attendees) {
    event.attendees.push({
      email: email
    });
  } else {
    event.attendees = new Array({email: email});
  }
  event = Calendar.Events.patch(vEventName, encoded, {
    start: newstartTime,
    end: newendTime,
    sendUpdates: "all"});
}

我怀疑已编码的eventId偏离了几个字符或某些字符,因为当我通过this encoding tool运行@ google.com eventId时似乎是这种情况。我只是不知道要解决它。

请理解,我对编写脚本非常陌生,并且已经为这个问题苦苦挣扎了一个多星期。我想我在发布最后一个问题后学到了很多东西,因为现在我对我的确切问题有了更好的了解,但是我仍然不知道解决方法。我正在尝试通过阅读本网站上的问题,阅读Google's information(不幸的是,我基本上不理解)以及观看YouTube视频来教自己如何做到这一点。如果我要的脚本太多,请告诉我。

1 个答案:

答案 0 :(得分:0)

  • 您要使用事件ID检索事件。
  • 您要更新事件并向用户发送电子邮件。
    • 您要修改事件名称,事件的开始和结束时间。
  • eventId1c0tqtn56c1tdo1i0fus66f53g@google.com,它是一个文本值。
  • vEventNameEthiopia Limu,它是一个文本值。
  • newstartTime6/10/2019,它是一个日期对象。
  • newendTime7/30/2019,它是一个日期对象。

如果我的理解是正确的,那么该修改如何?

修改点:

  • 在您的脚本中,用于检索事件和更新事件的脚本似乎不同。因此,在此修改中,存在分隔。
    • 运行脚本后,您可以在日志中看到事件。
    • 事件已更新。
  • 关于事件ID,您可以使用1c0tqtn56c1tdo1i0fus66f53g中的1c0tqtn56c1tdo1i0fus66f53g@google.com作为事件ID。

当这些内容反映到脚本中时,它如下所示。

修改后的脚本:

function updateEvent(calendarId, eventId, email) {
  var vSS = SpreadsheetApp.getActiveSpreadsheet();
  var vS = vSS.getActiveSheet();
  var eventId = vS.getRange("R2").getValue();
  var vEventName = vS.getRange("M3").getValue();
  var newstartTime = vS.getRange("M5").getValue();
  var newendTime = vS.getRange("M6").getValue();

  var eid = eventId.split("@")[0]; // Added

  // Retrieve event
  var event = Calendar.Events.get(calendarId, eid);
  if(event.attendees) {
    event.attendees.push({
      email: email
    });
  } else {
    event.attendees = new Array({email: email});
  }
  Logger.log(event)

  // Update event
  var resource = {
    start: {dateTime: newstartTime.toISOString()},
    end: {dateTime: newendTime.toISOString()},
    summary: vEventName,
  };
  Calendar.Events.patch(resource, calendarId, eid, {sendUpdates: "all"})
}

注意:

  • 如果在更新事件时发生与datetime相关的错误,请确认newstartTimenewendTime分别是日期对象。

参考: