Access

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.

Monday.com OAuth Endpoints
Para ahorrarle algo de excavación, aquí están los puntos finales de lunes.com para la autenticación:

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.

¡Monday.com hace que las fichas sean aún más fáciles!
Debo mencionar que Monday.com hace que ponerse en funcionamiento sea súper fácil e incluso puede evitar todo el concepto de OAuth si lo desea. Le proporcionan un token listo (desarrolladores-> mi token de acceso) para su uso en cualquier proyecto que desee. Simplemente cópielo y úselo en PHP/VBA/… de esta manera está en funcionamiento de inmediato y puede revocar el acceso en cualquier momento simplemente volviendo a esa misma página y regenerando el token para invalidar el actual.

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

FechaResumen de cambios
2025-03-31Lanzamiento inicial

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba