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

How do I get my google calendar event's ID into the right format for the Calendar API to read in my script?

我正在尝试编写一个脚本来执行以下两项操作:1) 根据我的 sheet 中提供的日期更新我的 Google 日历上现有活动的日期和标题 AND 2 ) 通过电子邮件将更新的日期发送给活动的客人(这样他们日历上的活动就会更新)。

我能够使用 CalendarApp.getEventById(eventId) 成功更新我的活动的日期和标题。但是,我 真的 喜欢在活动日期更新后向每位客人重新发送活动通知。使用 CalendarApp 似乎不可能做到这一点(如果可能,请告诉我怎么做!)。在这个 question 中苦苦挣扎之后,我现在尝试使用 Calendar.Events.patch 来更新活动并将更新发送给所有活动的客人。

我一直遇到的问题是我的sheet通过我的createEvent脚本记录的eventId的格式以“@[=35结尾=]。” CalendarApp 可以很好地读取此格式,但无法被 Calendar.Events.patch 读取。我已经尝试将其编码为 base64,因为这似乎是 Calendar.Events.patch 寻找的格式,但我认为我仍然遗漏了一些东西。

当我运行下面的代码时,报错returns"API call to calendar.events.get failed with error: Not Found."

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 有几个字符或其他东西,因为当我 运行 @google.com eventId 到 this encoding tool 时似乎就是这种情况。我只是不知道如何修复它。

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

  • 您想使用事件 ID 检索事件。
  • 您想更新活动并向用户发送电子邮件。
    • 您要修改活动名称、活动起止时间
  • eventId1c0tqtn56c1tdo1i0fus66f53g@google.com,这是一个文本值。
  • vEventNameEthiopia Limu,这是一个文本值。
  • newstartTime6/10/2019 这是一个日期对象。
  • newendTime7/30/2019 这是一个日期对象。

如果我的理解是正确的,这个修改怎么样?

修改点:

  • 在您的脚本中,检索事件和更新事件的脚本似乎不同。所以在这个修改中,有分开。
    • 当脚本为 运行.
    • 时,您可以在日志中看到该事件
    • 活动已更新。
  • 关于事件ID,可以使用1c0tqtn56c1tdo1i0fus66f53g@google.com1c0tqtn56c1tdo1i0fus66f53g作为事件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是否分别为日期对象。

参考: