2011-03-03 252 views
16

我的基于Javascript的网站的用户通常需要创建一个事件,他们发布事件名称,事件描述,开始时间和事件结束时间日期。现在,他们希望将这些活动细节添加到他们的Google日历或雅虎日历或iCal或Outlook中,是他们的任何标准库吗?虽然我知道谷歌的API,但我不知道iCal和Outlook甚至雅虎,但我试图找出过去3天。我正在寻找类似“http://compute2011.doattend.com/”的东西。在右侧你可以看到这个“添加到你的网站”部分,我想做同样的事情。添加事件到谷歌日历,雅虎日历,展望和ical

请帮我参与。

回答

11

我一直在寻找类似的东西,今天发现这个jQuery插件似乎可以帮助你。您可以直接生成.ics文件“随时”使用,它应该适用于Google,Outlook,iCal和Yahoo。

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

我还没有机会,虽然测试是它自己,但计划做在接下来的日子。但HTH!

+0

真棒非常感谢 – 2011-04-07 06:29:00

+0

很好的解决....不过是有没有办法直接事件从PHP脚本添加的,而不是产生ICS文件到Outlook日历,? – 2011-05-13 06:49:37

+0

@Jeevan Dongre为你做了这个icalendar解决方案吗?我无法从所提供的链接下载icalendar ...请帮助。 – 2011-05-13 07:56:28

4

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

4

这里是我使用的情况下,如果它帮助任何人,我使用ASP.NET MVC/C#但应该给你自己创建所需的东西的要点。

展望&的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; 
+0

+1这真的帮助了我,我认为你的时区数据是非常不正确的,它应该类似于https://gist.github.com/anonymous/e279854b37feb2c53c1d。另外,我相信你真的想'METHOD:PUBLISH' **不请求**,因为这实际上并不让你将事件添加到日历中。 – 2014-08-15 19:10:40

+0

不好意思,Google是否改变了做这个的方法?我之前一个月复制了Google Calendar的解决方案,并且运行良好,但现在停止工作......!谢谢! – 2015-10-06 21:13:34