【问题标题】:Google sheet custom function returns undefined Values sometimes谷歌工作表自定义函数有时会返回未定义的值
【发布时间】:2019-10-13 16:08:27
【问题描述】:

我在 Google Sheet Apps Script 中编写了一个函数来返回股票的最新每周收盘价。
但是当在谷歌表格中使用它时,一些单元格会得到未定义的数据。 但有时相同的单元格会获得正确的值。无法理解这里有什么问题。 当我从 googlesheet 单元格执行函数时,还有什么选项可以调试我的代码?

function getWeeklyClosing(stockName){

  var date =new Date()
  var endDate = Utilities.formatDate(new Date(), "GMT+1", "yyyy/MM/dd")

  var startDate = Utilities.formatDate(new Date(date.getTime()-10*(24*3600*1000)), "GMT+1", "yyyy/MM/dd")

  var url ='https://www.quandl.com/api/v3/datasets/BSE/BOM'+stockName+'?start_date='+startDate+'&end_date='+endDate+'&collapse=weekly&api_key=3VCT1cPxzV5J4eGFwfvz';
  var options =
      {
        'muteHttpExceptions': true,
        "contentType" : "application/x-www-form-urlencoded",
        "headers":{"Accept":"application/json"}
      }; 
  var response = JSON.parse(UrlFetchApp.fetch(url, options))
  var weeklyEma=response.dataset.data[0][4];
  return weeklyEma;
}

【问题讨论】:

  • 如果您阅读urlfetch的标签页,您就会明白您的问题是错误的
  • @AntonDementiev 我不认为这与提到的问题重复,恕我直言,这是我在answer 中提到的 x-y 问题@
  • 如果您使用getWeeklyClosing作为自定义函数,当=getWeeklyClosing(value)的多个公式放入单元格时,这些公式将与异步过程一起运行。在这种情况下,可以认为多个自定义函数中的每一个UrlFetchApp都是以异步进程运行的。但我无法理解undefined dataasynchronous UrlFetchApp 之间的关系。你能解释一下吗?如果你想用同步过程运行它们,那么将值作为数组提供怎么样?如果我误解了您的问题,我深表歉意。
  • @TheMaster 好的,现在了解 urlFetch。但是现在我的问题有什么解决方案吗?我怎样才能得到正确的数据?

标签: google-apps-script google-sheets google-sheets-formula urlfetch custom-function


【解决方案1】:

此答案对应于标题为“如何在 appscript 中使用 Promise?”的 question rev 3

问题的标题是询问尝试的解决方案,而不是实际问题(X-Y 问题)。 UrlFetchAp.fetch 是异步的假设是错误的(参见Is google apps script synchronous?);实际问题是在某些单元格上获得未定义的值。

解决方案将取决于您在获取响应时要执行的操作 导致未定义的值。一种替代方法是在将值发送到电子表格之前将未定义的值替换为 ""(一个空字符串),这将导致 Google 表格上出现一个空单元格。

另一方面,您查询的 API 可能没有返回您认为的 JSON,因此首先您必须了解它,然后设置有关如何将结果发送到电子表格的规则,并非总是如此可以将 JSON 转换为简单的表结构。

【讨论】:

    【解决方案2】:

    UrlFetchApp.fetch(url) 返回一个 HTTP 响应对象。此响应包含一个 HTTP 响应代码,该代码可以 200 成功获取,但由于多种原因可能返回其他代码。

    过去有人建议使用一种称为指数回退的算法,例如在这种情况下Error message: "Cannot connect to Gmail"。注意不要超过 30 秒的执行时间限制。

    相关

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      相关资源
      最近更新 更多