当脚本无法输入时,如何修复 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] ]
解决方案
- 将您的
Array
元素重新格式化为 [33.2100]
(如果您只需要值);
- 在输出前对对象使用
JSON.stringify()
(如果需要保留对象);
有用链接
我从 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] ]
解决方案
- 将您的
Array
元素重新格式化为[33.2100]
(如果您只需要值); - 在输出前对对象使用
JSON.stringify()
(如果需要保留对象);
有用链接