У меня было время, чтобы убить и насладиться странным испытанием.Поэтому я собрал решение, которое должно делать то, что вы ищете.Я разбью его по шагам.
ШАБЛОН
Триггер Zapier - Шаг 1
Тип: Триггер
Модуль: Gmail
Критерии: зависимые от пользователя
Комментарии: Для триггера zap вы захотите использовать специальный триггер Gmail, что-то вроде «выполнить триггер для писем с названием« xyz »» или «письма с меткой»xyz '", если вы установили фильтр в папке входящих сообщений.
Снимок экрана ввода: ![enter image description here](https://i.stack.imgur.com/wIuuK.png)
Снимок экрана вывода: ![enter image description here](https://i.stack.imgur.com/DKezZ.png)
Действие Zapier - Шаг 2
Тип: Действие
Модуль: Код (Python 3)
Комментарии: Код, предлагаемый Zapier, выполняет все (правильно написанное)код вы помещаете в его контейнер.Это особенно удобно, поскольку позволяет включать в него данные предыдущих шагов, используя словарную переменную с именем 'input_data'.Zapier предлагает модуль Code на двух языках: Javascript и Python.Поскольку я больше всего знаком с Python, мое решение для этого шага было написано на Python.Я добавлю код в конец этого ответа.Используя данные, содержащиеся в теле письма (полученные на шаге 1), мы можем выполнить некоторые операции со строками и преобразования даты и времени, чтобы разбить письмо на его составные части и передать их следующему шагу действия: Создать событие календаря.
Снимок экрана ввода: ![enter image description here](https://i.stack.imgur.com/wA8JG.png)
Снимок экрана вывода: ![enter image description here](https://i.stack.imgur.com/ibp4d.png)
Действие Zapier - Шаг 3
Тип: Действие
Модуль: Календарь Google - Создать событие
Комментарии: Используя данные, выведенные из предыдущего шага кода, мы можем заполнить необходимые поля для создания новой встречи.
Снимок экрана ввода:
Снимок экрана вывода:
КОД ПИТОНА
from datetime import timedelta, date, datetime
'''
Goal: Extract individual appointment details from variable length email
Steps:
Remove all extraneous and new line characters.
Isolate each individual appointment and group its relevant details.
Derive appointment start and end times using appointment time and duration.
Return all appointments in a list.
'''
def format_appt_times(appt_dict):
appt_start_str = appt_dict.get("appt_start")
appt_dur_str = appt_dict.get("appt_length")
# isolate hour and minutes from appointment time
appt_s_hour = int(appt_start_str[:appt_start_str.find(":")])
if ("pm" in appt_start_str.lower()):
appt_s_hour = 12 if appt_s_hour + 12 >= 24 else appt_s_hour + 12
appt_s_min = int(appt_start_str[appt_start_str.find(":") + 1 :
appt_start_str.find(":") + 3])
# isolate hour and minutes from duration time
appt_d_hour = 0
appt_d_min = 0
if ("h" in appt_dur_str):
appt_d_hour = int(appt_dur_str[:appt_dur_str.find("h")])
if ("m" in appt_dur_str):
appt_d_min = int(appt_dur_str[appt_dur_str.find("m") - 2 : appt_dur_str.find("m")])
# NOTE: adjust timedelta hours depending on your relation to UTC
# create datetime objects for appointment start and end times
time_zone = timedelta(hours=0)
tdy = date.today() - time_zone
duration = timedelta(hours=appt_d_hour, minutes=appt_d_min)
appt_start_dto = datetime(year=tdy.year,
month=tdy.month,
day=tdy.day,
hour=appt_s_hour,
minute=appt_s_min)
appt_end_dto = appt_start_dto + duration
# return properly formatted datetime as string for use in next step.
return (appt_start_dto.strftime("%Y-%m-%dT%H:%M"),
appt_end_dto.strftime("%Y-%m-%dT%H:%M"))
def partition_list(target, part_size):
for data in range(0, len(target), part_size):
yield target[data : data + part_size]
def main():
# Remove all extraneous and new line characters.
email_body = input_data.get("email_body")
head,delin,*email_body,delin,foot = [text for text in email_body.splitlines() if text != ""]
appointment_list = []
# Isolate each individual appointment and group its relevant details.
for text in partition_list(email_body, 4):
template = {
"appt_start" : text[0],
"appt_end" : None,
"appt_length" : text[1],
"appt_title" : text[2],
"appt_client" : text[3]
}
appointment_list.append(template)
for appt in appointment_list:
appt["appt_start"], appt["appt_end"] = format_appt_times(appt)
return appointment_list
return main()
Я не уверен, что вы знакомы с Python или программированием в более общем плане, но комментарии в коде объясняют, что делает каждый раздел.Если у вас есть какие-либо конкретные вопросы, касающиеся аспектов кода, дайте мне знать.Предполагая, что ваш шаблон электронной почты не меняет, эта настройка должна работать именно так, как нужно.Дайте мне знать, если что-то неясно.
ОБНОВЛЕНИЕ
Я подумал, что лучше всего ответить на ваш вопрос в первоначальном ответе, если у кого-то возникнут подобные вопросы.
Объяснениекак этот код удаляет лишние символы:
На самом деле в первой строке происходит немало, поэтому я сделаю все возможное, чтобы разбить его и предоставить ресурсы там, где это необходимо.
Код, о котором идет речь:
head,delin,*email_body,delin,foot = [text for text in email_body.splitlines() if text != ""]
Первым шагом здесь было разбиение текста на управляемые куски.Я сделал это со строкой email_body.splitlines()
, которая по умолчанию разбивает строки на список при каждом найденном символе новой строки (вы можете указать свой собственный разделитель).
Если бы мы проверяли список в этот момент,содержимое могло бы выглядеть следующим образом:
["================", "", "Today's Schedule", "", "9:30 AM", "", "3h", ..., "[Client #3 name]", "", "Projected Revenue", "", "==================="]
Вы заметите, что там есть достаточное количество информации, которая нам действительно не нужна.
Сначала давайте посмотрим наэлементы.Они остаются в результате пустых строк между каждой строкой текста, которые, даже если они не заполнены, в конце имеют символы новой строки.Есть несколько способов решить эту проблему в Python.Мы могли бы просто написать цикл for и скопировать все элементы, которые не "", в новый список.
Для меня это было дополнительной работой, и, кроме того, Python предлагает понимание списка именно для такого сценария.Я не буду слишком углубляться в понимание списка, поскольку о нем можно многое сказать, и более проницательным образом, чем я мог бы собрать, но это, по сути, позволяет вам предоставлять логику на основе набора «данных» для формированиясписок.В этом случае я специально хотел отфильтровать элементы "", возвращаемые вызовом splitlines ().
Итак, вы увидите, что я обращаюсь к этому со следующей строкой
[text for text in email_body.splitlines() <b>if text != ""</b>]
При этом у нас есть список, как указано выше, за исключением элементов "".Теперь мы должны обратить наше внимание на более «динамические» строки мусора.Опять же, есть несколько способов сделать это.Не особо гибкий вариант может заключаться в том, чтобы просто хранить строки, которые мы хотим удалить, в переменных с эффектом:
garb_1 = "==================="
garb_2 = "Projected Revenue"
garb_3 = ...
и еще раз фильтровать список с помощью еще одного цикла for.Вместо этого я решил использовать список Python для распаковки.Что позволяет нам «распаковывать» объекты списка (и, я полагаю, кортежи) в переменные.В качестве примера:
one, two, three = ["a", "b", "c"]
Я уверен, что вы можете догадаться, что происходит выше, если мы предоставим такое же количество переменных, как в списке, мы можем «распаковать» его таким способом.Но ждать!В нашем случае мы не знаем, как долго будет составляться список, поскольку он полностью зависит от количества назначений, которые у вас есть на любой день.Хорошо, это - то, где распаковка звезды входит, чтобы поднять функциональность.Используя мой код в качестве примера:
head,delin,*email_body,delin,foot = [text for text in email_body.splitlines() if text != ""]
* На простом английском языке говорит: «Я не знаю, сколько элементов ожидать, просто дайте мне все из них в списке».Поскольку мы знаем, что в начале и в конце электронного письма всегда будет две строки мусора, мы можем назначить их для отбрасывания переменных и захвата всего между ними, используя наш контейнер переменной длины * email_body.
Со всемитеперь у нас есть список, содержащий только те данные, которые мы хотим получить.Если, как вы говорите, до или после email_body есть дополнительные строки мусора, вы можете просто добавить дополнительные отбрасывающие переменные, чтобы учесть их.
Еще раз не стесняйтесь задавать любые последующие вопросы.
Майкл
Ресурсы
Понимание списка
Распаковка звезд