所有自定义函数在一个电子表格中返回“未知函数”,但在其他电子表格中工作

时间:2015-06-16 21:03:54

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

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

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

library(survey)
data(api)
## one-stage cluster sample
dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)

# you subset by all men, i subset by
y <- subset( dclus1 , yr.rnd == 'No' )

# you have actv_30 == 1 i have cnum == 1
# and your p040 is equivalent to stype
svymean(~factor(interaction( stype , cnum == 1 ) ),y)

当我复制电子表格时,随附的代码 DOES 可以正常工作。

一些注意事项:

  1. 这是Google Apps for Enterprise帐户。

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

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

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

    有什么想法吗?

9 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

同样,在线程末尾,但这是我在此找到的唯一线程- 我的函数也运行良好,突然返回Unknown Function。 我发现签名已更改-最初,我有几个要发送的参数,而返回错误的单元格在函数调用中仍然有参数。该函数已经很长时间没有使用参数了。我删除了参数,瞧!显然,开始执行呼叫模式的地方发生了变化...

答案 2 :(得分:1)

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

要创建自定义函数,我执行了以下操作:

  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 输入中选择最新版本号并点击“保存”。

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

答案 3 :(得分:0)

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

使用它的唯一方法就是在没有实际发布它作为插件的情况下去工具菜单,点击脚本编辑器并实际复制绑定到它使用的工作表的脚本中的代码,然后粘贴它在您要使用它的工作表的脚本编辑器中。

答案 4 :(得分:0)

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

重新加载页面并关闭并重新打开并不能解决该问题。我添加了一个简单的无参数包装函数,以使用一些适当的参数来调用自定义函数。

然后我在调试器中使用原始定制函数中的断点运行此包装器函数。遇到问题时,我切换回电子表格,它可以神奇地再次看到自定义功能。

答案 5 :(得分:0)

如果您已经作为附件发布,则需要通过以下步骤重新激活复印纸的附件:

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

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