Integración de Indexa Capital con Google Sheets

En este tutorial descubrirás como importar tus datos de Indexa Capital en Google Sheets (valor de la cartera y rentabilidad) ya sea mediante un botón o de manera totalmente desatendida (mientras duermes), por lo que nunca más tendrás que entrar a la web de Indexa Capital para consultar tu saldo o tu rentabilidad.

Las posibilidades son inmensas aunque en este manual sólo cubre la funcionalidad más básica. He intentado explicarlo de la manera más clara posible pero ten en cuenta que es un tutorial un poco técnico y si no tienes conocimientos de programación quizá te resulte un poco difícil de entender.

Contenido

1. Conseguir un token
2. Crear un Google Apps Script
3. Crear script properties
4. Programar la integración
4.1. Descargar la información mediante un botón
4.2. Descargar la información sin interacción del usuario
5. Fin

1. Conseguir un token

Lo primero que hay que hacer es solicitar un token a Indexa Capital, puedes conseguirlo en Área de cliente > Tu nombre > Configuración de usuario > Aplicaciones.

Cómo conseguir un token de Indexa Capital.
Cómo conseguir un token de Indexa Capital

Este token no es más que una cadena de letras y números que servirá para autenticar nuestras llamadas a la API (Application Programming Interface) de Indexa Capital, sin él, nuestra integración no funcionará.

El token es único, personal, intransferible y no tiene fecha de caducidad por lo que deberemos guardarlo a buen recaudo y no compartirlo.

Nuestro token tendrá un aspecto similar a este: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QGluZGV4YWNhcGl0YWwuY29tIiwiaXNzIjoiSW5kZXhhIENhcGl0YWwiLCJpYXQiOjE1MTkxMjY0NDgsImV4cCI6MTUxOTE4NjQ0OCwiZW5kcG9pbnQiOiJodHRwczovL2ludGFwaS5pbmRleGFjYXBpdGFsLmNvbSJ9.P82WNPoxpTSUf9AJfpYFelON4xy6EBec9vE4qEHee1c

2. Crear un Google Apps Script

Aunque la funcionalidad no es muy conocida, se puede programar desde Google Sheets vía Google Apps Script, esto brinda posibilidades ilimitadas, en nuestro caso, lo vamos a utilizar para conectarnos al servicio REST de Indexa Capital.

Lo siguiente que haremos será crear una nueva hoja de cálculo de Google Sheets y una vez creada vamos a Tools > Script editor.

Se abrirá una nueva pantalla que parece un editor de texto / bloc de notas, aquí es donde vamos a programar nuestras llamadas a la API de Indexa Capital. El archivo por defecto se llama Code.gs, puedes cambiarle el nombre si quieres, pero no es necesario.

También puedes poner un título al proyecto, ya que actualmente se llamará Untitled project, esto sí lo recomiendo, simplemente para tener todo bien organizado.

3. Crear script properties

Actualmente las script properties están obsoletas. Se puede seguir haciendo uso de ellas pero Google ha ocultado un poco el botón para acceder a ellas. La mejor solución es saltarse este paso e introducir las variables que indico a continuación directamente en el código.

Las script properties viene a ser lo que se conoce en los lenguajes de programación habituales como variables globales / constantes / macros. Están compuestas por:

  • Property: Es el nombre (clave) de la script property.
  • Value: Es el valor que tomará la script property.

En nuestro caso vamos a definir dos script properties:

  1. IndexaCapitalToken: donde introduciremos el valor del token.
  2. IndexaCapitalAccount: donde introduciremos el valor de la cuenta de Indexa Capital ya que podemos tener múltiples, una para plan de pensiones, otra para cuenta de menores, otra para nuestra cuenta de fondos…

Para rellenar las script properties vamos a File > Project properties > Script properties. El resultado será similar a la siguiente imagen:

Ejemplo de script properties en Google Sheets.
Google Apps Script – Script properties

4. Programar la integración

Ahora viene lo divertido, sustituimos la función myFunction que viene por defecto en el archivo Code.gs por el siguiente fragmento de código.

