Nano Hash - криптовалюты, майнинг, программирование

Applescript или сценарий оболочки для извлечения текста и даты из электронной почты и создания события календаря

Мне нужно создать сценарий, который принимает запрос на бронирование конференц-зала в единообразном формате — имя, дату, время, продолжительность, номер комнаты — (все в отдельных строках) и создает событие календаря, содержащее ту же информацию. Он будет запускаться автоматически как правило в Apple Mail.

Я понимаю основы сценариев AppleScript и Bash и исследовал этот вопрос вдоль и поперек, но я в тупике. Я могу извлечь дату с помощью быстрого действия Automator, которое берет весь текст, извлекает дату, а затем передает результат этому 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]


  • Пожалуйста, предоставьте пример данных прецедента в точном формате, который вы будете использовать. Окружите данные тегами <pre> в начале и </pre> в конце, чтобы поместить их в блок кода. Отредактируйте вопрос, чтобы сделать это, не добавляйте его в раздел комментариев. Большое спасибо. 10.12.2018
  • Спасибо за то, что вы предоставили, но этого недостаточно. Важно, чтобы фактические данные предоставлялись в полях, чтобы предоставить нам форматы даты и форматы времени во всех возможных вариантах. Кроме того, подтвердите, что каждая строка начинается с 4 пробелов перед текстом? 11.12.2018

Ответы:


1

Поскольку я ничего не знаю об Applescript, я предложу вам совершенно другой подход. Рассмотрите возможность создания файла .ICS. Затем вы сможете добавить событие в календарь, выполнив команду «открыть файл ‹.ics>».

Я создал свой файл .ics с помощью python: вот мой импорт:

from ics import Calendar, Event

Вы можете найти другой подход для создания файла .ics, отличный от python, если python вам не подходит. Например, другой подход может состоять в замене переменных в документе здесь в bash. Вы можете создать шаблон из файла .ics, который вы экспортируете из своего календаря.

Вы также можете обнаружить, что файл .ics более переносим. .ics — это стандартный формат, понятный многим календарным системам (конечно, Apple).

В моем простом проекте я создал файл .ics для хранения теннисных событий, импортированных из электронной таблицы. Затем я смог отправить .ics по электронной почте всем участникам, чтобы они могли загрузить его в любой календарь, который они использовали.

10.12.2018
  • Спасибо, Марк. Это подход, который я не рассматривал, но он может быть проще. Я изучу это сегодня вечером. 10.12.2018
  • pbell: Большое спасибо. Просто беглый взгляд на этот код показал мне некоторые вещи, которые я делал неправильно. Ваши предположения были правильными. Я попробую этот сценарий сегодня вечером и отчитаюсь. Я очень ценю, что вы ответили, и так подробно. 12.12.2018
  • CJK — Образец данных, который я включил, точно соответствует тому, как данные отображаются в теле письма, за вычетом скобок. Каждая строка НЕ ​​имеет четырех пробелов перед ней в фактическом электронном письме. Когда я добавлял этот комментарий, очевидный скрипт на этом сайте предложил мне добавить четыре пробела перед каждой строкой. Тело письма состоит из пяти строк, каждая с указанным заголовком; за каждым заголовком следует двоеточие; и каждое двоеточие, за которым следует указанное слово (слова), дата и время. 12.12.2018
  • @Alex Да, но вы не указали, как форматируются даты и время. Это 12/04/2018, 2018-04-12, 04-12-2018, 4 December 2018 и т. д.? А раз? 12:30 PM, 16.30, 4.30PM, 16:30:00 и т. д.? Вот почему важно иметь актуальные данные. Я мог бы решить вашу проблему неделю назад, если бы вы предоставили эту информацию. (PS. Отметьте пользователя символом @, чтобы он получил уведомление о вашем ответе.) 15.12.2018
  • CJK - Извините, я неправильно понял ваш вопрос. Формат даты: 15.12.18. Формат времени: 16:30. Я могу изменить один или оба формата, если это будет полезно. Спасибо. 16.12.2018

  • 2

    Вам нужно решить 2 проблемы: 1) извлечь/проверить данные из текста электронной почты 2) создать новое событие в iCal из данных.

    Вы уже сделали вторую часть: создали событие календаря из данных.

    Безусловно, наиболее сложной частью является извлечение данных из неструктурированного произвольного текста (даже ценного, потому что это форматированный текст!) в теле письма. Это роль 1-й подпрограммы в сценарии ниже.

    Он использует разделители текстовых элементов Applescript с «:», и я добавляю другие разделители, потому что содержимое электронной почты — это не текст, а форматированный текст (включая возвраты, перевод строки и т. д.). Я предполагаю, что за строкой текста с «Именем» должно следовать «:» и имя (одно или несколько слов). То же самое для комнаты и даты. Для времени начала/окончания строка должна содержать «Начало»/«Конец», а после «:» я предполагаю, что время установлено в часах:минутах.

    Например, тело ниже действительно:

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

    Примечание: строки могут быть в любом порядке. здесь номер комнаты - последняя строка.

    В приведенном ниже сценарии я предполагаю, что используемая электронная почта является первой электронной почтой, выбранной в Mail. До вас, чтобы настроить эту часть.

    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
    
    10.12.2018
  • pbell: Я отправил себе тестовое письмо с таким же содержимым, как у вас, скопировал приведенный выше сценарий и сохранил его в папке сценариев в почтовой программе. Затем я выбрал это письмо и запустил скрипт. Хотя сценарий работает и не возвращает никаких ошибок, он не делает записи в календаре. Мой тестовый календарь называется Rooms. Я попытался изменить LCalendar в четвертой строке снизу на это, но это ничего не изменило. Неужели мне не удалось сделать какую-то элементарную адаптацию, подобную этой? 13.12.2018
  • Если имя вашего календаря — «Комнаты», вам просто нужно заменить в 1-й строке «Локальный» на «Комнаты». Я установил Local раньше, потому что это было в вашем примере. 14.12.2018
  • pbell: Я внес это изменение, но запись в календаре по-прежнему отсутствует. 16.12.2018
  • Я предполагаю, что вы проверили имя календаря (точно такое же написание / буквы). Тогда это, вероятно, данные вашей электронной почты. В подпрограмме ExtractfromRichText вы можете видеть, что она проходит через каждую строку почты и пытается найти ключевые слова «Имя», «Дата», «Комната», «Начало», «Конец». Каждая строка, содержащая одно из этих слов, должна сопровождаться знаком «:». Добавьте журнал в цикл, чтобы проверить, что находится после этих ':' (текстовый элемент 2). Имейте в виду, что после даты должна быть действительная дата, а после начала/конца это должны быть 2 числа, также разделенные ':', например 15:30. Журнал расскажет вам, где произошел сбой и почему. 16.12.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..