首页 > 解决方案 > 如何将我的谷歌日历事件的 ID 转换为正确的格式,以便日历 API 在我的脚本中读取?

问题描述

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

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

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

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

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 时似乎就是这种情况。我只是不知道如何修复它。

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

标签: google-apps-scriptcalendar

解决方案


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

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

修改点:

  • 在您的脚本中,用于检索事件和更新事件的脚本似乎不同。所以在这个修改中,有分开的。
    • 当脚本运行时,您可以在日志中看到事件。
    • 事件已更新。
  • 关于事件ID,您可以将1c0tqtn56c1tdo1i0fus66f53g1c0tqtn56c1tdo1i0fus66f53g@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"})
}

笔记:

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

参考:


推荐阅读