问题标签 [google-sheets-custom-function]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3326 浏览

google-apps-script - OnEdit-trigger 与单元格函数相结合

我有一个 onEdit 脚本,它根据一行其他单元格的内容计算单元格的值。我需要此脚本位于 onEdit 触发器而不是常规单元格函数中,因为我并不总是希望在目标单元格中​​的值发生更改时重做计算,而是检查某些条件和仅在满足这些条件时才重新计算。

我遇到的一个小问题是 onEdit 脚本从中读取数据的单元之一包含一个函数而不是一个简单的数字。这会导致问题,因为有时当我在单元格中输入数据时,它会同时触发此单元格函数和 onEdit 脚本。大多数情况下,oEdit 函数在单元格函数完成之前运行,因此 onEdit 函数只是从该单元格中获取“思考”,因此它返回 NaN。

所以我想一个方便的解决方案是让 onEdit 函数等待“目标”单元格完成计算,但我认为没有办法做到这一点?

当然,我可以将单元函数(基本上是一个带有一些附加功能的 SUM 函数)移动到 onEdit 脚本,这将解决问题。

但对我来说,在 onEdit 触发器中具有所有交互性似乎并不好。还是我只是傻?

还是我可以采取另一种方法?

0 投票
1 回答
6262 浏览

google-apps-script - 无权在 Google Apps 脚本中调用 msgBox

即使是最简单的 Google Apps 脚本,我也无法运行,例如,当我通过将电子表格设置为单元格来运行此脚本时,=pantsHate(Y)我收到了以下错误:

错误:您无权调用 msgBox

我的最终目标是编写一个小函数来操作日期,特别是我需要准确找出两个日期之间经过了多少天(闰年、特定日期/月份等都是因素)。这个程序只是一个测试,但我似乎已经做错了什么......非常感谢任何帮助!

更新:我在一个新项目中尝试了这个并且它有效...... arg!
更新2:再次运行它=pantsHate("Y"),我得到了同样的错误,在这个“新”项目中......为什么谷歌,为什么?

0 投票
2 回答
1859 浏览

google-apps-script - Google 电子表格脚本每秒为此 Google 用户帐户调用的次数过多

我有一个带有脚本的谷歌电子表格来计算计数、权重等,并且电子表格在其单元格中多次调用脚本的函数。几天前,当我要更改数据时,它开始给我“每秒为此 Google 用户帐户调用太多次脚本”,我该如何解决这个问题?我会在函数中添加一个睡眠或等待函数,但这只会让它们执行得更慢,对吗?它不应该影响电子表格调用它们的速度吗?

0 投票
1 回答
145 浏览

google-apps-script - 有没有办法从 1 个函数调用而不是每个单元格的 1 个调用中填充所有单元格?

这是我的问题。我有一个包含多张工作表的电子表格,每张工作表大约有 300-500 行。我正在使用 ScriptDb 来存储每张工作表的数据。

我目前正在做的是在每张工作表的 300-500 个单元格中调用一个自定义函数来用数据填充某些单元格,而发生的情况是一些会填充,其余的会出错,说我在一个短暂的时期。显然,必须为每个单元格查询数据库并不是最好的解决方案。

我将如何查询当前工作表的所有数据,然后为每个单元格获取该数据。我读到的是,您不能在 GAS 中真正拥有“全局”变量,而是必须使用诸如 CacheService 或 ScriptDB 之类的东西,这就是我想要做的。我只是在查询它太多了。

有没有办法从 1 个函数调用而不是每个单元格的 1 个调用中填充所有单元格?我错过了什么或有什么其他解决方案?

刚刚意识到今天早些时候有人问了一个类似的问题:Google Spreadsheet Script invoked too many times per second per second for this Google user account

0 投票
3 回答
9046 浏览

javascript - 我可以将数组从 Google 电子表格传递到 Google App 脚本方法吗?

我可以将数组从 Google 电子表格传递到 Google App 脚本方法吗?

假设我有一个 App Script 函数,它需要一个包含两个元素的列表(注意:这个例子只是一个例子,所以请不要告诉我,如果我只是将每个元素作为单独的参数传递,我的问题就会得到解决)。如何从 Google 电子表格单元格调用此函数?

我都试过了:'=myFunc([1,2])' 和 '=myFunc((1,2))' 都给了我一个解析错误。

0 投票
1 回答
4143 浏览

google-apps-script - 不允许从自定义函数执行 sendEmail(),但可以在脚本编辑器中执行

我一直在尝试找到一种方法,将单行数据发送到我在我的域中使用的“实时/运行”电子表格中的特定电子邮件地址,以跟踪卡车司机及其上车号码。我设法使用工作表中提供的 Google Apps 脚本编辑器拼凑出一小段代码:

任何方式我都可以从我的电子表格中的单元格调用该函数,例如=sendEmail()它应该只从活动行发送信息,然后标记该行,EMAIL_SENT这样我就不会意外地再次这样做。

如果我从脚本编辑器内部运行脚本,并且对电子邮件地址进行硬编码,则该脚本运行完美,但如果我尝试从电子表格本身运行它,我会收到以下消息:

错误:您无权调用 sendEmail(第 19 行,文件“CPS_sendEmail.gs”)。

