Fără programare
Datele firmelor direct în foaia ta de calcul
Bilanțul, profitul, datoriile și scorul de risc al oricărei firme din România, cu o formulă în Google Sheets, cu Power Query în Excel sau într-un flux automat în Zapier, Make și n8n. Ai nevoie doar de o cheie API.
Formule noi în Google Sheets
- 1Deschide foaia în Google Sheets și alege Extensii > Apps Script.
- 2Șterge ce e acolo, lipește scriptul de mai jos și salvează (Ctrl+S).
- 3Reîncarcă foaia: apare meniul „BilantAPI”. Alege „Setează cheia API” și lipește cheia ta.
- 4Scrie în orice celulă =BILANT("33741906"; "cifra_afaceri").
Ce poți scrie
=BILANT("33741906"; "cifra_afaceri")Cifra de afaceri din ultimul an depus
=BILANT(A2; "profit_net"; 2023)Profitul net pe 2023, pentru CUI-ul din A2
=BILANT(A2; "angajati")Numărul de salariați
=BILANT_DENUMIRE(A2)Numele firmei
=BILANTAPI("bilant/" & A2 & "/risc"; "scor")Orice rută din documentație, orice câmp
Câmpuri: cifra_afaceri, profit_net, rezultat_net, venituri_totale, datorii, capitaluri, angajati, marja_neta, roe. Răspunsurile se țin minte 6 ore, ca recalcularea foii să nu consume credite.
bilantapi-google-sheets.gsDescarcă
/**
* BilantAPI.ro pentru Google Sheets
*
* Formule noi in foaia ta:
* =BILANT("33741906"; "cifra_afaceri") ultimul an depus
* =BILANT("33741906"; "profit_net"; 2023) un an anume
* =BILANT_DENUMIRE("33741906") numele firmei
* =BILANTAPI("bilant/33741906/risc"; "scor") orice ruta din documentatie, orice camp
*
* Instalare: Extensii > Apps Script, lipesti acest cod, salvezi, apoi din
* meniul „BilantAPI” al foii alegi „Seteaza cheia API”. Cheia ramane in contul
* tau Google (proprietatile utilizatorului), nu in foaie.
*
* Raspunsurile se tin minte 6 ore: aceeasi formula, recalculata, nu consuma
* credite de fiecare data.
*/
var BILANTAPI_ADRESA = 'https://www.bilantapi.ro/api/v1/';
var BILANTAPI_CACHE_SECUNDE = 6 * 60 * 60;
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('BilantAPI')
.addItem('Setează cheia API', 'bilantapiSeteazaCheia')
.addItem('Golește memoria (recitește datele)', 'bilantapiGolesteMemoria')
.addToUi();
}
function bilantapiSeteazaCheia() {
var ui = SpreadsheetApp.getUi();
var r = ui.prompt('Cheia API BilantAPI', 'O găsești în contul tău, la „Chei API” (începe cu ba_live_).', ui.ButtonSet.OK_CANCEL);
if (r.getSelectedButton() === ui.Button.OK) {
PropertiesService.getUserProperties().setProperty('BILANTAPI_CHEIE', r.getResponseText().trim());
ui.alert('Gata. Formulele =BILANT(...) folosesc acum cheia ta.');
}
}
function bilantapiGolesteMemoria() {
PropertiesService.getUserProperties().setProperty('BILANTAPI_GENERATIE', String(Date.now()));
SpreadsheetApp.getUi().alert('Gata. Formulele vor citi din nou datele (consumă credite).');
}
/**
* Un indicator din bilantul unei firme.
*
* @param {string} cui CUI-ul firmei, fara RO
* @param {string} camp ex. cifra_afaceri, profit_net, rezultat_net, venituri_totale, datorii, capitaluri, angajati, marja_neta, roe
* @param {number} an optional: anul bilantului; fara el, ultimul an depus
* @return valoarea
* @customfunction
*/
function BILANT(cui, camp, an) {
var c = bilantapiCui(cui);
if (an) {
var d = bilantapiCere('bilant/' + c + '/' + an).data || {};
return bilantapiPrimul([d.date, d.indicatori, d], camp);
}
var s = (bilantapiCere('bilant/' + c + '/sumar').data || {}).sumar || {};
return bilantapiPrimul([s, s.indicatori], camp);
}
/**
* Denumirea firmei.
*
* @param {string} cui CUI-ul firmei
* @return denumirea
* @customfunction
*/
function BILANT_DENUMIRE(cui) {
return (bilantapiCere('bilant/' + bilantapiCui(cui) + '/sumar').data || {}).denumire || '';
}
/**
* Orice ruta din API, orice camp din raspuns.
*
* @param {string} ruta ex. "bilant/33741906/risc" sau "registru/firme/33741906"
* @param {string} cale campul, cu puncte: ex. "scor" sau "sediu.judet"; gol = tot raspunsul, ca text
* @return valoarea
* @customfunction
*/
function BILANTAPI(ruta, cale) {
var data = bilantapiCere(String(ruta).replace(/^\/+/, '').replace(/^v1\//, '')).data;
if (!cale) return JSON.stringify(data);
var v = String(cale).split('.').reduce(function (o, k) { return o == null ? null : o[k]; }, data);
return v != null && typeof v === 'object' ? JSON.stringify(v) : v;
}
/* ── Intern ─────────────────────────────────────────────────────────── */
function bilantapiCui(cui) {
var c = String(cui).replace(/\D/g, '');
if (!c) throw new Error('CUI lipsă sau greșit.');
return c;
}
function bilantapiPrimul(surse, camp) {
for (var i = 0; i < surse.length; i++) {
if (surse[i] && surse[i][camp] !== undefined) return surse[i][camp];
}
throw new Error('Câmpul „' + camp + '” nu există în răspuns.');
}
function bilantapiCere(ruta) {
var p = PropertiesService.getUserProperties();
var cheie = p.getProperty('BILANTAPI_CHEIE');
if (!cheie) throw new Error('Setează cheia: meniul BilantAPI > Setează cheia API.');
var cache = CacheService.getUserCache();
var cheieCache = 'b:' + (p.getProperty('BILANTAPI_GENERATIE') || '0') + ':' + ruta;
var tinut = cache.get(cheieCache);
if (tinut) return JSON.parse(tinut);
var r = UrlFetchApp.fetch(BILANTAPI_ADRESA + ruta, {
headers: { 'X-API-KEY': cheie, Accept: 'application/json' },
muteHttpExceptions: true,
});
var corp = r.getContentText();
var json;
try { json = JSON.parse(corp); } catch (e) { throw new Error('Răspuns neașteptat (' + r.getResponseCode() + ').'); }
if (r.getResponseCode() >= 400 || json.success === false) {
throw new Error((json.error && (json.error.message || json.error.mesaj)) || json.message || ('Eroare ' + r.getResponseCode()));
}
if (corp.length < 90000) cache.put(cheieCache, corp, BILANTAPI_CACHE_SECUNDE);
return json;
}