类型错误:无法在 Google Apps 脚本中读取属性“regularMarketPrice”

时间:2021-06-23 16:36:47

标签: google-apps-script google-sheets

更新: 将 data.context.dispatcher.stores.StreamDataStore.quoteData.item(code).regularMarketPrice.raw 更改为 data.context.dispatcher.stores.StreamDataStore.quoteData[code].regularMarketPrice.raw 后,我仍然收到错误消息 [21-06-23 14:47:53:398 PDT] TypeError: Cannot read property 'regularMarketPrice' of undefined at marketPrice(Code:6:91),当我尝试运行 Logger.log 时,它永远不会执行任何操作。此外,当我转到电子表格并使用公式 marketPrice("CL=F") 时,它会显示当前价格,但如果您等待一个小时并在下面的单元格中输入相同的公式,则会得到两个不同的价格。第一个公式没有更新的原因是什么。

旧: 这在最初几天工作正常,现在我收到一个类型错误:无法读取未定义的属性“regularMarketPrice”(第 6 行,文件“代码”)。在 Google 表格中,我使用公式 =marketPrice("CL=F")。

function marketPrice(code) {
  var url='https://finance.yahoo.com/quote/'+code
  var source = UrlFetchApp.fetch(url).getContentText()
  var jsonString = source.match(/(?<=root.App.main = ).*(?=}}}})/g) + '}}}}'
  var data = JSON.parse(jsonString)
  var regularMarketPrice = data.context.dispatcher.stores.StreamDataStore.quoteData.item(code).regularMarketPrice.raw
  return regularMarketPrice
}
Object.prototype.item=function(i){return this[i]};

2 个答案:

答案 0 :(得分:2)

我已经用这种方式从雅虎财经检索信息,效果很好,你可以在这里看到https://docs.google.com/spreadsheets/d/1zZhtvO74kE__k5N2VfbWypnfWt82lSwDkMKk9PL1bg4/copy

//Mike Steelson     
Object.prototype.item=function(i){return this[i]};    
function marketPrice(code) {
  var url='https://finance.yahoo.com/quote/'+code
  var source = UrlFetchApp.fetch(url).getContentText()
  var jsonString = source.match(/(?<=root.App.main = ).*(?=}}}})/g) + '}}}}'
  var data = JSON.parse(jsonString)
  var regularMarketPrice = data.context.dispatcher.stores.StreamDataStore.quoteData.item(code).regularMarketPrice.raw
  return regularMarketPrice
}

此外,如果您想刷新数据,请选中或取消选中 B2 中的复选框。

=marketPrice(A2,$B$1)

您可以在脚本中使用它,如下所示:

function localTest(){
  var code=('CL=F')
  var market_Price = marketPrice(code)
  Logger.log(market_Price)
}

答案 1 :(得分:1)

更新:

如以下评论中所述,当用户在 Apps 脚本中运行 TypeError 函数时会发生 marketPrice

据说,marketPrice 应该用作自定义函数,用户将函数名称输入到 Google Sheet 中带有参数的单元格中,然后 Google Sheet 将传递参数值到 Apps 脚本函数并执行它。

当用户直接向 Apps 脚本运行该函数时,code 中的 marketPrice(code){} 值将自动取消定义。

由于参数 code 未定义,脚本只能获取 https://finance.yahoo.com/quote/,而 regularMarketPrice 没有数据。

强制您的脚本在 code 中具有价值。您可以使用默认参数值。

示例:

function marketPrice(code="CL=F") {
  var url='https://finance.yahoo.com/quote/'+code
  var source = UrlFetchApp.fetch(url).getContentText()
  var jsonString = source.match(/(?<=root.App.main = ).*(?=}}}})/g) + '}}}}'
  var data = JSON.parse(jsonString)
  var regularMarketPrice = data.context.dispatcher.stores.StreamDataStore.quoteData.item(code).regularMarketPrice.raw
  return regularMarketPrice
}
Object.prototype.item=function(i){return this[i]};

注意:如果您将其用作自定义函数,这也将起作用。 Google 表格只会覆盖 code 的默认值。

对于不自动更新/刷新的自定义函数,您可以查看答案here

参考文献

相关问题