数组作为自定义函数的输入导致加载项加载失败

问题描述 投票:0回答:1

我正在尝试为 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 自定义函数和共享运行时)。

javascript typescript office-js office-addins custom-functions-excel
1个回答
0
投票

我能够解决这个问题,或者至少找到一个解决方法。范围似乎被视为二维数组。因此,输入应定义为

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

我仍然有兴趣看看是否有更好的方法或更清晰的解释。

© www.soinside.com 2019 - 2024. All rights reserved.