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.
Abre una nueva hoja de cálculo en Google Sheets.
Accede al editor de scripts. Extensiones
→ Apps Script
. Se abrirá una pestaña nueva donde podremos vincular nuestro script a la hoja de cálculo.
Borra las lineas existentes y luego copia y pega el código proporcionado en el editor de scripts.
En la linea 23 del código introducir token y número de cuenta.
Configuración de usuario
→ Aplicaciones
.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
Coloca el nombre que desees, guardar
y luego ejecutar
. El script solicitará permisos de ejecución, otorgarlos.
Volver y actualizar la hoja de cálculo.
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
.
// 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);
}