Estoy usando el siguiente script en Hojas de cálculo de Google para obtener un objeto JSON de Yahoo! Finance para ciertas empresas:
function yahooFinance(symbol) { const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + encodeURI(symbol) + '?modules=price,assetProfile,summaryDetail,incomeStatementHistory,' + 'balanceSheetHistory,defaultKeyStatistics,financialData,calendarEvents,' + 'recommendationTrend,upgradeDowngradeHistory,majorHoldersBreakdown' ; const response = UrlFetchApp.fetch(url, { muteHttpExceptions: true }); const responseCode = response.getResponseCode(); if (responseCode === 200) { const quote = JSON.parse(response.getContentText()); return [[ quote.quoteSummary.result[0].summaryDetail.dividendYield.fmt, quote.quoteSummary.result[0].summaryDetail.payoutRatio.fmt, quote.quoteSummary.result[0].summaryDetail.marketCap.fmt ]]; } else { return "-"; } } Regularmente, sin embargo, para una o más claves, el valor estará vacío. En tal caso, el JSON devuelve (una cadena vacía). Sin embargo, cada vez que hay una cadena vacía, me gustaría devolver un regreso - la hoja para indicar que la consulta salió bien, sin embargo, no se devolvió ningún valor.
Así que intenté actualizar de la siguiente manera (ver la declaración if ):
function yahooFinance(symbol) { const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + encodeURI(symbol) + '?modules=price,assetProfile,summaryDetail,incomeStatementHistory,' + 'balanceSheetHistory,defaultKeyStatistics,financialData,calendarEvents,' + 'recommendationTrend,upgradeDowngradeHistory,majorHoldersBreakdown' ; const response = UrlFetchApp.fetch(url, { muteHttpExceptions: true }); const responseCode = response.getResponseCode(); if (responseCode === 200) { const quote = JSON.parse(response.getContentText()); return [[ (if (quote.quoteSummary.result[0].summaryDetail.dividendYield.fmtr) quote.quoteSummary.result[0].summaryDetail.dividendYield.fmt), quote.quoteSummary.result[0].summaryDetail.payoutRatio.fmt, quote.quoteSummary.result[0].summaryDetail.marketCap.fmt ]]; } else { return "-"; } } Aparentemente, no puedo poner una declaración if dentro de una matriz. ¿Cómo puedo verificar cada uno de los 3 valores que estoy devolviendo ( dividendYield , payoutRatio , marketCap ) si están vacíos y, de ser así, devolver - ?
Así es como lo haría. Además, hace que su código sea más limpio. el || funciona como un if/else. Si se define el primer valor, usará ese, si no, usará el "-"
function yahooFinance(symbol) { const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + encodeURI(symbol) + '?modules=price,assetProfile,summaryDetail,incomeStatementHistory,' + 'balanceSheetHistory,defaultKeyStatistics,financialData,calendarEvents,' + 'recommendationTrend,upgradeDowngradeHistory,majorHoldersBreakdown' ; const response = UrlFetchApp.fetch(url, { muteHttpExceptions: true }); const responseCode = response.getResponseCode(); if (responseCode === 200) { const quote = JSON.parse(response.getContentText()); const summaryDetail = quote.quoteSummary.result[0].summaryDetail; const divYield = summaryDetail.dividendYield.fmt || "-"; const payoutRatio = summaryDetail.payoutRatio.fmt || "-"; const marketCap = summaryDetail.marketCap.fmt || "-"; return [[ divYield , payoutRatio, marketCap ]]; } else { return "-"; } }¿Con encadenamiento opcional ?. , la evaluación se detiene cuando se encuentra un valor nulo. Piensa en usarlo de esta manera:
potentially_nullish_thing?.prop_or_index_or_function Si la cosa potentially_nullish_thing no es nula o no está definida, la prop_or_index_or_function se ejecuta como cabría esperar. De lo contrario, toda la expresión se evalúa como indefinida.
Entonces, para el OP, empareje eso con el lógico o || para obtener una cadena predeterminada si falta algo en la ruta a los datos reales.
quote?.quoteSummary?.result?.[0]?.summaryDetail?.dividendYield?.fmt || '-', // so on for the others