Applescript或Shell脚本从电子邮件中提取文本和日期并进行日历事件

时间:2018-12-09 23:51:54

标签: bash calendar applescript automator

我需要创建一个脚本,该脚本接受格式一致的会议室预订请求-名称,日期,时间,持续时间,房间号-(均在单独的行上),并创建一个包含相同信息的Calendar Event。它会作为Apple Mail中的规则自动运行。

我了解AppleScript和Bash脚本编写的基础知识,并且已经对这个问题进行了广泛的研究,但是我很困惑。我可以使用自动执行器快速操作来提取日期,该操作将获取所有文本,提取日期,然后将结果传递给此Applescript,但只会在指定的日期创建日历事件,而没有开始或结束时间,并且没有名称和房间号等变量。我一直无法通过尝试设置和获取这些变量来添加该信息:


on run {input, parameters}

    set dateString to the clipboard
    set start_date to date (dateString)
    set end_date to date (dateString) 

    tell application "Calendar"
        tell calendar "Local"
            make new event at end with properties {summary:"PersonName", start date:start_date, end date:end_date}
        end tell
    end tell 

    return input
end run

任何建议将不胜感激。谢谢。


12-10-18

主持人要求我以准确的格式提供示例用例数据。希望我能正确回应。该数据在电子邮件的正文中显示为:


    Name: [person's name]
    Date: [reservation date]
    Room Number: [requested meeting room number]
    Start Time: [start time]
    End Time: [end time]

2 个答案:

答案 0 :(得分:0)

由于我对Applescript一无所知,因此我将为您提供一种完全不同的方法。考虑创建一个.ICS文件。然后,您可以通过发出“打开<.ics文件>”命令将事件添加到日历中。

我使用python创建了.ics文件:这是我的导入文件:

# toggle between the two definitions
environment(StatBoxplot$compute_group)$f <- original.function
ggplot(u, aes(x = A, y = B, group = A)) +
  geom_boxplot() +
  ggtitle("original definition for calculated quantiles")

environment(StatBoxplot$compute_group)$f <- new.function
ggplot(u, aes(x = A, y = B, group = A)) +
  geom_boxplot() +
  ggtitle("new definition for calculated quantiles")

如果您不喜欢python,可能会发现另一种创建.ics文件的方法,而不是python。例如,另一种方法可能包括以bash替换here文档中的变量。您可以根据从日历中导出的.ics文件生成模板。

您可能会发现.ics文件也更易于移植。 .ics是许多日历系统(某些情况下为Apple)理解的标准格式。

在我的简单项目中,我生成了一个.ics文件,用于保存从电子表格导入的网球赛事。然后,我可以通过电子邮件将.ics发送给所有参与者,以便他们可以将其加载到他们正在使用的任何日历中。

答案 1 :(得分:0)

您要解决2个问题:1)从电子邮件文本中提取/检查数据2)在iCal中从数据创建新事件。

您已经完成了第二部分:根据数据创建日历事件。

到目前为止,最困难的部分是从电子邮件正文中的非结构化自由文本(甚至是有价值的文本!)中提取数据。这是下面的脚本中的第一个子例程的角色。

它使用带“:”的Applescript文本项定界符,并且我添加了其他定界符,因为电子邮件的内容不是文本,而是富文本(包括返回,换行等)。我假设带有“名称”的文本行后面必须带有“:”和名称(一个或几个单词)。房间和日期相同。对于开始/结束时间,该行必须包含“开始” /“结束”,并且在“:”之后,我假设时间设置为小时:分钟。

例如,波纹管有效:

Name: Stackoverflow 
Date: 21/12/18 
Start Time: 13:30 
End Time: 15:45
Room Number: Board Room 

注意:这些行可以按任何顺序排列。房间号是最后一行。

在下面的脚本中,我假设要使用的电子邮件是“邮件”中选择的第一封电子邮件。由您自行调整。

property myCalendar : "Local"

tell application "Mail" -- extract the selected email and get its content as list of paragraphs
    set mySelection to selection
    set myMail to first item of mySelection
    set myLines to every paragraph of (content of myMail)
end tell

set myEvent to ExtractfromRichText(myLines) -- parse the paragraphs to make a record {EName, ERoom,EStart,EEnd}
if EName of myEvent is not "" then CreateNewEvent(myCalendar, myEvent)
-- end of main

-- *******************
on ExtractfromRichText(LocalLines) -- convert the rich text with fixed format into a data set
    set AppleScript's text item delimiters to {":", return & linefeed, return, linefeed} -- to remove all rich text end lines
    repeat with aLine in LocalLines
        try
            if text item 1 of aLine contains "Name" then set LName to text item 2 of aLine
            if text item 1 of aLine contains "Date" then set LDate to date (text item 2 of aLine)
            if text item 1 of aLine contains "Room" then set LRoom to text item 2 of aLine
            if text item 1 of aLine contains "Start" then
                copy LDate to LStart
                set hours of LStart to ((text item 2 of aLine) as integer)
                set minutes of LStart to (word 1 of (text item 3 of aLine) as integer)
            end if
            if text item 1 of aLine contains "End" then
                set LEnd to LDate
                set hours of LEnd to ((text item 2 of aLine) as integer)
                set minutes of LEnd to (word 1 of (text item 3 of aLine) as integer)
            end if
        on error -- unexpected format
            log "error"
            return {EName:""} -- not proper email format for calendar events. return empty name
        end try
    end repeat
    return {EName:LName, ERoom:LRoom, EStart:LStart, EEnd:LEnd}
end ExtractfromRichText

-- *******************

on CreateNewEvent(LCalendar, LEvent)
    tell application "Calendar" to tell calendar LCalendar
    make new event at end with properties {summary:EName of LEvent, location:ERoom of LEvent, start date:EStart of LEvent, end date:EEnd of LEvent}
    end tell
end CreateNewEvent