当脚本无法输入时,如何修复 google 电子表格中的自定义函数?

How to fix the custom function in google spreadsheet when the script can't take input?

我从 google 应用脚本编写了一个自定义函数。它应该从单元格中获取值并打印 JSON 数据。它成功地在后端工作。但是,我无法从前端输入任何内容。

=STOCKC(AMD)

这是我要在 google 工作表中创建的自定义函数。它应该从 JSON 数据中提取数据。

    function STOCKC(symbol){
    //this is the testcase for the backend
        //var symbol = "AMD";
        symbol = encodeURI(symbol);
       var url = "https://www.alphavantage.co/query?function=TIME_SERIES_WEEKLY&symbol="+symbol+"&apikey="+api_key;
       var responseUrl = UrlFetchApp.fetch(url);
       var response = responseUrl.getContentText();
       var stockdata = JSON.parse(response);
       var closepricear = new Array();

      if(Object.keys(stockdata).length > 1){
  var help = Object.keys(stockdata)[1];
    for(var i = 0; i < Object.keys(stockdata[help]).length; i++){
      var helpVal = Object.keys(stockdata[help])[i];
      var open = Object.keys(stockdata[help][helpVal])[0];
      var close = Object.keys(stockdata[help][helpVal])[3];
      var low = Object.keys(stockdata[help][helpVal])[2];
      var volume = Object.keys(stockdata[help][helpVal])[4];
      var high = Object.keys(stockdata[help][helpVal])[1];
      var date = Object.keys(stockdata[help]);

     closepricear.push({"close":stockdata[help][helpVal][close]})
    // closepriceard.push(date)
    }
  }
       Logger.log(closepricear);
       return closepricear;
}

logger.log(closepriear) 显示了我想要的数据,但是前端不会打印。

我明白了

reference doesn't exist

前端出错。

这是最接近的 Logger.log() 数据。这是我进行后端测试时得到的。这是一长串数据,包括以下内容。

[19-07-13 15:52:55:823 PDT] [{close=33.2100}, {close=31.5000}, {close=30.3700}, {close=29.1000}, {close=30.3600}, {close=32.4100}, {close=27.4100}, {close=26.4400}, {close=27.5000}, {close=27.9600}, {close=28.2200}, {close=27.8800}, {close=27.6800}, {close=27.8500}, {close=28.9800}, {close=25.5200}, {close=26.3700}, {close=23.2900}, 

问题#1:

AMD 在前端不存在。这是一个 #REF 错误(引用不存在),因为 AMD 未定义。如果 AMD 是一个普通的字符串文字而不是一个命名范围,你需要引用它,就像你在 JavaScript 中所做的那样。

=STOCKC("AMD")    

问题#2:

return 变量 closepricear 是一个对象数组。您需要使用 JSON.stringify(closepricear) 或二维数组 return 单个值:

closepricear.push([stockdata[help][helpVal][close]])

问题

要了解当您的自定义函数粘贴值时发生了什么,您可以参考 setValues() 方法文档 Range class (Google Sheets API 对于应用程序脚本),它的工作方式几乎相同 - 当您从函数中 return 值时,它们被解释为 two-dimensional Array 像这样(单个值被解释等同于 setValue()):

//pseudo-code; [ row1: [col1,colN], rowN: [col1,colN] ]

解决方案

  1. 将您的 Array 元素重新格式化为 [33.2100](如果您只需要值);
  2. 在输出前对对象使用 JSON.stringify()(如果需要保留对象);

有用链接

  1. setValue()方法reference;
  2. setValues()方法reference;