【问题标题】:ALL Custom Functions return "unknown function" in one spreadsheet, but work in others所有自定义函数在一个电子表格中返回“未知函数”,但在其他电子表格中有效
【发布时间】:2015-06-16 21:03:53
【问题描述】:

我有几个一直在使用的简单自定义函数。我最近遇到了一个我迫切需要使用它们的电子表格,但是当我尝试使用最基本的自定义函数时,我得到“#NAME?”带有“未知功能”的悬停文本。

即使删除所有其他代码,只尝试这个简单的功能,似乎也不起作用:

function double(d) {
  return 2*d;
}

当我复制电子表格时,它附带的代码确实可以工作。

一些注意事项:

  1. 这是一个 Google Apps for Enterprise 帐户。

  2. 我原本不是这个电子表格的所有者,但后来成为了所有者,认为这可能是原因。

  3. 电子表格最初有受保护的区域,后来被删除,认为这可能是原因。

这个电子表格与数百人共享,所以我真的很想找到根本原因并修复它。

有什么想法吗?

【问题讨论】:

  • 首先检查傻瓜。代码是在 .html 文件而不是 .gs 文件中吗?您是否正在编辑位于不同电子表格中的脚本?您感兴趣的自定义函数是否包含在另一个函数中(从而隐藏它们)?你save 脚本了吗?你可以在调试器中运行double() 吗?
  • 检查了所有愚蠢的东西 - 它是一个 .gs,它在正确的电子表格中,它是一个根级函数,它已保存,可以在调试器中运行,已授予权限文档等。最后注意 - 我可以简单地复制电子表格,并且在副本中,所有自定义函数都按预期复制工作。
  • 这似乎是电子表格文件的问题,而不是编程问题,您应该向 Google Apps for Work 支持寻求帮助,但这很可能是使用另一个解决方案文件。
  • 嗨!我删除了数组 sheet.macros 的内容(其中有一些测试宏),它开始工作。

标签: google-apps-script google-sheets custom-function


【解决方案1】:

对于 OP 来说为时已晚,但万一这对其他人有帮助: 我有一个类似的问题,我的电子表格突然停止识别已经工作了几个月的自定义函数。最近没有进行任何代码更改,并且自上次工作以来甚至没有编辑过电子表格。当我转到Tools > Script editor 时,它仍然显示带有自定义函数的代码。

重新加载页面并关闭并重新打开并没有解决它。我添加了一个简单的无参数包装函数来调用带有一些适当参数的自定义函数。

然后我在调试器中运行了这个包装函数,并在原始自定义函数中设置了一个断点。当它碰到这个时,我切换回电子表格,它可以神奇地再次看到自定义函数。

【讨论】:

  • 我的电子表格也无法识别长期有效且未更改的函数。看到这个答案后,我尝试以一种不应该有所作为但确实有所作为的方式更改代码。我有函数 f(x, y) 并且对我来说 x 在所有调用中都是恒定的,所以我创建了 g(y) ,它使用固定的 x 调用 f(x,y) 并将所有对 f(x,y) 的调用修改为g(y) 并最终奏效了。
  • “这个包装函数”是什么意思?
【解决方案2】:

如果您已经作为插件发布,那么您需要通过以下步骤重新激活复制工作表的插件:

  • 点击菜单附加组件/您的添加名称/帮助/在商店中查看,
  • 单击“管理”,然后在下拉菜单中取消选中,然后再次选中“在此文档中使用”,以便将插件加载到当前工作表中。

【讨论】:

  • 它有帮助。谢谢!
  • 有效,但我认为自从您发布此内容后,用户界面已经发生了变化。在“在商店中查看”之后,我必须进行设置(右上角的齿轮图标)> 管理应用程序 > 选项(3 个垂直点)> 切换“在本文档中使用”
  • 请注意,如果您已经为整个域安装了插件,我什至无法找到“在本文档中使用”的方法。我必须卸载该域的插件,然后为每个电子表格安装个人才能找到提到的菜单@GraemePyle。
