Бывают случаи, когда данные вы получаете через вложение электронной почты – например, вы работаете в FMCG или фармацевтической компании и еженедельно (ежемесячно) получаете отчеты в едином формате по почте от дистрибьюторов. Сегодня расскажу о способе автоматизации выгрузки таких данных из ящика сразу в QlikView или Qlik Sense.
НА ЗАМЕТКУ! Для удобства работы, предлагаю вам обзавестись отдельным адресом для получения данных.
Вариант №1: макрос
Процесс
- Данные запускаются через скрипт ежедневно.
- Письмо приходит регулярно в одно и то же время (с разницей в 5 минут).
- Письмо приходит, а вложение (источник данных) сохраняется на сетевой диск.
- Планировщик QlikView стартует через 20 минут после получения письма и обновляет данные в модели.
Макрос
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Public Sub qlikviewSaveExternal(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim saveFolder As String saveFolder = "\\eundas01\Apps_Usr\Qlikview_Data\COMPANY\" For Each objAtt In itm.Attachments if InStr(objAtt.DisplayName, ".csv") Then objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName end if Next End Sub |
Формат файла можно заменить на тот, в котором у вас приходят источники данных.
За и против
Недостаток такого решения, что скрипт нужно запускать через правило в Outlook, а Outlook должен быть запущен постоянно. Т.е. если мы говорим о полной автоматизации процесса, есть одно ограничение (необходимость работы Outlook 24/7), т.к. схема не может работать как автоответ.
Установка правил
Как установить правила в почте – каждый решает сам. У меня почтовый клиент настроен на проверку двух вещей:
- Тема письма
- Наличие вложения
Вот и все! Такой скрипт поможет автоматически загружать данные в QlikView.
Вариант №2: Qlik Mailbox Коннектор
С недавнего времени появился второй бесплатный способ автоматизации загрузки вложений из электронных писем в QlikView – при помощи Qlik Mailbox Коннектора. Подключение происходит при помощи POP3 and IMAP, что безусловно удобно.
В зависимости от задачи, вас будут интересовать опции в коннекторе:
- ImapMessageAttachments или Pop3MessageAttachments
- ImapMessageDownloadAttachment или Pop3MessageDownloadAttachment
- ImapMessageGetAttachmentAsText или Pop3MessageGetAttachmentAsText
- ImapMessageGetAttachmentAsBinary или Pop3MessageGetAttachmentAsBinary
Пример скрипта для Коннектора
Пример скрипта для скачивания всех вложений со всех e-mail-ов в определенной папке на локальную машину для загрузки в Qlik:
SET ThousandSep=’,’; | |
SET DecimalSep=’.’; | |
SET MoneyThousandSep=’,’; | |
SET MoneyDecimalSep=’.’; | |
SET MoneyFormat=’£#,##0.00;-£#,##0.00′; | |
SET TimeFormat=’hh:mm:ss’; | |
SET DateFormat=’DD/MM/YYYY’; | |
SET TimestampFormat=’DD/MM/YYYY hh:mm:ss[.fff]’; | |
SET MonthNames=’Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec’; | |
SET DayNames=’Mon;Tue;Wed;Thu;Fri;Sat;Sun’; | |
NOTE — In this script the server, username, password etc. have been | |
stripped from the request URLs as the connector will then | |
automatically pick out those configured in the connector UI. | |
*******************************************************************/ | |
// | |
// QlikView/Qlik Sense must have write access to this location. | |
// | |
let vDownloadFolder = ‘C:\Users\YOUR_USER_NAME\Desktop\’; | |
// | |
// Edit this if you running Qlik Web Connectors on a different port. | |
// | |
let vQlikWebConnectorBase = ‘http://localhost:5555/web’; | |
// | |
// Email folder to process. | |
// | |
let vFolderToSearch = ‘Inbox’; | |
MessagesInFolder: | |
LOAD | |
id, | |
UID, | |
inReplyTo, | |
folder, | |
to, | |
cc, | |
bcc, | |
from, | |
subject, | |
sent, | |
text, | |
html, | |
size, | |
attachments, | |
gmailMessageId, | |
gmailThreadId, | |
gmailLabels | |
FROM | |
[$(vQlikWebConnectorBase)/QlikMailBoxConnector/?table=ImapMessagesInFolder&appID=&Folder=$(vFolderToSearch)] | |
(qvx) where attachments > 0; | |
Let noRows = NoOfRows(‘MessagesInFolder’); | |
for i=0 to $(noRows)-1 | |
let vID = peek(‘id’,$(i),’MessagesInFolder’); | |
let vUID = peek(‘UID’, $(i), ‘MessagesInFolder’); | |
let vFolder = peek(‘MessagesInFolder’, $(i), ‘MessagesInFolder’); | |
Attachments: | |
LOAD | |
‘$(vID)’ as id, | |
‘$(vUID)’ as AttachmentUID, | |
‘$(vFolder)’ as AttachmentFolder, | |
FileName as AttachmentFileName | |
FROM | |
[$(vQlikWebConnectorBase)/QlikMailBoxConnector/?table=ImapMessageAttachments&appID=&Folder=$(vFolder)&MessageID=$(vUID)] | |
(qvx) where FileName <> »; | |
NEXT | |
LET noRows = NoOfRows(‘Attachments’); | |
for i=0 to $(noRows)-1 | |
let vID = peek(‘id’,$(i),’Attachments’); | |
let vFolder = peek(‘AttachmentFolder’, $(i), ‘Attachments’); | |
let vUID = peek(‘AttachmentUID’, $(i), ‘Attachments’); | |
let vFilename = peek(‘AttachmentFileName’, $(i), ‘Attachments’); | |
// | |
// Note — we use the UID here as we need something unique to prevent attachments with the same name overwriting previous ones. | |
// | |
let vTarget = ‘$(vDownloadFolder)$(vUID)_$(vFilename)’; | |
trace ‘About to download $(vFilename) in email $(vUID) to $(vTarget)’; | |
Downloads: | |
LOAD | |
‘$(vID)’ as id, | |
‘$(vUID)’ as Downloads_UID, | |
Status as Downloads_Status, | |
‘$(vFilename)’ as Downloads_Filename | |
FROM | |
[$(vQlikWebConnectorBase)/QlikMailBoxConnector/?table=ImapMessageDownloadAttachment&appID=&MessageID=$(vUID)&AttachmentFileName=$(vFilename)&TargetPath=$(vTarget)&Folder=$(vFolder)] | |
(qvx); | |
next i |
О Qlik Mailbox Коннекторе можно прочитать в нашем обзоре бесплатных веб-коннекторов Qlik (ранее – QVSource) или в официальном хэлпе Qlik.
На этом на сегодня все! Хороших вам разработок!
День добрый.
Спасибо.
Можно еще и такой код использовать в качестве сценария в Outlook :