Tengo 2 pestañas en mi Hoja de Google:
dashboard :
db :
En el dashboard en la columna B llamo a la función yahoofinance() . Esta función verifica si para el ticker dado existen datos en db . Si es así, se devuelven estos datos. Si no, O si es así pero los datos están vacíos, Yahoo! Se contacta con Finanzas para recuperar los datos. Hasta aquí todo bien.
Tome JPM como ejemplo ahora. Se llama en la fila 3 en el dashboard . En db encontramos JPM pero no hay datos para el teletipo, por lo que lo recuperamos en vivo de Yahoo! Finanzas. Posteriormente, quiero actualizar la fila JPM en db con estos datos , para que la próxima vez que abramos el dashboard , no nos comuniquemos con Yahoo! de nuevo por esta información.
Sin embargo, vea la línea debajo de // update existing row ... el código genera un error Exception: You do not have permission to call setValues y no sé cómo resolverlo. ¿Tú? ¡Cualquier ayuda es muy apreciada!
function yahoofinance(ticker) { // First check if we have this data stored already var db = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('db'); var tickers = db.getRange('A2:A').getValues(); var stored = false; var row = 2; for (var r = 0; r <= tickers.length; r++) { if (tickers[r] == ticker) { stored = true; row = row + r; } } if (stored == true) { // the ticker is known in db var range = db.getRange(row, 2, 1, 4); if (range.isBlank()) { // ticker is known but no data yet var data = get_live_data(ticker); // update existing row db.getRange(row, 2).setValues(data); // return data return data; } else { return range.getValues(); } } else { var data = get_live_data(ticker); // append row to db // return data to sheet return data; } } 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]]; }Entonces, según la línea debajo de // update existing row , desea agregar los datos en la otra hoja y según la documentación , las funciones personalizadas devuelven valores pero solo establecerán valores en la celda actual donde está usando la función, puede ' t modifique los datos en otra celda y es por eso que está recibiendo el error. Está llamando a la función en B4 y está intentando establecer valores en otra hoja al mismo tiempo, lo que no está permitido.
Una función personalizada no puede afectar a celdas que no sean aquellas a las que devuelve un valor. En otras palabras, una función personalizada no puede editar celdas arbitrarias, solo las celdas desde las que se llama y sus celdas adyacentes.