Si finalmente no has usado las script properties (ya que están obsoletas), tendrás que quitar la línea var scriptProperties = PropertiesService.getScriptProperties(); y sustituir las cadenas de texto scriptProperties.getProperty(«IndexaCapitalToken») y scriptProperties.getProperty(«IndexaCapitalAccount») por sus valores reales dentro del siguiente código.

//Begin Indexa Capital functions by InversorProvinciano (https://inversorprovinciano.wordpress.com)
function IndexaCapitalPortfolioValue(token, account) {
    const options = {
    "method"  : "GET",
    "headers": {
      "Content-Type": "application/json",
      "Accept": "*/*",
      "Cache-Control" : "no-cache",
      "Accept-Encoding" : "gzip, deflate, br",
      "Connection" : "keep-alive",
      "X-Auth-Token" : token
    } 
  };

  const result = UrlFetchApp.fetch("https://api.indexacapital.com/accounts/" + account + "/portfolio", options);
      
    if (result.getResponseCode() == 200) {
      const response = JSON.parse(result.getContentText());

      return response.portfolio.total_amount;
    }
  
    return undefined;
}

function IndexaCapitalPerformanceValue(token, account) {
    const options = {
    "method"  : "GET",
    "headers": {
      "Content-Type": "application/json",
      "Accept": "*/*",
      "Cache-Control" : "no-cache",
      "Accept-Encoding" : "gzip, deflate, br",
      "Connection" : "keep-alive",
      "X-Auth-Token" : token
    } 
  };

  const result = UrlFetchApp.fetch("https://api.indexacapital.com/accounts/" + account + "/performance", options);
      
    if (result.getResponseCode() == 200) {
      const response = JSON.parse(result.getContentText());

      return response.return.time_return;
    }
  
    return undefined;
}

function IndexaCapitalTrigger() {
  
  var scriptProperties = PropertiesService.getScriptProperties();
  
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange('A1').setValue(IndexaCapitalPortfolioValue(scriptProperties.getProperty("IndexaCapitalToken"), scriptProperties.getProperty("IndexaCapitalAccount")));
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange('A2').setValue(IndexaCapitalPerformanceValue(scriptProperties.getProperty("IndexaCapitalToken"), scriptProperties.getProperty("IndexaCapitalAccount")));
}
//End Indexa Capital functions by InversorProvinciano (https://inversorprovinciano.wordpress.com)

Te explico lo que contiene:

  • IndexaCapitalPortfolioValue: Es la función que nos devolverá el valor de nuestras inversiones.
  • IndexaCapitalPerformanceValue: Es la función que nos devolverá la rentabilidad de nuestras inversiones.
  • IndexaCapitalTrigger: Es la función principal que escribe los valores en las celdas A1 y A2. Por cierto, la celda A2 has de ponerla en formato porcentaje.

Ya tenemos todo, sólo necesitamos una manera de llamar a estas funciones para que funcione todo, te propongo dos maneras de hacerlo.

4.1. Descargar la información mediante un botón

Se pueden rellenar los datos bajo demanda mediante la creación de un botón, para ello añadimos el siguiente fragmento de código al archivo Code.gs.

//Begin Indexa Capital functions by InversorProvinciano (https://inversorprovinciano.wordpress.com)
function onOpen()
{
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    { name: 'Descargar datos de Indexa Capital', functionName: 'IndexaCapitalTrigger' }
  ];
  
  spreadsheet.addMenu('FIRE', menuItems);
}
//End   Indexa Capital functions by InversorProvinciano (https://inversorprovinciano.wordpress.com)

Acto seguido:

  1. Guarda el script.
  2. Cierra la hoja de cálculo.
  3. Vuelve a abrirla hoja de cálculo.

El resultado será un nuevo menú llamado «FIRE» con una opción que responde al nombre de «Descargar datos de Indexa Capital».

Al hacer click, te pedirá permiso en tu cuenta de Google. Acepta todo lo que te aparezca en pantalla y en cuestión de un par de segundos tendrás tus datos de Indexa Capital reflejados en las celdas A1 y A2.

