【问题标题】:How do you include external JavaScript for use in Excel custom functions?如何包含外部 JavaScript 以在 Excel 自定义函数中使用?
【发布时间】:2019-07-14 22:54:27
【问题描述】:

编辑:在问题末尾添加了简化的场景和重现步骤。请注意,我们的目标是在 Excel-Desktop 上包含 external 脚本,而不是通过其他方式让简化的场景工作。


我们都知道并喜欢自定义函数的股票价格示例,其中使用“获取”从源请求最新的股票价格:

https://docs.microsoft.com/en-us/office/dev/add-ins/tutorials/excel-tutorial-create-custom-functions?tabs=excel-windows#create-a-custom-function-that-requests-data-from-the-web

如果有一个外部 API 来获取股票价格,那也可以使用吗?像这样:

                   Stock Price Source
                           |  <----------- API knows how to get the stock price
           External Stock Price API Javascript Library
                           |  <----------- javascript function calls here
                    customfunctions.js
                           |
                         Excel

或者换句话说,customfunctions JavaScript 项目是否可以包含外部脚本,例如

<script type="text/javascript" src="https://example.com/stock-price-api.js />

我尝试在自定义函数项目的 index html 文件中包含这样的引用,在 AllFormFactors/ExtensionPoint 下的清单中为“xsi:type=CustomFunctions”包含脚本 URL,在“Resources/bt”下添加了脚本引用:Urls' 及其各种组合,但自定义函数本身似乎并不“知道”脚本(索引 html 文件在加载到浏览器时知道脚本,所以我知道引用是正确的)。我所尝试的都是猜测,因为我没有找到任何关于使用外部 API 的文档。我正试图让它在 Windows 桌面(64 位)上适用于 Excel。

可以吗?


编辑/更新:只需在示例项目的“index.html”文件中包含外部脚本,即可确认它对 Excel Online 工作正常。这适用于 Excel 桌面吗?


重现问题:

  1. 按照教程创建基本的自定义函数项目(使用 typescript 选项)并确保它们正常工作 (https://docs.microsoft.com/en-us/office/dev/add-ins/tutorials/excel-tutorial-create-custom-functions?tabs=excel-windows)

  2. 创建一个 javascript 文件“globalapi.js”并将其放入“dist/win32/ship”文件夹(包含自定义函数 javascript 的同一文件夹)。只需在“globalapi.js”文件中声明一个全局变量,如下所示:

    var someGlobalString = 'This is a global string';
    
  3. 在“index.html”文件中包含“globalapi.js”脚本;包含的所有脚本都是:

    <script src="https://officedev.github.io/custom-functions/lib/custom-functions-runtime.js" type="text/javascript"></script>
    <script src="dist/win32/ship/globalapi.js" type="text/javascript"></script>
    <script src="dist/win32/ship/index.win32.bundle" type="text/javascript"></script>
    
  4. 修改“customfunctions.ts”文件中的“add”函数,以便在定义“someGlobalString”时返回不同的内容:

    declare var someGlobalString: any;
    
    function add(first: number, second: number): number {
      if (typeof someGlobalString !== 'undefined') {
         return 99999;
      }
      return first + second;
    }
    

现在在 Excel 的单元格中输入自定义函数“=CONTOSO.ADD(1,2)”。对于 Excel Desktop(以“npm run sideload”开头),单元格中显示的结果为“3”,对于 Excel Online(加载清单后),结果为“99999”。

如何解释差异?

【问题讨论】:

  • 在 VBA 中,是的,你可以调用 Web API,这就是你要问的吗?
  • 正在阅读您的链接...有趣。从来没有冒险走这条路。
  • 谢谢。这次我只对 JavaScript Office 插件感兴趣。

标签: javascript excel office-js custom-functions-excel


【解决方案1】:

抱歉,最新的 Windows 版本目前存在一个错误,其中包含 Windows 版本 16.0.11406.20002 上的 Web 请求。

https://github.com/OfficeDev/Excel-Custom-Functions/issues/115

我们将在下一个版本发布到 Insiders 频道​​后立即更新该问题。

谢谢!

【讨论】:

  • 嗨,Keyur,感谢您抽出宝贵时间回复。我认为这可能是一个不同的问题。我发现任何包含的脚本,无论它是否包含“提取”,似乎都可以在 Excel Online 中工作,但在 Excel Desktop 中却不行。我将使用重现步骤更新问题。也许很明显我错过了什么?
  • 谢谢 JR,您是否包括通过自定义库获取?如果是这样,如果该库正在使用浏览器的某些其他机制(即 DOM)来发出 Web 请求,则可能无法正常工作。在 excel windows(最终是 mac)中,我们只加载一个 js 运行时(windows 上的 chakracore;Mac 上的 jsc)。这意味着我们就像 node.js 一样,您可能曾经在浏览器上使用的所有库都可能无法正常工作。有关更多信息,请参阅aka.ms/customfunctions 的自定义函数运行时文档。
  • 我现在更新了这个问题。如您所见,“globalapi.js”只是声明了一个全局变量,我不确定为什么桌面/在线的结果不同。可以用你所说的来解释吗?如果我还能做些什么来帮助解决或澄清问题,请告诉我。
  • 谢谢 J.R.,让我和团队核实一下,然后在星期一回来。
  • 您好 JR,因此您需要在输出中捆绑文件,以便 javascript 出现在您的 .bundle 文件中。您可以修改 webpack.config.js 并将列表添加到“条目”列表中的“globalapi.js”。此提交向您展示了一个示例:github.com/OfficeDev/Excel-Custom-Functions/commit/…(快速注意:如果您使用的是 Yeoman,我们尚未将此更新的模板合并到您的办公室)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多