
Trabajando con lunes.com a través de VBA Automation
Recientemente me he divertido un poco de diversión automatizando una base de datos con Monday.com para un cliente. Nunca había usado lunes.com, pero lo estaban usando y querían integrar información de mi sistema en él. Por lo tanto, necesito desarrollar un mecanismo de sincronización para crear entradas, actualizar entradas y eliminar entradas.
Ahora, el trabajo que he estado haciendo es en realidad parte de una aplicación web, así que programado en PHP, pero pensé para mí mismo que, dado el trabajo que hice al usar la API REST de Outlook, así como la API de Google REST, que lo que había logrado en PHP, podría traducirme a VBA para usar en cualquier aplicación de mi elección.
Un par de horas más tarde, tenía una base de datos de acceso completamente funcional capaz de consultar lunes.com, buscar información, crear entradas, actualizar entradas y eliminar entradas.
oauth y fichas
Ahora, no voy a superar todas las cosas de la API del resto aquí. Para eso, te referiría a mis artículos/videos anteriores:


Entonces, en este artículo, supongo que se ha autenticado correctamente y tiene un token para trabajar.
Para obtener su código de autorización
Para conseguir tu token
Puede consultar la documentación oficial de OAuth para obtener todos los detalles en:

También tenga en cuenta que la implementación de OAuth de Monday.com parece ser muy básica, de ninguna manera verificar un token (además de usarlo), de ninguna manera para renovar o invalidar un token. Entonces, básicamente, implica que una vez que genera un token, es válido indefinidamente. Por lo tanto, realizar esta tarea manualmente una vez o usar el token proporcionado de la manera fácil (ver más abajo) puede ser la mejor opción.
Integración VBA de lunes.com
Consulta lunes.com
Lo primero que debe entender con interactuar con Monday.com es que todo se hace a través de una consulta. Por lo tanto, debe crear una consulta, enviarla a Monday.com y luego verificar la respuesta que se le envía.
Afortunadamente para su uso, una vez más, Monday.com nos ha ayudado de alguna manera con nuestra tarea de desarrollar nuestra consulta (IES) proporcionándonos una interfaz para crearlas/probarlas. Lo llaman el ‘Playground API’ (desarrolladores-> API Playground). Allí tiene un editor de consultas para probar variaciones, ejecutar, ajustar, … ¡Una vez que lo tenga funcional, puede traerlo a VBA!
¡El patio de juegos API permite que se creen y almacenan múltiples consultas en pestañas separadas, lo cual es realmente conveniente!
El procedimiento VBA
Aquí hay un marco de procedimiento simple para trabajar con la API REST de Monday.com a través de VBA.
Public Sub HTTP_SendRequest_Monday() On Error GoTo Error_Handler Dim oHTTP As MSXML2.XMLHTTP60 Dim sHTTPRequest As String Dim sMondayQuery As String Const sToken = "PutYourMonday.comTokenHere" 'Initialize our variables lHTTP_Status = 0 sHTTP_StatusText = "" sHTTP_ResponseText = "" 'Define the Monday.com REST API query sMondayQuery = "query { me { name } }" 'Finalize the actual REST API request string sHTTPRequest = "{""query"": """ sHTTPRequest = sHTTPRequest & sMondayQuery sHTTPRequest = sHTTPRequest & """}" 'Make the request and get a response back Set oHTTP = New MSXML2.XMLHTTP60 With oHTTP Call .Open("POST", " Call .setRequestHeader("Content-Type", "application/json") Call .setRequestHeader("Authorization", sToken) Call .send(sHTTPRequest) lHTTP_Status = .Status sHTTP_StatusText = .StatusText sHTTP_ResponseText = .responseText Debug.Print "URL: " & " Debug.Print "Request: " & sHTTPRequest Debug.Print "Status: " & lHTTP_Status & " | " & sHTTP_StatusText Debug.Print "Response: " & sHTTP_ResponseText End With Error_Handler_Exit: On Error Resume Next Set oHTTP = Nothing Exit Sub Error_Handler: MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _ "Error Source: HTTP_SendRequest_Monday" & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Description: " & Err.Description & _ Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _ , vbOKOnly + vbCritical, "An Error has Occurred!" Resume Error_Handler_Exit End Sub
Ejecutar esto luego generará algo como:
URL: Request: {"query": "query { me { name } }"} Status: 200 | OK Response: {"data":{"me":{"name":"Daniel"}}}
Normalmente solo está realmente después de los valores SHTTP_RponsExtext, pero para fines ilustrativos y de aprendizaje también hice que el procedimiento devolviera otra información.
Más consultas que dices
Como mencioné anteriormente, todo se basa en la consulta, por lo que una vez que tiene el procedimiento básico, lo único que realmente debe hacer es cambiar la consulta que se envía a lunes.com, ¡el resto del procedimiento no cambia! Con eso en mente, aquí hay algunos ejemplos de consultas para ayudarlo a comprender y ponerse en marcha.
Identificar al usuario actual
Como se muestra arriba, podemos identificar fácilmente al usuario actual con una consulta como:
sMondayQuery = "query { me { name } }"
Pero, si lo desea, también puede recuperar otra información sobre el usuario actual simplemente agregando las columnas de los datos que desea recuperar, como:
sMondayQuery = "{ me { id name birthday } }"
Enumere los tableros
Para enumerar todos los tableros, podríamos hacer algo como:
sMondayQuery = "query ListAllBoard { boards { id name board_kind } }"
Obtenga detalles de tableros
Otra cosa útil, poder trabajar con una placa (realizar operaciones CRUD en los elementos dentro de una placa) es analizar una placa y sus columnas. Para hacer esto, podemos usar una consulta como:
sMondayQuery = "query ListContactBoardColumns{ boards(ids: (YourBoardId)) { name columns { title id type } } }"
¡Esto le permitirá identificar las ID de las diversas columnas que es fundamental para poder trabajar con ellas!
Recuperar los detalles de una entrada
Entonces, digamos que tiene una placa de contactos con una lista de contactos. Digamos que quería obtener una lista de las entradas, podría hacer:
sMondayQuery = "query ListContactsDetailed { boards(ids: (YourBoardId)) { items_page { items { id name } } } }"
o para obtener más detalles sobre cada entrada, puede hacerlo (ajustar los nombres de su columna, por supuesto):
sMondayQuery = "query ListContactsDetailed { boards(ids: (YourBoardId)) { items_page { items { id name column_values { id column { title } type value text } } } } }"
Esto le proporcionará un desglose de los contactos actuales en la placa especificada
Si, en lugar de querer obtener una lista de todas las entradas que quería buscar una entrada específica, digamos que se busca por primer nombre y apellido, podría hacer algo como:
sMondayQuery = "query GetSpecificContactDetailsByName{ items_page_by_column_values( board_id: YourBoardId columns: ({column_id: \""text_mkpeqqsr\"", column_values: (\""Erik\"")}, {column_id: \""text_mkperft3\"", column_values: (\""Higgins\"")}) ) { cursor items { id name } } }"
Donde text_mkpeqqsr es la ID de mi columna de primer nombre y text_mkperft3 es la ID de mi columna de apellido.
Creando una nueva entrada en un tablero
Crear una entrada también es relativamente simple, una vez que conoce la sintaxis de la consulta.
sMondayQuery = "mutation { create_item(board_id: YourBoardId, item_name: \""John Doe\"", column_values: \""{\\\""text\\\"": \\\""AYZ Inc\\\"", \\\""text_mkpeqqsr\\\"": \\\""John\\\"", \\\""text_mkperft3\\\"": \\\""Doe\\\""}\"" ) { id } }"
Esto creará una entrada etiquetada como ‘John Doe’ con un primer nombre de ‘John’ y un apellido de ‘Doe’.
Modificar una entrada existente
Para modificar una entrada, buscaríamos el registro para determinar la ID y luego se uniremos a esa ID para realizar la actualización haciendo:
sMondayQuery = "mutation UpdateContactEmail { change_simple_column_value( board_id: YourBoardId item_id: YourContactId column_id: \""email\"" value: \""j.doe@somewhere.com j.doe@somehwere.com\"" ) { id } }"
Eliminar una entrada en un tablero
La eliminación es muy sencilla y solo necesita la identificación de la entrada para eliminar. La sintaxis básica sería:
sMondayQuery = "mutation DeleteContact{ delete_item(item_id: YourContactId) { id } }"
Algunos pensamientos finales
Debo decir que Monday.com parece haber hecho el acceso inicial para automatizar las cosas lo más simples posible al proporcionar un token directamente a través de su cuenta, evitando la necesidad de codificar cualquier proceso de OAuth en su proyecto. Dicho esto, ¡tenga mucho cuidado con cómo codifica/almacena una información tan confidencial!
También debo aplaudirlos para el patio de la API. ¡Aquí es donde pasé la mayor parte de mi tiempo aprendiendo cosas! Una vez que me funcionó allí, la migración a PHP, o VBA, fue relativamente simple.
Sintaxis. Bueno, esto es una cosa que a veces tardó un poco en darse cuenta, o buscar en línea. Tuve problemas con su documentación (pero eso podría ser solo yo, ya que era nuevo para mí) y a menudo me resultaba más fácil realizar una búsqueda en línea para localizar una discusión … de la cual podía aprender cosas, o mediante prueba y error en el patio de juegos API.
Sintaxis PHP/VBA. Bueno, si revisó el procedimiento VBA, probablemente notó que establecemos un encabezado en «Aplicación/JSON», lo que indica que nuestra solicitud debe ser una cadena JSON. Es por eso que tenemos que enviar cadenas como \\\ ”” … Espero hacer otra publicación sobre esto en los próximos días y mostrarle lo que hice para convertir la consulta de Playground API en la cadena formateada JSON requerida (como siempre tenemos un par de opciones en este frente).
¡También encontré el hecho de que podría crear una cuenta de desarrollador gratuita que me llevó 30 segundos levantarme y ejecutar una gran ventaja!
También debo mencionar, una cosa que recomendaría es que cada vez que cree una entrada en Monday.com Capture su ID en su aplicación, ya que esto evitará cualquier necesidad de buscarlo nuevamente para poder trabajar con ella (actualizar/eliminar). ¡Simplemente usará la identificación almacenada y ejecutará su comando!
Todos y todos, esta fue un par de horas divertidas y ya tengo una versión VBA y PHP en funcionamiento.
¡Espero que esto permita que algunos de ustedes se diviertan trabajando con Monday.com!
Historial de la página
Fecha | Resumen de cambios |
---|---|
2025-03-31 | Lanzamiento inicial |