【问题标题】:TypeError: Cannot read property 'regularMarketPrice' in Google Apps ScriptTypeError:无法在 Google Apps 脚本中读取属性“regularMarketPrice”
【发布时间】:2021-06-23 16:36:47
【问题描述】:

更新: 将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") 时,它会显示当前价格,但如果您等待一个小时并在下面的单元格中输入相同的公式,您会得到两个不同的价格。第一个公式没有更新的原因是什么。

旧: 这在前几天运行良好,现在我收到 TypeError: Cannot read property 'regularMarketPrice' of undefined(第 6 行,文件“代码”)。在谷歌表格中,我使用公式 =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]};

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我已经使用这种方式从 yahoo Finance 检索信息,并且效果很好,您可以在此处看到 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)
    }
    

    【讨论】:

    • 谢谢@Mike Steelson!效果很棒。
    • 有没有办法保留历史价格更新,以便我可以在价格旁边放一条迷你图?
    • 是的,获取docs.google.com/spreadsheets/d/… 的新副本,然后通过自定义菜单重新刷新或触发历史函数
    • @迈克·斯蒂尔森,谢谢!我使用了 on edit 触发器,以便在单击复选标记时添加。再次感谢您的帮助!
    【解决方案2】:

    更新:

    如下面的 cmets 所述,TypeError 发生在用户在 Apps 脚本中运行 marketPrice 函数时。

    假设marketPrice应该用作自定义函数,用户将函数名称输入到带有参数的Google Sheet中的单元格中,然后Google Sheet会将参数值传递给Apps编写函数并执行它。

    当用户直接向 Apps Script 运行函数时,marketPrice(code){} 中的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

    参考文献

    【讨论】:

    • 我进行了上述更改,并且在我的日志中出现此错误消息。 [21-06-23 12:03:37:160 PDT] TypeError:Cannot read property 'regularMarketPrice' of undefined at marketPrice(Code:6:91)
    • 您能打印出data.context.dispatcher.stores.StreamDataStore.quoteData.item(code) 的值并附在上面的帖子中吗?
    • 我尝试为常规市场价格运行 logger.log,但它永远不会显示任何内容
    • 你能试试 Logger.log(data.context.dispatcher.stores.StreamDataStore.quoteData) 吗?您帖子中的代码和我发布的代码都适用于我。
    • 我也试过了,除了日志中的错误消息外,仍然没有任何返回。我打开了一个新的谷歌表并使用了 =marketPrice("CL=F") 并将上面的代码放入 AppsScript 中,它显示了正确的价格。当我尝试直接从脚本页面运行它时仍然收到错误消息。当我尝试使用调试时,它的行为就像它想要显示一些东西然后什么都没有发生。
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多