Javascript 将事件添加到谷歌日历、雅虎日历、Outlook 和 ical

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5179760/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 15:59:24  来源:igfitidea点击:

Add events to google calendar,yahoo calendar, outlook and ical

javascriptoutlookgoogle-apiicalendaryahoo-api

提问by Jeevan Dongre

The users of my Javascript based site often need to create an event where they post an event name, event description, start time and the end time of the event along with the date. Now, they would like to add those event details to the their Google calendar or Yahoo calendar or iCal or Outlook, is their any standard library for that? I am trying to figure it out for the past 3 days though I am aware of google api's but I am not aware of iCal and Outlook or even Yahoo too. I am looking for something very similar this "http://compute2011.doattend.com/". In the right hand side you can see this "Add this to your site" part, I would like to do the same thing.

我的基于 Javascript 的站点的用户通常需要创建一个事件,在其中发布事件名称、事件描述、事件的开始时间和结束时间以及日期。现在,他们想将这些事件详细信息添加到他们的 Google 日历或 Yahoo 日历或 iCal 或 Outlook 中,他们有任何标准库吗?尽管我知道 google api,但我在过去 3 天里一直试图弄清楚,但我也不知道 iCal 和 Outlook 甚至雅虎。我正在寻找与“ http://compute2011.doattend.com/”非常相似的东西。在右侧,您可以看到“将此添加到您的站点”部分,我想做同样的事情。

Please help me to get in hands on.

请帮我动手。

采纳答案by Zalakain

I've been searching for something similar tonight and found this jQuery plugin which seems that could help you out. You can directly generate .ics files "on the fly" with it which should be good for Google, Outlook, iCal and Yahoo.

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

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

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

I haven't had a chance to test it myself though, but plan to do it in the next days. However HTH!

虽然我还没有机会亲自测试它,但计划在接下来的几天内进行。然而HTH!

回答by Praveen Vijayan

回答by Justin

Here is what I use in case it helps anyone, I'm using ASP.NET MVC / C# but should give you the gist of what's required to build it yourself.

这是我使用的,以防它对任何人有帮助,我使用的是 ASP.NET MVC / C#,但应该为您提供自己构建它所需的要点。

Outlook & iCal:

展望 & 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();
        }

Google:

谷歌:

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;

回答by InsanelyADHD

For a pure javascript solution, there is ics.js. It generates ics files using solely javascript. The only downside is that it doesn't support older versions of IE.

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

回答by RicardoGonzales

I thinks this is the best option to do this. This plugin can create a .ics file from variables on html.

我认为这是做到这一点的最佳选择。这个插件可以从 html 上的变量创建一个 .ics 文件。

http://addtocalendar.com/

http://addtocalendar.com/