【问题标题】:How to add/modify events in Google calendar with ICS file如何使用 ICS 文件在 Google 日历中添加/修改事件
【发布时间】:2018-10-29 13:30:46
【问题描述】:

我正在尝试创建一个 ICS 文件以通过电子邮件将事件添加到 Google 日历。最后,日历将从桌面应用程序发送给多个用户。理想情况下,如果事件发生变化,我希望能够修改日历(只是事件时间,我忽略了取消的事件)

这是我的 ICS 文件

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//MY COMPANY//Calendar//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
UID:shift-439-emp-128@mycompany.com
DTSTART:20180604T090000
DTEND:20180604T153000
DTSTAMP:20180519T081800
SUMMARY:Morning shfit
LOCATION:Morning Location
DESCRIPTION:Morning shift
END:VEVENT
BEGIN:VEVENT
UID:shift-446-emp-128@mycompany.com
DTSTART:20180605T153000
DTEND:20180605T233000
DTSTAMP:20180519T081800
SUMMARY:Night shift
LOCATION:
DESCRIPTION:Night
END:VEVENT
END:VCALENDAR

当我将该文件通过电子邮件发送到我的 gmail 帐户时,我可以看到一个“添加到 Google 日历”按钮,我可以使用该按钮将事件添加到我的主日历中。

现在,假设事件时间发生了变化。

问题:如何使用新时间创建新的 ICS 文件,以便在 google 日历中修改现有事件?

我将 UID 用于事件,以便 google 不会创建重复条目。但是,当我通过电子邮件发送第二个带有修改事件(带有 uid)的 ics 文件时,“添加到谷歌日历”按钮不会出现。如果我尝试从谷歌日历导入功能手动导入 ics 文件,则会收到此错误消息

无法上传您的活动,因为您在目标日历上没有足够的访问权限。

如果我每次都设置不同的 UID,导入过程将起作用,但会创建重复条目。

我也尝试使用REQUEST 代替PUBLISH 方法

谢谢

【问题讨论】:

  • 如果您想要这种控制,您最好通过 API 以编程方式与日历数据进行交互,而不是依赖电子邮件界面。 developers.google.com/calendar
  • 是的,但是要为其他用户添加/修改日历中的事件,我需要他们的 API 密钥。目前,电子邮件被发送到桌面应用程序
  • 啊好的。您只提到通过电子邮件发送您自己的 gmail 帐户。也许在这种情况下,您最好在 URL 上提供 ICS 提要,其他人可以订阅该提要。这样同步由他们自己的日历软件处理。我不知道,这取决于你的整体要求,我不太了解。无论哪种方式,我都不相信您可以通过电子邮件发送静态 ics 文件来实现这一点。
  • 对于更新能力,导入是不好的 - 只是将事件数据添加到现有日历,用户可以覆盖 - 如果有更新的潜力,这通常没有帮助。'订阅'网址是更好 - 在接收应用程序中显示为单独的日历。最终会更新。然后,您必须具有相同的事件 UID 和 SEQUENCE 以指示该事件的最新更新。如果您正在修改重复事件的实例,您还需要一个 RECURRENCE-ID 来指示您正在修改哪个实例。谷歌 RFC5545 和序列
  • 谢谢你们两位的cmets。我将调查 ICS 提要

标签: email google-calendar-api icalendar


【解决方案1】:

我可以通过以下方式在 Gmail 中使用:

  • METHOD:设置为REQUEST
  • SEQUENCE:在第一次请求时设置为 0,每次加 1
  • ATTENDEE:通过电子邮件地址识别接收电子邮件的 Gmail 用户

其他变体会产生不良影响:

  • 只看到两个事件中的一个
  • 不更新现有活动

Office 365 将 ICS 文件发送到可以更新的 Gmail,以便用于参考商业实施。您可以查看 Outlook 365 发送的请求,方法是在 Gmail 中使用“显示原始”来检索 base64 编码的日历正文。 Outlook 365 使用许多其他字段,因此检查起来很有指导意义。

我有一个使用 SparkPost 的 Go 测试脚本,所以如果您有任何问题或想使用它,请告诉我。 SparkPost 有免费套餐,但您仍需要配置出站发送域才能使用它。

这是一个修改后的请求示例。我只是增加 SEQUENCE 并更改时间以更新 Gmail 中的请求。

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//MY COMPANY//Calendar//EN
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
ATTENDEE;ROLE=REQ-PARTICIPANT;CN=example@gmail.com:MAILTO:example@gmail.com
UID:shift-1807-emp-128@mycompany.com
DTSTART:20180807T010000
DTEND:20180807T020000
DTSTAMP:20180601T033455
SEQUENCE:0
SUMMARY:Morning shift
LOCATION:Morning Location
DESCRIPTION:Morning shift
END:VEVENT
BEGIN:VEVENT
ATTENDEE;ROLE=REQ-PARTICIPANT;CN=example@gmail.com:MAILTO:example@gmail.com
UID:shift-1808-emp-128@mycompany.com
DTSTART:20180807T130000
DTEND:20180807T140000
DTSTAMP:20180601T033455
SEQUENCE:0
SUMMARY:Night shift
LOCATION:Night Location
DESCRIPTION:Night
END:VEVENT
END:VCALENDAR

值得注意的是,当在单个 ICS 文件中发送多个事件时,有时 Gmail 需要一秒钟左右的时间才能在我的测试中以正确的时间显示这两个事件。

【讨论】:

  • 谢谢,我会试试的。我不确定它是否会起作用,但我的赏金即将到期,我更愿意将它奖励给你而不是浪费它。如果可行,我会接受答案
  • 告诉我进展如何。我有一个工作示例,稍后会发布代码,可能还会发布视频。
  • 我在这里发布了一个工作示例:github.com/grokify/oauth2more/blob/master/sparkpost/examples/…。这会像您的示例一样发布两个班次,并且可以通过增加 seq 序列号和时间(手动更改小时)来更改两个班次。
  • 谢谢,我会看看,希望过几天告诉你
猜你喜欢
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 2018-09-06
  • 2012-01-02
相关资源
最近更新 更多