Search code examples
ricalendar

R package to export ICS?


Does anyone know of an R function to export dates and labels to an ics calendar format?

I've googled and searched SO but nothing is obvious, but can't believe someone hasn't already done this...


Solution

  • The iCalendar specification is pretty straightforward. Extending the following after reading that link and keeping it handy as a reference should be trivial (and I use that word deliberately vs lightly):

    #' Create a minimal iCalendar VEVENT
    #' 
    #' @param start,end start and end times of the event. This will be converted to
    #'        GMT from whatever time zone it currently is.
    #' @param summary a summary of the event. This is the "title" you see in calendars.
    #' @param domain something that will help the generated UUID be even more unique and
    #'        is generally good practice to use your org's domain name
    #' @return atomic character vector ready for `writeLines()`
    create_ical <- function(start, end, summary, domain="example.com") {
      
      require(uuid, quietly = TRUE, warn.conflicts = FALSE)
      
      sprintf(
        "BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//rstats//NONSGML v1.0//EN
    BEGIN:VEVENT
    UID:%s@%s
    DTSTAMP:%s
    DTSTART:%s
    DTEND:%s
    SUMMARY:%s
    END:VEVENT
    END:VCALENDAR
    ", uuid::UUIDgenerate(),
        domain, 
        format(Sys.time(), "%Y%m%dT%H%M%SZ", tz="GMT"), 
        format(start, "%Y%m%dT%H%M%SZ", tz="GMT"), 
        format(end, "%Y%m%dT%H%M%SZ", tz="GMT"), 
        summary
    )
      
    }
    

    Usage:

    create_ical(
      as.POSIXct("2018-01-30 13:00:00", origin="1970-01-01 00:00:00"),
      as.POSIXct("2018-01-30 14:00:00", origin="1970-01-01 00:00:00"),
      "A good description of the event",
      "somedom.org"
    ) -> ics_event
    
    cat(ics_event)
    ## BEGIN:VCALENDAR
    ## VERSION:2.0
    ## PRODID:-//rstats//NONSGML v1.0//EN
    ## BEGIN:VEVENT
    ## UID:[email protected]
    ## DTSTAMP:20180116T123051Z
    ## DTSTART:20180130T180000Z
    ## DTEND:20180130T190000Z
    ## SUMMARY:A good description of the event
    ## END:VEVENT
    ## END:VCALENDAR
    
    writeLines(ics_event, "ics_event.ics")