【解决方案3】:

我无法解释确切的原因,但这里有一个解决方案:

  1. 复制写在单元格中的表达式
  2. 删除单元格的内容
  3. 在单元格中重新输入表达式!

【讨论】:

  • 这对我来说不是完整的解决方案,但它是每个具有自定义功能的解决方案(包括我找到的那个)中的重要一步。
  • 这在过去对我有用,我忘记了这种简单易用的有效重新初始化函数的方法。再次像魅力一样工作。
【解决方案4】:

再次,在线程的后期,但这是我在此找到的唯一线程 - 我的函数也运行良好,突然返回未知函数。 我发现签名已经改变 - 最初,我有一些我要发送的参数,并且返回错误的单元格在函数调用中仍然有参数。该函数已经很长时间没有使用参数了。我删除了参数,瞧!显然,在开始强制执行调用模式的地方发生了一些变化……

【讨论】:

  • 我的帖子也是一个决议。
【解决方案5】:

当您在工作表上有自定义函数时 - 它们是该工作表的BOUND。因此,当您复制 sheet 本身时它确实有效,但它不会自动成为全局或域范围的自定义函数。

在其他地方使用它而不实际将其作为附加组件发布的唯一方法是转到工具菜单,单击脚本编辑器并实际从绑定到它的工作表的脚本中复制代码,然后粘贴在要使用它的工作表的脚本编辑器中。

【讨论】:

    【解决方案6】:

    我也遇到了同样的问题。我在这里记录,什么对我有用。

    为了创建一个新的自定义函数,我做了以下操作:

    1. 在电子表格中:菜单 -> 工具 -> 脚本编辑器
    2. 在脚本编辑器中编写函数
    3. 在电子表格中:菜单 -> 工具 -> 导入 -> 单击自定义函数名称旁边的“添加函数”。
    4. 在电子表格中:在单元格中,我做了=CustomFunctionName()

    这行得通。

    现在,当我想在另一个电子表格中重用相同的内容时,有两种方法可以做到这一点。

    1. Make Copy 写自定义函数的工作表。
    2. 通过为特定工作表编写特定的自定义函数,创建自定义函数库并在其他工作表中重用它们。

    #1 复制写入自定义函数的工作表。

    这样,整个自定义函数代码就会被复制。因此,如果需要在自定义函数中进行任何更改,则必须在所有复制的文件中进行更改。 此外,一旦复制了工作表,自定义功能就不会简单地工作。 我必须删除单元格并再次重新输入函数名称,才能让它们正常工作。

    #2 通过编写特定于特定工作表的自定义函数,创建自定义函数库并在其他工作表中重用它们。

    这样更好,因为核心逻辑将保留在一个地方。将为每张使用自定义函数的工作表编写包装函数。

    创建一个库:

    1. 在脚本编辑器中编写函数
    2. 点击“部署 -> 新建部署”
    3. “选择类型 -> 库”
    4. 如果需要,请提供说明并单击“部署”和“完成”
    5. 单击左侧菜单中的“项目设置”并复制“脚本 ID”(以使用库)

    使用库:

    1. 转到要在其中使用库的电子表格。
    2. 菜单 -> 工具 -> 脚本编辑器
    3. 在脚本编辑器中:单击左侧库部分旁边的+ 按钮。
    4. 输入“脚本 ID”并单击“查找”。
    5. 您将看到脚本详细信息。然后点击“添加”按钮。
    6. 记住“标识符”字段值。使用它,可以访问库的功能。
    7. 现在,在脚本编辑器中,您可以使用标识符名称调用库函数。请参阅下面的示例。

    库代码:

    function SheetName() {
      return SpreadsheetApp.getActiveSpreadsheet().getName();
    }
    
    function SayHello(name) {
      return 'Hello ${name}';
    }
    
    

    假设在将这个库包含到电子表格中时,我输入了标识符utility。所以,在脚本编辑器中,我会这样写:

    function SheetName() {
      return utility.SheetName();
    }
    

    如何更新库并在电子表格中使用更新后的代码?

    要更新库:

    1. 在库项目中进行更改。
    2. 点击“部署 -> 管理部署”。
    3. 从左侧选择正确的部署。
    4. 点击编辑按钮(左上角)。
    5. 在“版本”输入中选择“新版本”。
    6. 单击“部署”并记下显示的新版本号。

    要使用更新的库:

    1. 转到已在其中使用库的电子表格并在其中打开脚本编辑器。
    2. 如果该工作表的脚本编辑器已打开,请重新加载页面一次。
    3. 单击Library 部分(左侧)中的库名称。
    4. Version输入中选择最新版本号并点击“保存”。

    现在,您可以像以前一样调用新函数,现有函数将以新方式工作(如果现有函数有任何更改)。

    【讨论】:

      【解决方案7】:

      我遇到了完全相同的问题!我的代码运行良好,并正确链接到正确的电子表格。不幸的是,删除单元格的内容对我不起作用。

      我找到的另一个解决方案是简单地重命名函数。

      例如: “myFunction”重命名为“my_Function”,它对我有用!我想这可能是由于大量的电话(在我的情况下超过 35 000)。也许它使它遇到错误或其他东西。 干杯!

      【讨论】:

      • 在您的情况下,myFunction 也可以使用。事情是,看起来,需要清除单元格并且需要重新输入函数名称。当您进行重命名时,您确实做到了。它导致重新评估并且您的代码有效。
      【解决方案8】:

      我创建了我的工作表的副本作为备份并关闭了一夜。我早上回来时无法调用功能。所以我照常做,从单元格中剪切函数并将其粘贴回来。这通常可以解决问题。这次不行。 尝试重新打开浏览器,尝试重新登录。没有任何效果。 比我简单地在项目编辑器中重命名函数(在函数名称前附加“调用”)并编辑工作表以匹配。它刚刚工作。

      【讨论】:

      • 我相信这与“Bérenger COLLOTTE”提出的解决方案相同?是否有任何新内容可以让未来的访问者受益于这个问题?
      【解决方案9】:

      在编写函数时,注释部分没有正确完成。这是我最初写的:

      /* 
       A custom function that converts US Dollars to SwissFrancs
      
       @param {number} dollars The total number of dollars
       @return {number} swissFrancs The total number of SwissFrancs
      
       @customfunction
      */
      

      在检查 cmets 后,我发现我错误地使用了注释符号。我应该在开始注释标记/* 之后放置一个星号,并在 cmets 的每个换行符上放置一个星号,最后在结束多行注释标记 (*/) 之前放置另一个星号,如下所示:

      /** 
      * A custom function that converts US Dollars to SwissFrancs
      *
      * @param {number} dollars The total number of dollars
      * @return {number} swissFrancs The total number of SwissFrancs
      *
      * @customfunction
      **/
      

      最后一件事,别忘了在评论区添加@customfunction

      【讨论】:

        【解决方案10】:

        根据Google 的文档,在自定义函数之前添加 cmets 很重要。否则该函数将不会出现在自动完成弹出窗口中。

        /**
         * Multiplies the input value by 2.
         *
         * @param {number} input The value to multiply.
         * @return The input multiplied by 2.
         * @customfunction
         */
        function DOUBLE(input) {
          return input * 2;
        }
        

        【讨论】:

          【解决方案11】:

          另一个迟到的条目。此错误也可能是签名违规。如果传递给自定义函数的变量类型与预期不同,则可能会发生这种情况。我正在“清理”我的电子表格并重新格式化了一些条目。这导致了一个未找到。如果您启用了提示功能,则可以轻松检测此错误。在我的例子中,我开始输入函数名称并且它出现了(所以谷歌知道它在那里),但是当它执行时我得到了错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-08-31
            • 2012-08-12
            • 2015-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多