非常感谢您对此的任何帮助!这将有助于防止我的用户回到 MS Excel 和 Outlook。当我让这部分工作时,如果我可以让函数显示用户可以选择的地址列表,或者以其他方式让用户不必记住和输入驱动程序地址和承运人,但我很乐意让它按预期工作。

该脚本将/应该只允许在我的 Google 域中与我的用户一起运行,并且在我第一次执行它时 - 我确定我已经完成了授权过程,但并不真正理解这部分内容。

他们目前正在使用 MS Excel/Outlook,他们将行复制并粘贴到电子邮件中,他们可以使用他们的联系人从中进行选择。如果我无法获得使用 Google 联系人的功能,我正在考虑创建一张带有查找功能或其他功能的驱动程序表——当联系人就在那里时,必须保留一份列表有点痛苦——但你做你必须做的事!

0 投票
2 回答
21761 浏览

debugging - 在 Google Apps 脚本中调试自定义函数

我正在尝试在 Apps 脚本中为 Google 电子表格创建我的第一个自定义函数,但我很难使用调试器。

我正在处理Google 文档中的自定义函数演示代码drivingDistance(origin, destination),并且我在电子表格单元格中使用的自定义函数中设置了一个断点。我遇到的问题是,调试器将传递给函数的参数显示为 is undefined。但是,在执行期间创建的任何其他变量的内容都会正确显示(只要它们不依赖于输入参数)。

有趣的是,虽然输入参数显示为未定义,但函数的计算成功了,所以这似乎是调试器的问题。不幸的是,这个问题使我无法成功地学习创建和调试自己的代码(因为我将不得不使用复杂的输入参数)。

我感觉问题与 Apps Script 的服务器端执行有关,所以我尝试使用 Logger 类记录输入参数,并尝试将这些变量复制到新的局部变量中。但我想出的只是undefined

另一个奇怪的提示是,typeof参数返回String。但是获取它们的长度会引发错误并尝试将它们与另一个字符串连接会返回字符串“未定义”(请参阅​​我的屏幕转储)。

调试器截图

我正在寻找有关这里发生的事情的见解。

0 投票
13 回答
40600 浏览

google-apps-script - 新的 Google 表格自定义功能有时会无限期显示“正在加载...”

专用于:仅“新”谷歌表格

这是谷歌在新表格中强调的一个已知问题。

问题:如果您在 google-apps-script 中为 google 表格编写复杂的*自定义函数,您偶尔会遇到单元格,单元格周围会显示一个红色错误框,并带有文本“正在加载...”

谷歌建议:

如果发生这种情况,请尝试重新加载页面或重命名函数并将所有引用更改为新名称。

但是,对于遇到此问题的其他开发人员(并且无法逃脱“正在加载...”错误),我已经在下面的答案中写下了我的发现,说明如何始终如一地克服这个问题(有限制)。


*我们将此问题视为 Google 表格不确定的“错误...正在加载数据”问题的规范答案。它不仅限于复杂或缓慢的功能。

0 投票
1 回答
1005 浏览

javascript - 将来自多个单元的数据合并为一个

我在谷歌电子表格中整理了一个很长的电子表格。此电子表格包含有关产品的信息,例如名称、品牌、零件编号等……我之前得到了帮助并给出了一些不错的解决方案,但我仍然遇到了限制。

我要做的是根据其他单元格中的信息自动生成一个描述字段。

我在描述栏中使用的公式是="Brand Name"&" "&A3&" "&B3&" "&(joinVals(E3:G3," x "))&" "&K3

joinVals(E3:G3," x ")将包含长度(E)宽度(F)高度(G)的单独列连接在一起并在值之间添加“x”。这导致 E x F x G

此脚本适用于上述公式

但是我不断收到此错误

每秒为此 Google 用户帐户调用的脚本次数过多。

我想知道我是否可以将其作为数组来避免错误,因为该文档包含 1000 多个 ROWS。

当一切都说完了,我想要实现的结果应该是这样的“品牌名称”零件编号(A)产品名称(B)尺寸(E x F x G)尺寸(K)

我应该运行 ARRAY 脚本吗?

非常感谢大家,这个论坛对我很有帮助!

0 投票
3 回答
7649 浏览

javascript - 在 Google 表格自定义功能中引发自定义异常和错误消息?

在 Google 表格(如 Excel 等)中,如果用户在公式中输入错误的输入,错误代码将打印在有问题的单元格中,并且一个小弹出窗口会提供有关错误的更多详细信息。所以如果我输入 '=SQRT(-1)', '#NUM!' 打印在单元格中,并且弹出窗口说明该值需要等于或大于 0。

如何使用 Google 表格中的自定义函数复制此内容?抛出异常通常有效。例如,如果我捕获一个越界输入值,然后抛出一个自定义异常,“#ERROR!” 打印在有问题的单元格中(这很好),异常的随附字符串打印在相应的弹出窗口中(这也很好)。问题在于 Google Apps 脚本引擎还将生成异常的相应源代码行附加到异常消息中。因此,弹出窗口不会简单地显示“输入值必须介于 0.0 和 1.0 之间”,而是会显示“输入值必须介于 0.0 和 1.0 之间(第 199 行)”。

有什么方法可以抑制行号的打印,或者覆盖弹出的消息?我希望能够抛出自定义错误并为我的用户提供详细的错误消息。但我不希望他们因引用与他们无关的行号而感到困惑。