【问题标题】:Custom function (UDF): how to input values as a range? [duplicate]自定义函数 (UDF):如何将值作为范围输入? [复制]
【发布时间】:2019-10-18 09:51:40
【问题描述】:

我需要从 CEX.IO 获取 OHLC 数据并放入必要的单元格中的对名称下。 为此,我在 Google 电子表格中有一些简单的自定义函数,用于从 CEX.IO 检索 OHLC:

function OHLCV_CEXIO_1d(date,pair){  
 var site = "https://cex.io/api/ohlcv/hd/";
 var url = site + date + "/" + pair;
 var response = UrlFetchApp.fetch(url);
 var json = response.getContentText();
 var data = JSON.parse(json);
 var result = data.data1d;

 return result;
}

当我将 pair 指定为单个单元格(例如,“BTC/USD”或单元格“B1”)时,此脚本运行良好。

但是当我需要将pair 指定为范围时,我会看到“正在加载...”,然后是空单元格。 比如我有这样的表:

          A      B       H       N
1              BTC/USD ETH/USD BCH/USD
2     20190712

如果我在=OHLCV_CEXIO_1d("20190712",B1) 中使用公式,一切都会好的。 但如果我尝试像这样使用ARRAYFORMULA=ARRAYFORMULA(IF(B1:1>0,OHLCV_CEXIO_1d("20190712",B1:1),"")) 我将收到空单元格B2。 据我了解,我需要更改脚本以将输入值识别为数组(或范围?)。

因此,我希望单元格 H2 和 N2 将自动填充为数组

您能否建议如何解决我的问题?

UPD:感谢所有回复链接的人。但我已经把它们和许多其他的都涂红了。 现在我在这里:

function OHLCV_CEXIO_1d(date,pair){
    if (date.map) {
     return date.map(OHLCV_CEXIO_1d);
    } else {
       if (pair.map) {
        return pair.map(OHLCV_CEXIO_1d);
       } else {
        var url = "https://cex.io/api/ohlcv/hd/" +date +"/" +pair +"/";
        var response = UrlFetchApp.fetch(url);
        var json = response.getContentText(); 
        var data = JSON.parse(json);
        var result = data.data1d;
           return result; 
       }  
    } 
}

现在我有了公式:=ARRAYFORMULA(IF(A2:A10>0;IF(B1:1>0;OHLCV_CEXIO_1d(A2:A10; B1:1);"");"")) 一切正常,直到var data = JSON.parse(json); 此时我收到一个错误:SyntaxError: Unexpected token: <

有人可以修改我的脚本并帮助解决这个问题吗?提前谢谢!

【问题讨论】:

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


【解决方案1】:

您似乎将硬对象(又名Array)传递给递归。这不好。

改用flat 参数

/**
 *
 * @param {(string | Array.<string>)} date
 * @param {(string | Array.<string>)} pair
 */
function OHLCV_CEXIO_1d(date, pair) {
  try {
    date = Array.isArray(date) ? date.flat(2) : [date];
    pair = Array.isArray(pair) ? pair.flat(2) : [pair];
    return date.map(function(date) {
      return pair.map(function(pair) {
        var url =
          'https://cex.io/api/ohlcv/hd/' +
          date +
          '/' +
          pair +
          '/';
        var response = UrlFetchApp.fetch(url, {
          muteHttpExceptions: true
        });
        var json = response.getContentText();
        var data = JSON.parse(json);
        var result = data.data1d;
        return result;
      });
    });
  } catch (err) {
    return Utilities.formatString(
      '%s\n%s',
      err.message,
      err.stack
    );
  }
}

你可以在jonathantneal/array-flat-polyfill那里找到polyfill的代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    相关资源
    最近更新 更多