Si tienes activada la autenticación en dos pasos de Google, también te llegará una notificación al móvil que has de aceptar.

Por último, se podría hacer que los datos se cargaran cada vez que se abre la hoja de cálculo pero no lo recomiendo ya que es posible que accedamos al documento constantemente.

4.2. Descargar la información sin interacción del usuario

Soy un poco exigente y no me gusta hacer clic en el botón del punto anterior, prefiero que se descarguen mis datos por las noches, mientras duermo, así que vamos a crear un activador / trigger.

Desde el script editor hacemos clic en el botón que parece un reloj (Current project’s triggers) y se abrirá una pantalla un tanto extraña llamada Activadores.

Ejemplo de activador (trigger) de Google Apps Script.
Google Apps Script Triggers (Activadores)

Añadimos un activador y lo configuramos de la siguiente manera para que se ejecute cada noche de 4:00 a 5:00 de la madrugada. De esta manera, al despertarnos cada mañana, tendremos nuestros datos volcados en las celdas A1 y A2.

Configuración del activador (trigger) de Google Apps Script.
Configuración del activador de Google Apps Script

5. Fin

Esto es todo, como puedes ver, el ejemplo es básico pero se pueden hacer multitud de cosas, ya que la información que devuelve cada llamada es muy extensa. Personalmente ya no me queda ninguna razón para seguir consultando la web de Indexa Capital.

Si quieres ampliar la funcionalidad, te recomiendo que pruebes Postman, para controlar bien las llamadas y la información resultante antes de plasmarlo en la hoja de cálculo.

Si te ha resultado útil, no olvides compartir y/o dejar un comentario.

