Время прочтения: 2 мин.

Авторасчёт периода для формирования отчета.

Итак, нам требуется отчет, содержащий данные за всю прошлую неделю. Определяем даты (в нашем случае с прошлого понедельника до воскресенья). Нам поможет модуль datetime.

prWeek = timedelta(weeks=1)
prMon = timedelta(days=datetime.date(datetime.now()).weekday())
prSun = timedelta(days=6)

dstart = datetime.date(datetime.now()) - prWeek - prMon
dend = dstart + prSun

Запускаем выгрузку данных, обрабатываем их и приводим отчет к нужному виду. Подробнее об этом мы писали в одной из предыдущих статей Так ли вы «любите» отчеты, как «любим» их мы? Создаем отчет с помощью ExcelWriter

 Перемещение файла.

Получив готовый отчет, перемещаем его в папку назначения, используя библиотеку shutil.

shutil.copyfile(old_path + f'{file_name}', new_path + f'{file_name}')

Рассылка в Outlook.

Осталось только сделать рассылку на весь отдел. Читаем файл с сотрудниками и создаём список с их адресами.

df = pd.read_excel(r"address.xlsx")
address_list = ''.join(df.mail)

Составляем и отправляем письмо модулем win32com.

app = win32com.client.Dispatch("Outlook.Application")
mess = app.CreateItem(0)
mess.To = address_list
mess.Subject = 'Отчёт'
mess.HTMLBody = f'''
<HTML>
     <BODY>
          <font face='Calibri'>
               Добрый день, коллеги!<br>
          <a href={path}>
               Отчёт за неделю готов
          </a>
          </font>
     </BODY>
</HTML>'''
mess.Send()

Автозапуск по расписанию.

И, конечно же, программируем автозапуск нашего скрипта каждый понедельник в 10:00 с использованием модуля schedule.

def job():
    report()
   
schedule.every().monday.at("10:00").do(job)

while True:
    schedule.run_pending()

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