从Yahoo Finance提取JSON数据的通用函数优化:Google Sheets横向输出调整与代码简化问询
解决Google Sheets自定义Yahoo Finance函数的横向输出与代码简化问题
嘿,我来帮你搞定这两个问题!咱们一个个来:
1. 实现横向输出的修改方案
Google Sheets里,自定义函数返回一维数组(比如[1.76, 0.75])时会默认纵向排列,要让它横向显示,只需要把这个一维数组包装成二维数组(比如[[1.76, 0.75]])就行。
你有两种修改方式:
方式一:直接在yFinance函数里修改返回值
找到yFinance里的返回语句:
return getMatchingValues(getPath(quote, 'quoteSummary/result/0'), paths);
把它改成:
return [getMatchingValues(getPath(quote, 'quoteSummary/result/0'), paths)];
这样就把一维数组包进了一个外层数组,Google Sheets会自动把它横向渲染在一行的相邻单元格里。
方式二:修改getMatchingValues函数
如果想让这个函数直接返回横向格式的数组,可以修改它的返回逻辑:
function getMatchingValues( obj, paths ) { return [paths.flatMap( path => getPath( obj, path ))]; }
这样调用它的时候直接返回二维数组,同样能实现横向输出。
2. 简化现有代码的方案
你的现有代码里,getPath函数处理了很多数组场景,但在这个Yahoo Finance的案例里,我们的路径都是对象层级(从quoteSummary/result/0之后都是对象属性,没有数组遍历的需求),所以可以大幅简化代码,甚至把getPath和getMatchingValues的逻辑整合到yFinance里,减少冗余。
下面是简化后的完整代码:
function yFinance(symbol) { const url = `https://query2.finance.yahoo.com/v10/finance/quoteSummary/${encodeURI(symbol)}?modules=summaryDetail`; // 只请求需要的模块(这里只用到summaryDetail,不需要其他模块,能减少返回数据量) const response = UrlFetchApp.fetch(url, {muteHttpExceptions: true}); if (response.getResponseCode() !== 200) { return -1; } const quote = JSON.parse(response.getContentText()); const result = quote.quoteSummary?.result?.[0]; if (!result) return "No data found"; // 直接提取需要的字段,不需要复杂的路径解析函数 const dividendRate = result.summaryDetail?.dividendRate?.raw; const payoutRatio = result.summaryDetail?.payoutRatio?.raw; // 返回二维数组实现横向输出 return [[dividendRate, payoutRatio]]; }
简化的关键点:
- 减少请求模块:原来的URL请求了很多不需要的模块(比如
price、assetProfile等),只保留summaryDetail就能拿到我们需要的股息率和派息率,减少数据传输量,提升速度。 - 直接属性访问:用可选链操作符(
?.)替代递归的getPath函数,代码更简洁易读,同时避免属性不存在时的报错。 - 整合逻辑:把原来三个函数的逻辑合并到一个函数里,减少函数嵌套,维护更方便。
如果之后需要扩展提取更多字段,只需要在最后添加对应的属性提取,并把它们加入返回的二维数组里就行,比如:
const peRatio = result.summaryDetail?.trailingPE?.raw; return [[dividendRate, payoutRatio, peRatio]];
这样修改后,调用=yFinance("KO")就会在相邻的单元格里横向显示数据啦!
内容的提问来源于stack exchange,提问作者Pr0no
相关产品推荐
相关产品推荐

