如何将逻辑从 Google Sheet 公式移动到 Javascript?

How do you move logic from Google Sheet formula to Javascript?

我有一个函数 yahoofinance,它根据股票代码查询 Yahoo!Finance 的股票数据。在调用该函数之前,我需要对输入进行一些修改。

我的 sheet 中的代码采用 [venue].[company] 形式,例如 XNAS.GOOG(纳斯达克 Google),XAMS.INGA(阿姆斯特丹 ING 银行) 和 XSWX.CRSP(瑞士交易所的 Crispr)。

我在场馆使用的代码是国际代码,但大多数 API 不使用这些相同的代码。例如,阿姆斯特丹证券交易所的正式名称是 XAMS,但在 Google API 上是 AMS,而在 Yahoo 上是 AS。所以我有一个名为 Exchanges 的 sheet,其中列出了所有这些场所。当调用我的自定义yahoofinance函数时,它以标准'XMAS.INGA'作为输入,然后截断会场(XAMS)并查找雅虎名称(AS),然后将 INGA.AS 传递给 Yahoo API:

=yahoofinance(index(split(A2, "."), 0, 2) & "." & vlookup(index(split(A2, "."), 0, 1), Exchanges!E:J, 6, false))

function yahoofinance(ticker) {
  // send ticker to Yahoo API
}

现在位于 sheet 单元格 B2 中的逻辑越来越难以理解。如果可能的话,我想将它移动到函数中并仅传递来自 A2:

的代码
=yahoofinance(A2)

function yahoofinance(ticker) {
    const venue = ticker.split();
    // etc

    // end up with INGA.AS, and pass to Yahoo API
}

我的问题是:是否可以将 sheet 中的逻辑移至函数中?例如,我是否以及如何从 yahoofinance 中执行相同的 vlookup?有可能吗?

我打算真正扩展 yahoofinance 的功能,甚至可能将其重新设计为一个通用的 finance 函数,该函数也将 API 作为您要传递给它的参数自动收报机:=yahoofinance(ticker, api),所以非常感谢任何帮助我在这里打下坚实基础的人。

您可以试试这个自定义公式来获取修改后的值:

脚本:

function yahoofinance(ticker) {
  var [venue, company] = ticker.split("\.");
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Exchanges');
  var lastRow = sheet.getLastRow();
  // get Exchanges!E:J values
  var mapping = sheet.getRange(1, 5, lastRow, 6).getValues();
  // lookup equivalent, filter then get 6th column and append to company
  var modifiedTicker = company + '.' + mapping.filter(row => row[0] == venue).flat()[5];
  // you now have the modified ticker. Use it on your function.
  // ...
  return modifiedTicker;
}

B7公式:

=index(split(A2, "."), 0, 2) & "." & vlookup(index(split(A2, "."), 0, 1), Exchanges!E:J, 6, false)

输出: