Tengo una función yahoofinance que consulta a Yahoo!Finance para obtener datos bursátiles basados en un teletipo bursátil. Antes de poder llamar a la función, necesito hacer algunas modificaciones a la entrada.
Los teletipos en mi hoja tienen el formato [venue].[company] , por ejemplo, XNAS.GOOG (Google en Nasdaq), XAMS.INGA (ING Bank en Amsterdam) y XSWX.CRSP (Crispr en Swiss Exchange).
Los códigos que uso para los lugares son internacionales, pero la mayoría de las API no usan estos mismos códigos. Por ejemplo, la bolsa de valores de Ámsterdam es oficialmente XAMS , pero AMS en la API de Google y AS en Yahoo. Así que tengo una hoja llamada Exchanges con todos estos lugares enumerados. Al llamar a mi función personalizada yahoofinance , toma el estándar 'XMAS.INGA' como entrada, luego corta el lugar ( XAMS ) y busca el nombre de Yahoo ( AS ), luego pasa INGA.AS a la API de Yahoo:
=yahoofinance(index(split(A2, "."), 0, 2) & "." & vlookup(index(split(A2, "."), 0, 1), Exchanges!E:J, 6, false)) function yahoofinance(ticker) { // send ticker to Yahoo API } La lógica, que ahora está en la celda B2 de la hoja, se está volviendo complicada de seguir. Me gustaría moverlo, si es posible, a la función y pasar solo el ticker de A2 :
=yahoofinance(A2) function yahoofinance(ticker) { const venue = ticker.split(); // etc // end up with INGA.AS, and pass to Yahoo API } Mi pregunta es: ¿es posible mover la lógica que ahora está en mi hoja, a la función? Por ejemplo, si y cómo puedo realizar el mismo vlookup desde dentro de yahoofinance ? ¿Es posible?
Estoy planeando extender realmente la funcionalidad de yahoofinance , tal vez incluso volver a trabajarlo en una función finance genérica que también tome como argumento a qué API desea pasar un ticker: =yahoofinance(ticker, api) , así que cualquier ayuda para comenzar con una base sólida aquí es muy apreciada.
Puede probar esta fórmula personalizada para obtener el valor modificado:
function yahoofinance(ticker) { var [venue, company] = ticker.split("\."); var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Exchanges'); var lastRow = sheet.getLastRow(); // get Exchanges!E:J values var mapping = sheet.getRange(1, 5, lastRow, 6).getValues(); // lookup equivalent, filter then get 6th column and append to company var modifiedTicker = company + '.' + mapping.filter(row => row[0] == venue).flat()[5]; // you now have the modified ticker. Use it on your function. // ... return modifiedTicker; } =index(split(A2, "."), 0, 2) & "." & vlookup(index(split(A2, "."), 0, 1), Exchanges!E:J, 6, false)