将事件添加到谷歌日历、雅虎日历、Outlook 和 iCal。

25
我的基于Javascript的网站用户经常需要创建一个事件,他们需要提交事件名称、事件描述、开始时间、结束时间和日期。现在,他们想将这些事件细节添加到他们的Google日历、Yahoo日历、iCal或Outlook中,是否有标准库可以实现这一点?我已经尝试了过去3天,虽然我知道Google API,但我不知道iCal、Outlook甚至是Yahoo。我正在寻找与此非常相似的东西"http://compute2011.doattend.com/"。在右侧,您可以看到"Add this to your site"部分,我想做同样的事情。
请帮助我得到手头的资源。
6个回答

12

今晚我一直在寻找类似的东西,找到了这个jQuery插件,它似乎可以帮助您。使用此插件,您可以“即时”生成.ics文件,适用于Google、Outlook、iCal和Yahoo。

http://keith-wood.name/icalendar.html

虽然我自己还没有测试过,但计划在接下来的几天内测试它。希望对你有所帮助!


好的解决方案......不过有没有办法从php脚本直接向Outlook日历添加事件,而不是生成ics文件? - shasi kanth
@Jeevan Dongre,那个 iCalendar 解决方案有用吗?我无法从提供的链接下载iCalendar...请帮帮忙。 - shasi kanth
2
@dskanth 不,对我也不起作用。我正在寻找替代解决方案,让我尝试并在这里回来告诉你。 - Jeevan Dongre
@Jeevan Dongre,我认为另一种解决方案是从php向交换服务器添加事件,然后将我们的outlook与交换服务器同步,这样两者就会有相同的事件。正在寻找解决方法。 - shasi kanth
你是否找到了使用此插件创建多个事件的.ics文件的方法? - Azimuth

5

以下是我使用的内容,如果有帮助,我正在使用ASP.NET MVC/C#,但应该能够告诉你构建自己所需的主要内容。

Outlook和iCal:

var icsUrl = '/todos/geticsfile/' + id;

public ActionResult GetIcsFile(string id) {
            var user = UserService.Get(UserId);
            var todo = ToDoService.Get(id);
            var content = GetOutlookFileContents(user, todo);
            var bytes = Encoding.UTF8.GetBytes(content);
            return File(bytes, "text/calendar", "housters-todo.ics");
        }

public static string GetOutlookFileContents(User user, ToDo todo) {
            var builder = new StringBuilder();

            builder.AppendLine("BEGIN:VCALENDAR");
            builder.AppendLine("METHOD:REQUEST");
            builder.AppendLine("PRODID:Microsoft Exchange Server 2010");
            builder.AppendLine("VERSION:2.0");
            builder.AppendLine("BEGIN:VTIMEZONE");
            builder.AppendLine("TZID:Eastern Standard Time");
            builder.AppendLine("BEGIN:STANDARD");
            builder.AppendLine("DTSTART:16010101T020000");
            builder.AppendLine("TZOFFSETFROM:-0700");
            builder.AppendLine("TZOFFSETTO:-0800");
            builder.AppendLine("RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11");
            builder.AppendLine("END:STANDARD");
            builder.AppendLine("BEGIN:DAYLIGHT");
            builder.AppendLine("DTSTART:16010101T020000");
            builder.AppendLine("TZOFFSETFROM:-0800");
            builder.AppendLine("TZOFFSETTO:-0700");
            builder.AppendLine("RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3");
            builder.AppendLine("END:DAYLIGHT");
            builder.AppendLine("END:VTIMEZONE");
            builder.AppendLine("BEGIN:VEVENT");
            builder.AppendLine("ORGANIZER;CN=" + user.Name + ":MAILTO:" + user.EmailAddress);
            builder.AppendLine("ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=" + user.EmailAddress + ":MAILTO:" + user.EmailAddress);
            builder.AppendLine("DESCRIPTION;LANGUAGE=en-US:" + todo.Task);
            builder.AppendLine("SUMMARY;LANGUAGE=en-US:" + todo.TitleOrTask);
            builder.AppendLine("DTSTART;TZID=Eastern Standard Time:" + todo.DueDate.Value.ToString("yyyyMMdd"));
            builder.AppendLine("DTEND;TZID=Eastern Standard Time:" + todo.DueDate.Value.ToString("yyyyMMdd"));
            builder.AppendLine("UID:" + Guid.NewGuid().ToString());
            builder.AppendLine("CLASS:PUBLIC");
            builder.AppendLine("PRIORITY:5");
            builder.AppendLine("DTSTAMP:" + todo.DueDate.Value.ToString("yyyyMMdd") + "T023422Z");
            builder.AppendLine("TRANSP:OPAQUE");
            builder.AppendLine("STATUS:CONFIRMED");
            builder.AppendLine("SEQUENCE:0");
            if(todo.PropertyId != null) {
                var property = PropertyService.Get(todo.PropertyId);
                builder.AppendLine("LOCATION;LANGUAGE=en-US:" + property.FullAddress);
            }
            else {
                builder.AppendLine("LOCATION;LANGUAGE=en-US:Unknown");
            }
            builder.AppendLine("X-MICROSOFT-CDO-APPT-SEQUENCE:0");
            builder.AppendLine("X-MICROSOFT-CDO-OWNERAPPTID:2112076272");
            builder.AppendLine("X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE");
            builder.AppendLine("X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY");
            builder.AppendLine("X-MICROSOFT-CDO-ALLDAYEVENT:FALSE");
            builder.AppendLine("X-MICROSOFT-CDO-IMPORTANCE:1");
            builder.AppendLine("X-MICROSOFT-CDO-INSTTYPE:0");
            builder.AppendLine("X-MICROSOFT-DISALLOW-COUNTER:FALSE");
            builder.AppendLine("BEGIN:VALARM");
            builder.AppendLine("ACTION:DISPLAY");
            builder.AppendLine("DESCRIPTION:REMINDER");
            builder.AppendLine("TRIGGER;RELATED=START:-PT15M");
            builder.AppendLine("END:VALARM");
            builder.AppendLine("END:VEVENT");
            builder.AppendLine("END:VCALENDAR");

            return builder.ToString();
        }

谷歌:

var text = encodeURIComponent('Housters To-Do Due: ' + self.task());
            var startDate = moment(self.dueDate()).format('YYYYMMDD');
            var endDate = moment(self.dueDate()).add('days', 1).format('YYYYMMDD');
            var details = encodeURIComponent(self.task());
            var location = encodeURIComponent(self.propertyName());
            var googleCalendarUrl = 'http://www.google.com/calendar/event?action=TEMPLATE&text=' + text + '&dates=' + startDate + '/' + endDate + '&details=' + details + '&location=' + location;

+1 这真的帮了我很多,我认为你的时区数据非常不正确,应该与 https://gist.github.com/anonymous/e279854b37feb2c53c1d 相似。此外,我相信你真正想要的是 METHOD:PUBLISH 而不是请求,因为那样并不能让你将事件添加到你的日历中。 - Chris Marisic
请问,Google改变了执行此操作的方法吗?我之前复制了您的Google日历月份解决方案,并且运行良好,但现在停止工作了...谢谢! - Aral Roca

5

5

对于纯JavaScript解决方案,可以使用ics.js。 它仅使用JavaScript生成ics文件。唯一的缺点是不支持旧版本的IE浏览器。


1

0

9
这项服务现在是付费的。 - commonpike
这是一个付费服务,每月20美元起。 - Paul Denisevich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接