Google apps script GoogleSheet自定义函数有时返回未定义的值

Google apps script GoogleSheet自定义函数有时返回未定义的值,google-apps-script,google-sheets,google-sheets-formula,urlfetch,custom-function,Google Apps Script,Google Sheets,Google Sheets Formula,Urlfetch,Custom Function,我编写了一个函数,在谷歌Sheet应用程序脚本中返回股票的最新每周收盘价。 但是当在谷歌表单中使用这个时,一些单元格会得到未定义的数据。 但同一个细胞有时会得到正确的值。我不明白这里有什么问题。 当我从googlesheet单元格执行函数时,是否有调试代码的选项 function getWeeklyClosing(stockName){ var date =new Date() var endDate = Utilities.formatDate(new Date(), "GMT+1"

我编写了一个函数,在谷歌Sheet应用程序脚本中返回股票的最新每周收盘价。 但是当在谷歌表单中使用这个时,一些单元格会得到未定义的数据。 但同一个细胞有时会得到正确的值。我不明白这里有什么问题。 当我从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;
}


这个答案对应的标题是如何在appscript中使用Promise

问题的标题是询问一个尝试性的解决方案,而不是实际的问题——X-Y问题。UrlFetchAp.fetch是异步的假设是错误的,请参见;实际问题是在某些单元格上获取未定义的值

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

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

UrlFetchApp.fetchurl返回HTTP响应对象。此响应包括一个HTTP响应代码,该代码可能会导致成功获取,但由于多种原因可能会返回其他代码

过去有人建议使用一种称为指数退避的算法,如本例。注意不要超过30秒的执行时间限制

相关的


如果您阅读的标签页,您将了解您的问题是错误的@AntonDementiev可能是重复的我不认为这是重复的参考问题,因为,IMHO,这是一个x-y问题,正如我在上一篇文章中提到的,如果您使用getWeeklyClosing作为自定义函数,将多个公式=getWeeklyClosingvalue放入单元格时,这些公式将与异步进程一起运行。在这种情况下,可以认为多个自定义函数的每个UrlFetchApp都使用异步进程运行。但我无法理解未定义数据和异步UrlFetchApp之间的关系。你能解释一下吗?如果您想使用同步进程运行它们,那么将这些值作为一个数组提供如何?如果我误解了你的问题,我道歉。@TheMaster Ok,现在明白了。但是现在有什么办法解决我的问题吗?如何正确获取数据?