I wrote this some time ago, but haven't really used it for awhile. You may need to make some modifications to it. It reads the iCal if it was pasted to the Clipboard. You can just change it to a file.

Code:
 Object oImportICSBtn is a Button
        Set Size to 37 70
        Set Location to 8 595
        Set peAnchors to anTopRight
        //Set Label to 'New Appt'
    
        // fires when the button is clicked
        Procedure Onclick
            Date dDate
            //Sysdate dDate
            //Send pPopupGCal 0 '' dDate
            String[] sLines
            String sLine
            Integer iCount iChIn i iLength
            Boolean bIsEvent
            Integer iYear iMonth iDay iHour iMin
            String sSTM
            Date dStartDate dEndDate dWorkDate
            DateTime dtWorkDate dtWorkDate2
            Integer iStartHr iEndHr iNumber iHeader
            Number nGMTStart nGMTEnd nGMTWork nWork
            String sTitle
            String sOwner sTest
            Boolean bUTC
            
            
            Move False to bIsEvent
            Move True to bUTC
            
            Move (Seq_New_Channel()) to iChIn
            Direct_Input channel iChIn 'CLIPBOARD:'
            [not SeqEof] Begin
                Repeat
                   Readln sLine
                   Move sLine to sLines[iCount]
                   If (sLine='BEGIN:VEVENT') Move True to bIsEvent
                   Increment iCount
                Until [SeqEof]
            End
            Close_Input channel iChIn
            Send Seq_Release_Channel iChIn
            
            If (bIsEvent) Begin
                For i from 0 to (iCount-1)
                    Move sLines[i] to sLine
                    Move (Trim(sLine)) to sLine
                    If ((Left(sLine,8))='DTSTART:') Begin
                        Move (Length(sLine)) to iLength
                        Move (Right(sLine,(iLength-8))) to sLine
                        Move (Right(sLine,1)) to sTest
                        If (sTest='Z') Move True to bUTC
                        Else Move False to bUTC
                        Move (Mid(sLine,4,1)) to iYear
                        Move (Mid(sLine,2,5)) to iMonth
                        Move (Mid(sLine,2,7)) to iDay
                        Move (Mid(sLine,2,10)) to iHour
                        Move (Mid(sLine,2,12)) to iMin
                        Move (CurrentDateTime()) to dtWorkDate
                        Move (DateSetDay(dtWorkDate,1)) to dtWorkDate
                        Move (DateSetYear(dtWorkDate,iYear)) to dtWorkDate
                        Move (DateSetMonth(dtWorkDate,iMonth)) to dtWorkDate
                        Move (DateSetDay(dtWorkDate,iDay)) to dtWorkDate
                        Move (DateSetHour(dtWorkDate,iHour)) to dtWorkDate
                        Move (DateSetMinute(dtWorkDate,iMin)) to dtWorkDate
                        Move (DateSetSecond(dtWorkDate,0)) to dtWorkDate
                        //Need: Number in GMT
                        //      Date in Local
                        //      Integer(time) in Local Time
                        If (not(bUTC)) Begin
                           //dtWorkDate is already LOCAL
                           Move (fGetUTC(dtWorkDate,SYSFILE.Def_Country, SYSFILE.Def_CommonCity)) to nGMTStart 
                           Move dtWorkDate to dStartDate
                           Move (fGetDFDateTime(nGMTStart)) to dtWorkDate2
                           Move (fCreateDFDateTime(dtWorkDate2)) to nWork
                           Move (fLocalTime(nWork,SYSFILE.Def_Country,SYSFILE.Def_CommonCity)) to iStartHr
                        End
                        Else Begin
                           //dtWorkDATE is already UTC
                           Move (fCreateDFDateTime(dtWorkDate)) to nGMTStart
                           Move (fGetDFDateTime(nGMTStart)) to dtWorkDate2
                           Move dtWorkDate2 to dStartDate
                           Move (fCreateDFDateTime(dtWorkDate2)) to nWork
                           Move (fLocalTime(nWork,SYSFILE.Def_Country,SYSFILE.Def_CommonCity)) to iStartHr
                        End
                        
                    End
                    If ((Left(sLine,6))='DTEND:') Begin
                        Move (Length(sLine)) to iLength
                        Move (Right(sLine,(iLength-6))) to sLine
                        Move (Right(sLine,1)) to sTest
                        If (sTest='Z') Move True to bUTC
                        Else Move False to bUTC
                        Move (Mid(sLine,4,1)) to iYear
                        Move (Mid(sLine,2,5)) to iMonth
                        Move (Mid(sLine,2,7)) to iDay
                        Move (Mid(sLine,2,10)) to iHour
                        Move (Mid(sLine,2,12)) to iMin
                        Move (CurrentDateTime()) to dtWorkDate
                        Move (DateSetDay(dtWorkDate,1)) to dtWorkDate
                        Move (DateSetYear(dtWorkDate,iYear)) to dtWorkDate
                        Move (DateSetMonth(dtWorkDate,iMonth)) to dtWorkDate
                        Move (DateSetDay(dtWorkDate,iDay)) to dtWorkDate
                        Move (DateSetHour(dtWorkDate,iHour)) to dtWorkDate
                        Move (DateSetMinute(dtWorkDate,iMin)) to dtWorkDate
                        Move (DateSetSecond(dtWorkDate,0)) to dtWorkDate
                        //Need: Number in GMT
                        //      Date in Local
                        //      Integer(time) in Local Time
                        If (not(bUTC)) Begin
                           //dtWorkDate is already LOCAL
                           Move (fGetUTC(dtWorkDate,SYSFILE.Def_Country, SYSFILE.Def_CommonCity)) to nGMTEnd
                           Move dtWorkDate to dEndDate
                           Move (fGetDFDateTime(nGMTEnd)) to dtWorkDate2
                           Move (fCreateDFDateTime(dtWorkDate2)) to nWork
                           Move (fLocalTime(nWork,SYSFILE.Def_Country,SYSFILE.Def_CommonCity)) to iEndHr
                        End
                        Else Begin
                           //dtWorkDATE is already UTC
                           Move (fCreateDFDateTime(dtWorkDate)) to nGMTEnd
                           Move (fGetDFDateTime(nGMTEnd)) to dtWorkDate2
                           Move dtWorkDate2 to dEndDate
                           Move (fCreateDFDateTime(dtWorkDate2)) to nWork
                           Move (fLocalTime(nWork,SYSFILE.Def_Country,SYSFILE.Def_CommonCity)) to iEndHr
                        End
                         
                    End
                    If ((Left(sLine,8))='SUMMARY:') Begin
                        Move (Length(sLine)) to iLength
                        Move (Right(sLine,(iLength-8))) to sLine
                        Move sLine to sTitle 
                    End
                    
                Loop
                //************************************************************
                Get psUser of hAppWS to sSTM
                Move sSTM to sOwner
                
                Clear GCal_Evt
                Reread
                   Move sSTM to GCAL_EVT.CREATED_BY
                   Move dStartDate to GCAL_EVT.STARTDATE
                   Move iStartHr to GCAL_EVT.STARTTIME
                   Move dEndDate to GCAL_EVT.ENDDATE
                   Move iEndHr to GCAL_EVT.ENDTIME
                   Move nGMTStart to GCAL_EVT.StartDateTime
                   //Move nGMTEnd to GCAL_EVT.EndDateTime
                   If (nGMTEnd>nGMTStart) Move nGMTEnd to GCAL_EVT.EndDateTime
                   Else Move nGMTStart to GCAL_EVT.EndDateTime
                               
                   Move sysfile.Def_Country to GCAL_EVT.Country
                   Move sysfile.Def_CommonCity to GCAL_EVT.CommonCity
                   Move sTitle to GCAL_EVT.TITLE
                   Move sOwner to GCAL_EVT.STM  //will need to change this later after testing to allow users to select which calendars
                   //Move sWhere to GCAL_EVT.Where
                   Get fGSCTimeStamp to GCAL_EVT.LASTCHANGE
                   //Move sType to GCAL_EVT.TYPE
                   //Move sDetail to GCAL_EVT.DETAIL
                   
                   Move 'N' to GCAL_EVT.ISPRIVATE
                   Move 'N' to GCAL_EVT.TODO_ITEM
                   Move 'N' to GCAL_EVT.Completed
                   
                   Move 'Y' to GCAL_EVT.isheader //will need to change this later MAYBE
                   If (iNumber=0) Begin
                       Move (GCAL_SYS.LAST_EVENT+1) to iNumber
                       Move (GCAL_SYS.LAST_EVENT+1) to GCAL_Sys.LAST_EVENT
                       Move iNumber to GCAL_EVT.Number
                       //Move iNumber to GCAL_EVT.HEADER
                       Move iNumber to GCAL_EVT.LINKEDNUMBER 
                       Move 'N' to GCAL_EVT.Spanner
                       Move iNumber to GCAL_EVT.Top
                   End
                   If (iHeader=0) Move iNumber to iHeader
                   Move iHeader to GCAL_EVT.Header
                   //Move sEmpGroup to GCAL_EVT.EMPGROUP
                   
                      SaveRecord GCAL_EVT GCAL_SYS
                      
                
                Unlock
                If (dStartDate<dEndDate) Begin
                    Move dStartDate to dWorkDate
                    Repeat
                         Move (dWorkdate+1) to dWorkDate
                         Move dWorkDate to dtWorkDate
                         Move (DateSetHour(dtWorkDate,0)) to dtWorkDate
                         Move (DateSetMinute(dtWorkDate,0)) to dtWorkDate
                         Move (DateSetSecond(dtWorkDate,0)) to dtWorkDate
                         Move (fGetUTC(dtWorkDate,sysfile.Def_Country,sysfile.Def_CommonCity)) to nGMTWork
                    
                         Clear GCal_Evt
                         Reread
                            Move sSTM to GCAL_EVT.CREATED_BY
                            Move dWorkDate to GCAL_EVT.STARTDATE
                            Move 0 to GCAL_EVT.STARTTIME
                            Move dEndDate to GCAL_EVT.ENDDATE
                               
                            Move iEndHr to GCAL_EVT.ENDTIME
                            Move nGMTWork to GCAL_EVT.StartDateTime
                            Move nGMTEnd to GCAL_EVT.EndDateTime
                            If (nGMTEnd>nGMTWork) Move nGMTEnd to GCAL_EVT.EndDateTime
                            Else Move nGMTStart to GCAL_EVT.EndDateTime
                            Move sysfile.def_Country to GCAL_EVT.Country
                            Move sysfile.Def_CommonCity to GCAL_EVT.CommonCity
                            //Move sWhere to GCAL_EVT.Where
                            
                            Move sTitle to GCAL_EVT.TITLE
                            Move sOwner to GCAL_EVT.STM  //will need to change this later after testing to allow users to select which calendars
                            Get fGSCTimeStamp to GCAL_EVT.LASTCHANGE
                            //Move sType to GCAL_EVT.TYPE
                            //Move sDetail to GCAL_EVT.DETAIL
                            Move 'N' to GCAL_EVT.ISPRIVATE
                            Move 'N' to GCAL_EVT.TODO_ITEM
                            Move 'N' to GCAL_EVT.Completed
                            Move 'Y' to GCAL_EVT.isheader //will need to change this later MAYBE
                            //If (iNumber=0) Begin
                                Move (GCAL_SYS.LAST_EVENT+1) to GCal_Evt.Number
                                //Move (GCal_Sys.Last_Event+1) to GCAL_EVT.HEADER
                                Move (GCal_Sys.Last_Event+1) to GCAL_EVT.LINKEDNUMBER 
                                Move 'Y' to GCAL_EVT.Spanner
                                Move iNumber to GCAL_EVT.Top
                                Move (GCAL_SYS.LAST_EVENT+1) to GCAL_Sys.LAST_EVENT
                                
                            //End
                            If (iHeader=0) Move iNumber to iHeader
                            Move iHeader to GCAL_EVT.Header
                            //Move sEmpGroup to GCAL_EVT.EMPGROUP
                            
                            
                               SaveRecord GCAL_EVT GCAL_SYS
                         
                         Unlock
                    Until (dWorkDate=dEndDate)
                    
                End
                            
                
                //************************************************************
                Send Info_Box ("Calendar Event imported:\n  Date: "+(String(dStartDate))+"\n Owner: "+sSTM)
                Procedure_Return
                
            End
            Send Stop_Box 'Nothing to import'
            
            
               
        End_Procedure

End_object