Estoy extrayendo datos del mercado de valores de Yahoo! Finanzas. Para datos que no cambian con frecuencia, no quiero contactar a Yahoo! cada vez, pero obtenga datos de una db de base de datos que actúa como un caché:
yahoofinance() se llama por ticker desde la hoja 'Dashboard'yahoofinance() llama a db_data para ver si los datos para ticker están disponibles en dbTengo una hoja de ejemplo aquí .
function yahoofinance(ticker) { if (db_data(ticker)) { return get_db_data(ticker); } else { return get_live_data(ticker); } } function get_live_data(ticker) { const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + encodeURI(ticker) + '?modules=price,assetProfile,summaryDetail'; let response = UrlFetchApp.fetch(url, { muteHttpExceptions: true }); if (response.getResponseCode() == 200) { var object = JSON.parse(response.getContentText()); } let fwdPE = object.quoteSummary.result[0]?.summaryDetail?.forwardPE?.fmt || '-'; let sector = object.quoteSummary.result[0]?.assetProfile?.sector || '-'; let mktCap = object.quoteSummary.result[0]?.price?.marketCap?.fmt || '-'; return [[fwdPE, sector, mktCap]]; } function db_data(key) { var db = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('db'); var tickers = db.getDataRange('A2:A').getValues(); for (var r = 0; r <= tickers.length; r++) { if (tickers[r] == key) { return true // found a row with this key } else { return false // no row with this key exists } } } Problema: db_data() no encuentra el ticker AAPL (consulte la hoja Dashboard ) a pesar de que está presente en la hoja db , por lo que la coincidencia en db_data() no funciona. ¿Qué estoy haciendo mal?
Una versión funcional del script con los cambios sugeridos en los comentarios:
function yahoofinance(ticker) { if (db_data(ticker)) { return db_data(ticker); } else { return get_live_data(ticker); } } function get_live_data(ticker) { const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + encodeURI(ticker) + '?modules=price,assetProfile,summaryDetail'; let response = UrlFetchApp.fetch(url, { muteHttpExceptions: true }); if (response.getResponseCode() == 200) { var object = JSON.parse(response.getContentText()); } let fwdPE = object.quoteSummary.result[0]?.summaryDetail?.forwardPE?.fmt || '-'; let sector = object.quoteSummary.result[0]?.assetProfile?.sector || '-'; let mktCap = object.quoteSummary.result[0]?.price?.marketCap?.fmt || '-'; return [[fwdPE, sector, mktCap]]; } function db_data(key) { var db = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('db'); var tickers = db.getRange('A2:A').getValues(); for (var r = 0; r <= tickers.length; r++) { if (tickers[r] == key) { return true // found a row with this key } else { return false // no row with this key exists } } }Resultados: