如何将逻辑从 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)
输出:
我有一个函数 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)