google-apps-script - 如何将我的谷歌日历事件的 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 视频来自学如何做到这一点。如果我对剧本要求太多,请告诉我。
解决方案
- 您想使用事件 ID 检索事件。
- 您想要更新事件并向用户发送电子邮件。
- 您想修改事件名称、事件的开始和结束时间。
eventId
是1c0tqtn56c1tdo1i0fus66f53g@google.com
哪个是文本值。vEventName
是Ethiopia Limu
哪个是文本值。newstartTime
是6/10/2019
日期对象。newendTime
是7/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"})
}
笔记:
date
如果在更新事件时发生与事件相关的错误time
,请分别确认是否newstartTime
为newendTime
日期对象。
参考:
推荐阅读
- ios - Carthage 更新失败,“Alamofire.framework”无法打开,因为没有这样的文件 Xcode12GM
- ios14 - iOS 14 在后台播放视频中的音频
- mongodb - 使用 Cypress.io 在 Meteor.js 中进行测试时是否需要 Xolvio:cleaner 包?
- angular - 如何设置与开始日期不同的结束日期?
- ubuntu - 最近更新后缺少执行环形解释器的 GLIBC
- powerbi - 如何将 Power BI 日期/时间格式从日、月 dd、yyyy 更改为 mm/dd/yyyy
- c - 在函数中循环以将数据存储在c中的结构中
- git - 更新新的远程 git 存储库的问题
- android - 输入'列表
' 不是类型 'Uint8List 的子类型 - go - gorm 检查多对多关系中的重复