Este script está diseñado para integrar y automatizar la actualización de datos financieros desde la API de Indexa Capital directamente en una hoja de cálculo de Google Sheets. Además de importar y actualizar los datos de tus activos, el script proporciona una funcionalidad básica para generar gráficos circulares que visualizan la distribución de los activos.

Instrucciones 📜

  1. Abre una nueva hoja de cálculo en Google Sheets.

  2. Accede al editor de scripts. ExtensionesApps Script. Se abrirá una pestaña nueva donde podremos vincular nuestro script a la hoja de cálculo.

  3. Borra las lineas existentes y luego copia y pega el código proporcionado en el editor de scripts.

  4. En la linea 23 del código introducir token y número de cuenta.

    Esa parte del código debería quedar parecido a este ejemplo:

    // Obtener los datos de la cuenta
    var token = "keJ0eXAiOsdd3jkdn32d3kl32d3kld 3kl2SDDKmsdkm3dkl3md3iJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdXRoX2J5IjoiYXBpK2luZGV4YV9vMiIsImJpb21ldHJpYyI6ZmFsc2UsImRldmljZSKMdsmkaldmsadk13kem32f32f.3f32kfcmqexmmsx__msakm3dfk3q2fmemI6bnVsbCwiZW5kcG9pbnQiOiJodHRwOlwvXC9hcGkug1MjQsImlzcyI6IkluZGV4YSBDYXBpdGFsIiwic3ViIjoibWF0dC5wbGF0ZU"; // Tu token de API
    var accountNumber = "UX3G2UDT"; // Número de cuenta
    
  5. Coloca el nombre que desees, guardar y luego ejecutar. El script solicitará permisos de ejecución, otorgarlos.

  6. Volver y actualizar la hoja de cálculo.

  7. En la hoja de cálculo, en la barra de menú, aparecerá una nueva opción llamada “Indexa Capital”.

    Selecciona Actualizar datos para importar y actualizar la información de tus activos.

    Selecciona Graficar para generar un gráfico circular de la distribución de tus activos.

Una vez ejecutado, el script creará una nueva hoja (”pestaña”) llamada “Indexa”. En esa hoja importará el nombre del activo, el tipo, el importe y dejará una marca con la fecha y hora de la última actualización. Para actualizar nuevamente ir al menú de Indexa y Actualizar datos.

Código 🧑🏻‍💻

// Función que se ejecuta al abrir la hoja de cálculo
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Indexa Capital')
    .addItem('Actualizar datos', 'run')
    .addItem('Graficar', 'createPieChart')
    .addToUi();
}

// Función principal que corre al hacer clic en "Actualizar datos"
function run() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = "Indexa"; // Nombre de la hoja donde se escribirán los datos
  
  // Obtener la hoja de cálculo por nombre, si no existe, crearla
  var sheet = spreadsheet.getSheetByName(sheetName);
  if (!sheet) {
    Logger.log('La hoja "' + sheetName + '" no existe, creando una nueva.');
    sheet = spreadsheet.insertSheet(sheetName);
  }
  
  // Obtener los datos de la cuenta
  var token = "YOUR_API_TOKEN"; // Tu token de API
  var accountNumber = "YOUR_ACCOUNT_NUMBER"; // Número de cuenta
  
  Logger.log('Obteniendo posiciones de la cuenta...');
  var positions = getAccountPositions(token, accountNumber);
  
  // Actualizar la hoja con los datos y la fecha de ejecución
  updateSheet(positions, sheet);
}

// Función para obtener los datos de la cuenta desde la API
function getAccountPositions(token, accountNumber) {
  var host = "<https://api.indexacapital.com>";
  var url = host + "/accounts/" + accountNumber + "/portfolio";
  var options = {
    'method': 'get',
    'headers': {'X-AUTH-TOKEN': token, 'Accept': '*/*'},
    'muteHttpExceptions': true
  };
  var response = UrlFetchApp.fetch(url, options);
  
  // Manejar posibles errores de conexión
  if (response.getResponseCode() !== 200) {
    Logger.log('Error al obtener los datos de la cuenta. Código de respuesta: ' + response.getResponseCode());
    return []; // Devolver un array vacío en caso de error
  }
  
  var data = JSON.parse(response.getContentText());
  
  // Registrar la respuesta para verificar
  Logger.log('Respuesta de la API:');
  Logger.log(data);
  
  return data.instrument_accounts[0].positions;
}

// Función para actualizar la hoja de cálculo con los datos y la fecha de ejecución
function updateSheet(positions, sheet) {
  // Escribir la fecha y hora de la última ejecución en la celda F1
  var now = new Date();
  sheet.getRange('F1').setValue('Última actualización: ' + now.toLocaleString());
  
  // Preparar los datos a escribir en la hoja de cálculo
  var dataToWrite = [];
  
  // Agregar encabezados con los nuevos nombres
  dataToWrite.push(['Nombre', 'Activo', 'Importe']);
  
  // Agregar datos de posiciones
  for (var i = 0; i < positions.length; i++) {
    var name = positions[i].instrument.name;
    var assetClass = positions[i].instrument.asset_class;
    var amount = positions[i].amount;
    
    dataToWrite.push([name, assetClass, amount]);
  }
  
  // Escribir los datos en la hoja de cálculo sin limpiar el formato
  var range = sheet.getRange(1, 1, dataToWrite.length, dataToWrite[0].length);
  range.setValues(dataToWrite);
}

// Función para crear un gráfico circular
function createPieChart() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('Indexa');
  if (!sheet) {
    Logger.log('La hoja "Indexa" no existe. No se puede crear el gráfico.');
    return;
  }
  
  var range = sheet.getRange('B2:C' + sheet.getLastRow());
  
  // Crear el gráfico
  var chart = sheet.newChart()
    .setChartType(Charts.ChartType.PIE)
    .addRange(range)
    .setPosition(5, 5, 0, 0)
    .setOption('title', 'Distribución de Activos')
    .build();
  
  sheet.insertChart(chart);
}

Screenshots 🖥️

Untitled


Contacto 📫

[email protected]