当脚本无法接受输入时,如何修复Google电子表格中的自定义功能?

时间:2019-07-13 20:13:31

标签: google-apps-script google-sheets google-sheets-formula custom-function alphavantage-api

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

type Data = {
  name: string
  age: number
}

const data: Data = {
  name: 'Jack',
  age: 33,
}

function change<K extends keyof Data>(name: K, value: Data[K]): Data[K] {
  return data[name] = value
}

change('name', 'Jill') // infers change<'name'>, value: string
change('age', 21) // infers change<'age'>, value: number

这是我要在Google表格中创建的自定义函数。应该从JSON数据中提取数据。

=STOCKC(AMD)

logger.log(closepriear)显示我想要的数据,但前端无法打印。

我知道

  

参考不存在

前端错误。

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

    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;
}

2 个答案:

答案 0 :(得分:2)

问题

要了解自定义函数粘贴值时发生了什么,您可以参考setValues()类的Range方法文档(Google Sheets API for apps脚本),其工作原理几乎相同方式-从函数返回值时,它们将被解释为二维Array,如下所示(单个值的解释与setValue()相同):

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

解决方案

  1. Array元素重新设置为[33.2100](如果仅需要值);
  2. 在输出之前在对象上使用JSON.stringify()(如果需要保留obj);

有用的链接

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

答案 1 :(得分:1)

问题1:

AMD在前端不存在。这是一个#REF错误(引用不存在),因为未定义AMD。如果AMD是纯字符串文字而不是命名范围,则需要对其进行引用,就像在JavaScript中一样。

=STOCKC("AMD")    

问题2:

返回变量closepricear是一个对象数组。您需要使用JSON.stringify(closepricear)或2D数组返回单个值:

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