31 comentarios sobre “Integración de Indexa Capital con Google Sheets

  1. Hola Inversorprovinciano, gracias por el artículo. He estado echando un vistazo a la API de INDEXA y parece que ya tienen publicado el servicio para pedir el token, ¿puede ser? tampoco es que sea yo muy experto en estos temas.

    Me gusta

  2. Muchas gracias muy útil!!

    como comentario en la función IndexaCapitalTrigger() usas el nombre de la hoja para identificar luego la celda.
    getSheetByName(‘Sheet1’)

    En tu caso es «Sheet1». Imagino que porque tienes el google en inglés, yo lo tengo en español y se llama «hoja1» y claro daba error. Le he cambiado el nombre a la hoja para que sea «Sheet1» y funciona perfectamente.

    Salu2

    Le gusta a 1 persona

  3. Mil gracias!!!

    Como dicen arriba, lo he adaptado cambiando las celdas A1 y A2, así como «Sheet1» a como lo tenía yo nombrado. Y si, desde ya se puede descargar en ajustes de la web el token.
    Cuidado con los espacios en el nº de cuenta y el token, que me daba error y era por eso.

    Eres un crack, gracias!!!!

    Le gusta a 1 persona

  4. Buenos dias, muchas gracias por el aporte, funciona perfectamente y sirve como base para poder sacar muchas más variables.

    Pero he estado trasteando un poco más con la API y no consigo sacar un desglose por ISIN de cada uno de los fondos, para ver la rentabilidad de cada uno de ellos.

    Crees que podrías ayudarnos a la comunidad con este tema :),

    Muchas gracias

    Me gusta

    1. Hola:

      La rentabilidad no sé si la mandan, no la he encontrado desglosada a nivel de fondo, pero puedes obtener los datos de cada fondo con la llamada a «portfolio», quizá partiendo de aquí puedas calcular lo que te interesa.

      Nota: Puedes explorar el objeto con Postman.

      Me gusta

      1. Gracias, he intentado obtenerlo llamando a «portfolio» pero no he conseguido que devuelva nada…. me temo que no soy un usario tan avanzado en temas de programación como para explorar el objeto con «Postman», 😦

        Me gusta

  5. Por aquí no deja mandar imágenes, pero básicamente es incluir esto dentro del Postman:

    «method» : «GET»,
    «headers»: {
    «Content-Type»: «application/json»,
    «Accept»: «*/*»,
    «Cache-Control» : «no-cache»,
    «Accept-Encoding» : «gzip, deflate, br»,
    «Connection» : «keep-alive»,
    «X-Auth-Token» : token

    Nota: No te olvides de sustituir tu token.

    La url de la llamada es: https://api.indexacapital.com/accounts/NúmeroDeCuenta/portfolio

    Independientemente de lo anterior, en la siguiente URL (pestaña response) puedes ver la estructura del objeto devuelto, por si quieres saltarte el paso del Postman. https://indexacapital.com/es/esp/api-rest-v1#accounts__account_number__portfolio_get

    Me gusta

    1. Gracias, ya he sido capaz en postman de sacar toda la info, ahora a ver si puedo volcarlo a Google Sheet.

      Hacía 20 años que no tocaba una linea de código y uno se «oxida».

      Un saludo

      Le gusta a 1 persona

  6. Hola, sigo todos los pasos, incluido el cambio de nombre de la Hoja 1,
    y cuando le doy a FIRE, descargar datos, me salta este error;

    Exception: Error de solicitud para https://api.indexacapital.com; código devuelto 500

    Alguien sabe a que puede ser debido y como solucionarlo ????
    gracias

    Me gusta

  7. Hola buenas, introduzco todo bien, cambiando los nombres de token y account, pero no se si lo estoy haciendo mal, porque me sale siempre este mensaje. SyntaxError: Unexpected token ‘.’ (línea 1, archivo «Código.gs»)
    Y el token lo pongo bien. O es que en la 1 fila, donde pone token y cuenta entre paréntesis no se pone nada???
    Gracias

    Me gusta

    1. En este caso, cuando usa el término «token», significa «símbolo», nada que ver con el token de Indexa Capital.

      Lo que quiere decir es que en la línea 1 del archivo «Código.gs» tienes un carácter (o palabra) inesperado que no sabe interpretar el compilador y está produciendo un error de sintaxis. Revisa el texto que has pegado.

      No, en la línea 1, entre los paréntesis, no se pone nada, son variables.

      Un saludo

      Me gusta

  8. Podrías compartir la googlesheet que has preparado, poniendo otro token inventado de forma que podamos utilizarla poniendo nuestro token, Es que no hay manera, y como de esto me quedé en el fortran y poquito, pues seguro que estoy haciendo algo mal.
    Gracias por compartir

    Me gusta

  9. Buenas!
    Muchísimas gracias por el aporte!
    Estoy intentando replicar lo que indicas y me dá un error cuando lo lazo – «Exception: Attribute provided with invalid value: Header:null (line 15, file «Code»)
    Podrías indicarme por favor, como se podría solucionar?

    Me gusta

    1. La verdad es que aunque entiendo más o menos el error, no sé exactamente cómo solucionarlo.

      Parece que uno de los atributos de la cabecera está vacío. ¿Cuenta o token quizá?

      Repasa todos los pasos del artículo, te aseguro que funciona, muchos lo han conseguido.

      Un saludo

      Me gusta

  10. Hola inversor Provinciano

    Muchas gracias por el post, lo he seguido y me funciona a la perfección.
    Me gustaría preguntarte por tu sistema para poder llevar un control de tus inversiones, rentabilidades y aportaciones.

    Entiendo que Google sheets, pero viendo el apartado de tu cartera…. Con los graficos que aportas, tengo dudas.

    Estoy buscando un sistema de control de mis inversiones, donde tengo Fondos indexados unicamente (En Indexa y como tu en openbank con cartera autogestionada)
    Un registro que no sé si excel o Google Sheets…

    Muchas gracias, saludos y feliz año

    Me gusta

      1. Hola, si…me refiero al recurso que usas y recomiendas para llevar un control de las diferentes inversiones.
        Si lo haces con Excel, con google sheets o si usas una aplicación.

        Al ver los graficos que tienes en el post de los analisis de la cartera del segundo semestre por ejemplo me preguntaba como lo haces y como lo controlas.
        Me preguntaba esto a raiz de ver el post donde en Google sheets se descargaba de manera automatica y cuyo tutorial has explicado.

        Saludos

        Me gusta

Los comentarios están cerrados.