“Excel.run”是不是不适用于用户定义的函数?

Posted

技术标签:

【中文标题】“Excel.run”是不是不适用于用户定义的函数?【英文标题】:Does "Excel.run" Not Work For User Defined Functions?“Excel.run”是否不适用于用户定义的函数? 【发布时间】:2019-12-11 13:06:24 【问题描述】:

有没有办法使用 Excel.run 从工作簿中获取数据,然后使用该数据与参数一起计算 UDF?我知道您可以从互联网上获取数据并得出一个数字(https://docs.microsoft.com/en-us/office/dev/add-ins/tutorials/excel-tutorial-create-custom-functions?tabs=excel-windows 请参阅标题“创建从网络请求数据的自定义函数”) 下面是我的 Excel 示例

/**
 * Bending (Minutes)
 * @customfunction bendingMinutes
 * @param number lotRun
 * @param number bendLengthInches
 * @param number numOfBends 
 * @param number easy1OrHard2
 * @returns number bendingMinutes
 */
async function bendingMinutes(lotRun, bendLengthInches, numOfBends, easy1OrHard2) 
  try 
    let procEff;
    let secsPerBend;
    await Excel.run(async (context) => 
      const rangeProc = context.workbook.worksheets.getItem("Table").getRange("A2:B7");
      const rangeSecs = context.workbook.worksheets.getItem("Table").getRange("D2:E7");
      procEff = context.workbook.functions.lookup(lotRun, rangeProc);
      secsPerBend = context.workbook.functions.lookup(bendLengthInches, rangeSecs);
      procEff.load('value');
      secsPerBend.load('value');
      await context.sync();
      const response = await fetch(procEff.value);
      const response1 = await fetch(secsPerBend.value);
      console.log(procEff.value);
      console.log(secsPerBend.value);
    );
    if (easy1OrHard2 == 1) 
      return (secsPerBend.value * numOfBends / procEff.value / 60);
     else 
      return ((secsPerBend.value * numOfBends / procEff.value / 60) * 1.2);
    
   catch (errorHandlerFunction) 
  ;

【问题讨论】:

【参考方案1】:

目前自定义函数不支持调用 Excel JS API。您可以使用 SharedApp 模式在自定义函数中调用 Excel JS API (https://docs.microsoft.com/en-us/office/dev/add-ins/tutorials/share-data-and-events-between-custom-functions-and-the-task-pane-tutorial) 请问您为什么要从 API 获取表格信息而不是参数?如果您使用 API 获取它们,如果表中的值更新,自定义函数将不会重新计算。

【讨论】:

你好 ruoyingl!感谢你的回复。我阅读了该链接并获得了更好的说明。如何使用 onCalculated 事件实现对 Office API 的调用? 您是否尝试在自定义函数执行后调用 API?您可以直接在事件处理程序中注册 onCalculated 事件和所有 API。此逻辑应写入您的加载项(而不是自定义函数)。如果这是您的要求,请告诉我。 嗨 ruoyingl,是的,这正是我需要做的。我将如何在加载项而不是自定义函数中编写逻辑?我研究了 onCalculated 事件,但在尝试理解它时遇到了困难 我明白你的意思。加载项应该能够知道自定义函数执行何时完成。有正在进行的工作来启用这种情况,但现在不可用。感谢您的关注,文档应该更新。目前,您可以尝试在 SharedApp 模式下从自定义函数调用 API。

以上是关于“Excel.run”是不是不适用于用户定义的函数?的主要内容,如果未能解决你的问题,请参考以下文章

用户定义的语言不适用于 Notepad++ 中的指定文件类型

UITapGestureRecognizer 不适用于自定义 UIView 类

Dask数据框中的多个聚合用户定义函数

装饰器适用于函数但不适用于类

授权不适用于用户搜索

用于检查值是不是在列表中的逻辑不适用于 set