我正在從 Yahoo Finance 匯入股票 JSON 資料,以使用自定義函式匯入個人股票跟蹤器的 Google 表格:
function _yahoofinance(ticker) {
const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' encodeURI(ticker)
'?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 price = _isEmpty(quote.quoteSummary.result[0].price.regularMarketPrice) ? '-' : quote.quoteSummary.result[0].price.regularMarketPrice.fmt;
const divYield = _isEmpty(quote.quoteSummary.result[0].summaryDetail.dividendYield) ? '-' : quote.quoteSummary.result[0].summaryDetail.dividendYield.raw * 100;
const payoutRatio = _isEmpty(quote.quoteSummary.result[0].summaryDetail.payoutRatio) ? '-' : quote.quoteSummary.result[0].summaryDetail.payoutRatio.raw * 100;
const marketCap = _isEmpty(quote.quoteSummary.result[0].summaryDetail.marketCap) ? '-' : quote.quoteSummary.result[0].summaryDetail.marketCap.fmt;
const fwdPE = _isEmpty(quote.quoteSummary.result[0].summaryDetail.forwardPE) ? '-' : quote.quoteSummary.result[0].summaryDetail.forwardPE.fmt;
const revenue = _isEmpty(quote.quoteSummary.result[0].financialData.totalRevenue) ? '-' : quote.quoteSummary.result[0].financialData.totalRevenue.fmt;
const revGrowth = _isEmpty(quote.quoteSummary.result[0].financialData.revenueGrowth) ? '-' : quote.quoteSummary.result[0].financialData.revenueGrowth.raw * 100;
const earnGrowth = _isEmpty(quote.quoteSummary.result[0].financialData.earningsGrowth) ? '-' : quote.quoteSummary.result[0].financialData.earningsGrowth.raw * 100;
const freeCash = _isEmpty(quote.quoteSummary.result[0].financialData.freeCashflow) ? '-' : quote.quoteSummary.result[0].financialData.freeCashflow.fmt;
return [[divYield, payoutRatio, marketCap, fwdPE, revenue, revGrowth, earnGrowth, freeCash]];
}
}
function _isEmpty(obj) {
return Object.keys(obj).length === undefined;
}
請在此處查看示例表(選項卡JSON)。
問題是:并非每個股票代碼都會擁有我從雅虎請求的所有屬性。我嘗試了許多不同的方法來處理這個問題:
const payoutRatio = _isEmpty(quote.quoteSummary.result[0].summaryDetail.payoutRatio)
function _isEmpty(obj) {
return Object.keys(obj).length === undefined;
}
但這些都不起作用。在示例表中,我試圖在 ticker 上提取資料0P0001703K.SW,這是一個 ETF,因此它不會具有股票所具有的所有屬性。Google 表格回傳錯誤:
#Error! TypeError: Cannot read property 'totalRevenue' of undefined (line 19).
這讓我快瘋了:DI 一直在嘗試以多種方式捕捉此類錯誤。我的問題是:檢查屬性是否存在的正確方法是什么,如果不存在,則回傳-并繼續下一個屬性?您的幫助將不勝感激!
[編輯] 解決方案:
function _yahoofinance(ticker) {
const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' encodeURI(ticker)
'?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 price = quote.quoteSummary.result[0]?.price?.regularMarketPrice?.fmt || '-';
const divYield = quote.quoteSummary.result[0]?.summaryDetail?.dividendYield?.raw ? '-' : quote.quoteSummary.result[0].summaryDetail.dividendYield.raw * 100;
const payoutRatio = quote.quoteSummary.result[0]?.summaryDetail?.payoutRatio?.raw ? '-' : quote.quoteSummary.result[0].summaryDetail.payoutRatio.raw * 100;
const revenue = quote.quoteSummary.result[0]?.financialData?.totalRevenue?.fmt || '-';
return [[price, divYield, payoutRatio, revenue]];
}
}
uj5u.com熱心網友回復:
您可以使用可選鏈接而不是您的_isEmpty()函式,因為您檢查是否quote.quoteSummary.result[0].financialData.totalRevenue為空,但錯誤顯示為 undefined 的 'totalRevenue'。這意味著它financialData是未定義的,甚至在它進入您的 isEmpty 函式之前就會引發錯誤。
在您的示例中,它將類似于:
const revenue = quote.quoteSummary.result?.[0]?.financialData?.totalRevenue?.fmt || '-';
證明它檢查未定義(在最后一條評論之后):
const quote = {
quoteSummary: {
result: [{}]
}
}
const revenue = quote.quoteSummary.result?.[0]?.financialData?.totalRevenue?.fmt || '-';
console.log(revenue);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475725.html
標籤:javascript 谷歌表格
