我正在尝试为 Excel 编写自定义函数,它将数组(即一系列单元格)作为输入并返回一个值或一个数组。
这是我的
function.ts
文件中的示例:
/* global clearInterval, console, CustomFunctions, setInterval */
// OTHER FUNCTIONS
/**
* Percent bias
* @customfunction
* @param Observed Observed Data
* @param Simulated Simulated Data
* @returns Percent bias
*/
function PBias(Observed: number[], Simulated: number[]): number {
let sum_obs = Observed.reduce((partialSum, a) => partialSum + a, 0);
let sum_sim = Simulated.reduce((partialSum, a) => partialSum + a, 0);
return (100 * (sum_sim - sum_obs)) / sum_obs;
}
}
构建时没有任何问题,但是当我开始调试时,出现错误,提示我的自定义函数未加载。
如果我取出
PBias
,其他功能就会加载并正常工作。
这些功能似乎按预期工作:TS游乐场演示
我已尝试使用全新安装的 Node.js(版本 18.18.0)和 Yeoman Generator for Office Add-ins(版本 4.3.1,使用 Excel 自定义函数和共享运行时)。
我能够解决这个问题,或者至少找到一个解决方法。范围似乎被视为二维数组。因此,输入应定义为
any[][]
。我认为这是 Yeoman 最新版本中引入的一个错误,因为我看到过使用 number[]
或 any[]
作为输入的在线教程。无论如何,我上面的函数的这个变体都会被加载并正常工作。
在这里,我在计算之前将数组展平。
/**
* Percent bias
* @customfunction
* @param Observed Observed Data
* @param Simulated Simulated Data
* @returns Percent bias
*/
export function PBias(Observed: number[][], Simulated: number[][]): number {
let sum_obs = 0;
let sum_sim = 0;
sum_obs = Observed.reduce(function (a, b) {
return a.concat(b);
}) // flatten array
.reduce(function (a, b) {
return a + b;
}); // sum
sum_sim = Simulated.reduce(function (a, b) {
return a.concat(b);
}) // flatten array
.reduce(function (a, b) {
return a + b;
}); // sum
return (100 * (sum_sim - sum_obs)) / sum_obs;
}
我仍然有兴趣看看是否有更好的方法或更清晰的解释。