Páginas

lunes, 24 de agosto de 2015

VBA Outlook: Como ejecutar una macro sobre un correo nuevo (entrante)

Como identificas el ultimo correo recibido? con el metodo GetLast del objeto Items

Esta macro lee el titulo del ultimo mail y busca si contiene la palabra "EMAILTEST".
De ser así, ejectuta un proceso. En este caso toma el nombre del remitente, elimina los espacios y lo envia como argumento a un programa de Python.

Sub BOQCOST()

Set ns = Application.GetNamespace("MAPI")
Set fold = ns.GetDefaultFolder(olFolderInbox) 'selecciona la carpeta Inbox
Set mensajenuevo = fold.Items.GetLast 'Obtiene el nuevo email que ingresa

If mensajenuevo.Subject = "EMAILTEST" Then 'Testea la plabra clave en el titulo 
    Set user = mensajenuevo.Sender.GetExchangeUser
    user = Replace(user.Name, " ", "")'elimina los espacios
    Shell ("python D:\myScripts\script.py " & user)
End If

End Sub 
 
Ahora, como ejecutamos esta macro sobre cada mail entrante?
Vamos a ThisOutlookSession, seleccionamos "Application" y "NewMail" 
Allí escribimos un call a la macro, de esta manera:
 

Private Sub Application_NewMail()
    Call BOQCOST
End Sub

Python: Funcion para enviar un correo desde outlook

'''
Envia un correo, se pueden incluir un archivo adjunto
de manera opcional, los argumentos son todos strings
'''
from win32com import client

#en la funcion, el mensaje y adjunto son opcionales
def enviarCorreo(destinatario, titulo, copy = None, mensaje = None, adjunto = None):
    ol = client.Dispatch("Outlook.Application")
    mail = ol.CreateItem(0)
    mail.To = destinatario
    mail.Subject = titulo
    if not copy is None:
        mail.CC = copy
    if not mensaje is None:
        mail.Body = mensaje
    if not adjunto is None:
        mail.Attachments.Add(adjunto)
    mail.Send()

if __name__ == '__main__':
    enviarCorreo(destinatario, titulo, copy = None, mensaje = None, adjunto = None)


domingo, 9 de agosto de 2015

Python: Manipular una pagina web con Selenium


La libreria selenium tiene controles que permiten manipular una pagina web como si una persona la estuviera ex

#Descarga facturas desde el sistema

from selenium import webdriver
from selenium.webdriver.support.ui import Select


#Para crear el explorador, de Firefox en este caso
browser = webdriver.Firefox()

#navega a la pagina
browser.get('http://www.cualquierpagina.com')

#ubica los campos de usuario y contrasena por su ID
user = browser.find_element_by_id('uid')
pswd = browser.find_element_by_id('password') 
 
#escribe los valores con el metodo 'send_keys'
user.send_keys("r00715649")
pswd.send_keys('Huawei?2')

#asi se ejectutan los scripts, como los de los botones 'ingresar'
browser.execute_script('javascript:form_submit();')

#a veces un script abre una ventana pop up
#la propiedad 'window_handles' enlista las ventanas abiertas 
#cambia el focus a la segunda ventana abierta en la lista (la del pop up)
browser.switch_to.window(browser.window_handles[1])

#ubico cualquier elemento en la ventana del pop up
role = browser.find_element_by_id('user_role/user_role_xid')

#puedo borrar el contenido de un campo
#puedo pasar otro valor, ejecutar una funcion y cerrar el pop up.
role.clear()
role.send_keys('REGIONAL_VIEW_ALL')
browser.execute_script("javascript:submitUserRole('set');")
browser.close()

#vuelvo a la ventana inicial
browser.switch_to.window(browser.window_handles[0])
browser.refresh()

#puedo seleccionar elementos de una lista
#primero creo un objeto 'Select' con el elemento de lista por su nombre o ID
lista = Select(browser.find_element_by_name('P_ARRIVE_AT_PORT_DATE_operator'))
 
#luego paso el metodo 'select_by_value' y listo
lista.select_by_value('gt')
browser.execute_script("javascript:if(nextdate()){disableButtonByName('submit_report',Generating); document.management_main.submit();}")

jueves, 6 de agosto de 2015

Python: Como instalar Pandas (y paquetes con la extension .whl y .egg)

Estuve sufriendo un buen rato con esto. Primero instalé una distribucion llamada Anaconda, pero me causó algunos conflictos con mis scripts viejos, por lo que desisntalé.

Así que seguí investigando y descrubrí los archivos tipo "Wheel".

En Windows, normalmente uno baja el paquete, extrae la carpeta, ingresa a la carpeta con el terminal y digita C:\Python27>python setup.py install

Tambien hay una forma mucho mas facil de instalar los paquetes de Python, que es con "pip". Bastaría solo con ejecutar este comando en el terminal:

C:\Python27>pip install pandas

Pero mi máquita presentó problemas para conectarse al servidor por lo que me rebotaba el siguente error:

C:\Python27>pip install pandas
Downloading/unpacking django-autotranslate
  Cannot fetch index base URL https://pypi.python.org/simple/
  Could not find any downloads that satisfy the requirement pandas

Bueno pues, como "pip" no pudo acceder al servidor y descargar los paquetes, me tocó hacerlo manualmente.

Con los paquetes "Wheel" solo hay que descargarlos en la carpeta de Pyhton, ingresar con el terminal y digitar C:\Python27>pip install nombre_del_paquete.whl lo cual es tedioso pero no complicado.

Pandas necesita que otros módulos estén instalados, por lo que tuve que ir en este orden:

six 1.9.0
python-dateutil 2.4.2,
pytz 2015.4 (descargué el archivo .egg en el directorio de Python y luego lo instalé con c:\Python27>easy_install pytz-2015.4-py2.7.egg)
NumPy
Matplotlib
Scipy

Se imaginarán mi satisfacción cuando pude descargar el wheel de Pandas e instalarlo con este comando:

C:\Python27>pip install pandas-0.16.2-cp27-none-win32.whl

Ahora si, el camino está despejado para calcular todos esos KPIs de manera automática aprovechando las herramientas que proporciona esta librería.