2011-03-03 121 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