Mi pregunta es similar a Necesito una secuencia de comandos para recorrer la lista de cotizaciones de acciones, copiar la salida resultante y pegar la salida en una hoja separada dentro del libro de trabajo. Sin embargo, en lugar de copiar y pegar una sola fila (para cada indicador) debajo de la última fila no vacía, necesito copiar y pegar 100 filas (para cada indicador) debajo de la última fila no vacía.
Tengo tres hojas llamadas Tickers , Data y Results dentro de un solo libro de trabajo.
Si se hace manualmente, el trabajo sería el siguiente: Ingrese un símbolo de cotización en la celda A2 en la Hoja de Data . Luego, la hoja recupera los datos históricos de la serie temporal de Google Finance, ejecuta fórmulas y devuelve 100 filas y 7 columnas de datos (Ticker, Date, Open, High, Low, Close, Volume) en el rango A5:G254 dentro de la misma hoja de Data . Copie las 100 filas de datos devueltos y pegue los datos en la hoja de resultados debajo de la última fila no vacía. Luego repita el proceso con cada ticker.
Solicitud: cree una secuencia de comandos para recorrer una lista de 50 símbolos bursátiles de la hoja de Ticker (rango B2: B51), pegue 1 símbolo a la vez en la celda A2 de la hoja de Data , espere a que se ejecute la API de Google Finance y luego copie todas las filas resultantes generadas en el rango A5:G254, y pegando esos resultados en la hoja de Results , debajo de los datos generados desde el teletipo anterior, hasta que haya una tabla de "formato largo" de datos de series temporales de cada uno de los 50 teletipos.
El problema con mi secuencia de comandos actual es que pega solo la primera fila del rango deseado A5:G254.
function getNewPrices() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const tickerSheet = ss.getSheetByName('Tickers'); const dataSheet = ss.getSheetByName('Data'); const resultsSheet = ss.getSheetByName('Results'); let data; let myListOfTickers = tickerSheet.getRange('B2:B51').getValues().filter(String).sort(); myListOfTickers.forEach(ticker => { dataSheet.getRange('A2').setValue(ticker[0]); data = dataSheet.getRange('A5:G254').getValues()[0]; pasteData(resultsSheet, data); }); }; function pasteData(resultsSheet,data){ let nextRow = resultsSheet.getLastRow() + 1; data.forEach((datum,index) => { resultsSheet.getRange(nextRow,index + 1,1,1).setValue(datum); }); };No estoy completamente seguro, pero creo que esto es lo que quieres.
function getNewPrices() { const ss = SpreadsheetApp.getActive(); const tsh = ss.getSheetByName('Tickers'); let tvs = tsh.getRange('B2:B51').getValues().filter(String).sort(); const dsh = ss.getSheetByName('Data'); const rsh = ss.getSheetByName('Results'); dsh.getRange(2,1,tvs.length,tvs[0].length).setValues(tvs); let dvs = dsh.getRange('A5:G254').getValues(); rsh.getRange(rsh.getLastRow() + 1, 1, dvs.length, dvs[0].length).setValues(dvs); }Puede ir a Google Apps Script Reference y usar el cuadro de búsqueda para encontrar cualquier función que no entienda. Si es una función de JavaScript puro, vaya aquí
Problema resuelto. Aquí está el código final si alguien quiere usarlo más adelante. Gracias por el código inicial Cooper.
function getNewPrices() { const ss = SpreadsheetApp.getActive(); const tsh = ss.getSheetByName('Tickers'); let tvs = tsh.getRange('B2:B51').getValues().filter(String).sort(); const dsh = ss.getSheetByName('Data'); const rsh = ss.getSheetByName('Results'); tvs.forEach(ticker =>{ dsh.getRange('A2').setValue(ticker[0]); let dvs = dsh.getRange('A5:G254').getValues(); rsh.getRange(rsh.getLastRow() + 1, 1, dvs.length, dvs[0].length).setValues(dvs); }); }