导出前景日历事件使用applescript

时间:2014-07-07 07:17:07

标签: calendar outlook applescript

我尝试将日历事件导出为文件.ics格式但有些错误:

property byCategory : "By category"
property byPattern : "Names matching pattern"
property icsFormat : "VCalendar"
property outputFolderPath : the path to the desktop

-------------------------------------------
--  main
--
set calendarToExport to {}


-- Get the calendar selection

set calendarList to my ListCalendars()
display alert (count of calendarList)

if the (count of calendarList) is greater than 1 then

    -- build calendar listing
    set displayList to {}
    repeat with c from 1 to the count of calendarList
        set nextCal to calendarList's item c

        set the end of displayList to {(c as text) & " - \"" & nextCal's cName & "\" (" & nextCal's cKind & ")"}
        --display alert (c as text) & " - \"" & nextCal's cName & "\" (" & nextCal's cKind & ")"
    end repeat

    -- ask user to choose
    set dResult to choose from list displayList with title "Choose Calendar(s)" with prompt "List Of Calendar:" OK button name "Export" with multiple selections allowed

    -- generate chosen list
    set chosenList to {}
    repeat with nextItem in dResult
        set the end of chosenList to (the first word of (nextItem as text) as number)
    end repeat


    if chosenList is not {} then
        -- process each calendar chosen by the user

        repeat with nextChoice in chosenList
            set nextCal to calendarList's item nextChoice
            set calendarToExport to ProcessCalendar(nextCal's cID, nextCal's cName, nextCal's cKind)
            display alert (count of calendarToExport)
            export_to_vcard(calendarToExport)
        end repeat

    end if

end if

--set calendarToExport to get_calendar_to_export()
--display alert (count of calendarToExport)
--if (count of calendarToExport) is 0 then
--  display alert "Please select calendar to export and rerun script" as warning
--  return
--end if

-- Shall we export to ics?
set theFormat to "VCalendar"

if theFormat is icsFormat then
    --  export_to_ics(calendarToExport, theFormat)
else
    display alert "Invalid format" as warning
end if

return

-------------------------------------------
--  get_calendar_to_export()
--
--
on ProcessCalendar(calID, calName, calKind)

    tell application "Microsoft Outlook"
        set thisCalendar to calendar id calID
        set subjectList to every calendar event of thisCalendar
    end tell
    return subjectList
end ProcessCalendar

on ListCalendars()
    set cals to {}
    tell application "Microsoft Outlook"
        repeat with nextCal in the every calendar
            set the end of cals to {cID:nextCal's id, cName:nextCal's name, cKind:nextCal's class}
        end repeat
    end tell
    return cals
end ListCalendars

on get_calendar_to_export()

    set selectedCalendar to {}

    tell application "Microsoft Outlook"

        set theSelection to ListCalendars()
        set testval to theSelection as string
        display alert testval
        if class of theSelection is list then
            if class of the first item of theSelection is calendar then
                copy theSelection to selectedCalendar
            end if
        else
            if class of theSelection is calendar then
                copy theSelection to selectedCalendar
            end if
        end if
        --display alert selectedCalendar as text
        return selectedCalendar

    end tell

end get_calendar_to_export




-------------------------------------------
-------------------------------------------
--  export_to_ics()
--
--
on export_to_vcard(theCalendar)

    set vcalendars to {}

    tell application "Microsoft Outlook"
        -- set myCounter to 1
        repeat with aCalendar in theCalendar
            -- set fileNew to ("a:mycountfinal.ics")
            copy vevent of aCalendar to the end of vcalendars

        end repeat

    end tell

    set myCounter to 1
    repeat with aCard in vcalendars
        set fileNew to ("a:MyCont" & myCounter as string) & ".ics"
        set this_story to aCard
        set this_file to (((path to desktop folder) as text) & fileNew)
        my write_to_file(this_story, this_file, true)
        set myCounter to myCounter + 1
    end repeat
    display alert "Complete"
end export_to_vcard

on write_to_file(this_data, target_file, append_data) -- (string, file path as string, boolean)
    try
        set the target_file to the target_file as text
        set the open_target_file to ¬
            open for access file target_file with write permission
        if append_data is false then ¬
            set eof of the open_target_file to 0
        write this_data to the open_target_file starting at eof
        close access the open_target_file
        return true
    on error
        try
            close access file target_file
        end try
        return false
    end try
end write_to_file -------------------------------------------
--  replace_text()

on replace_text(sourceStr, searchString, replaceString)

    set searchStr to (searchString as text)
    set replaceStr to (replaceString as text)
    set sourceStr to (sourceStr as text)
    set saveDelims to AppleScript's text item delimiters
    set AppleScript's text item delimiters to (searchString)
    set theList to (every text item of sourceStr)
    set AppleScript's text item delimiters to (replaceString)
    set theString to theList as string
    set AppleScript's text item delimiters to saveDelims
    return theString

end replace_text

错误:

microsoft Outlook got an error : can't make vevent of calendar event id 5680 into type specifier 

1 个答案:

答案 0 :(得分:0)

好的,所以vevent实际上是一个日历事件列表,所以看起来你只需要遍历它们并将它们复制到新列表

-------------------------------------------
-------------------------------------------
--  export_to_ics()
--
--
on export_to_vcard(theCalendar)

    set vcalendars to {}

    tell application "Microsoft Outlook"
        -- set myCounter to 1
        repeat with anEvent in theCalendar
            -- set fileNew to ("a:mycountfinal.ics")
            copy  anEvent to the end of vcalendars
        end repeat

    end tell

    set myCounter to 1
    repeat with aCard in vcalendars
        set fileNew to ("a:MyCont" & myCounter as string) & ".ics"
        set this_story to aCard
        set this_file to (((path to desktop folder) as text) & fileNew)
        my write_to_file(this_story, this_file, true)
        set myCounter to myCounter + 1
    end repeat
    display alert "Complete"
end export_to_vcard