我正在使用 a script to generate random numbers in multiple columns of a spreadsheet 的变体,正如 Tim Cooper 在 stackoverflow 上分享的那样,它的工作原理是选择任何范围的连续单元格并从 onOpen 菜单运行脚本。
该变体在 Google 表格中作为自定义函数实现,并使用输入列 (A) 中的值作为相邻输出列 (B) 中生成的随机数的最大值,电子表格又使用这些值来导出随后的输入值。一个简化的例子:
The custom function reads A1 and writes a random number between 0 and A1 (80) in B1. A2 is then calculated by adding 10 to B1, etc.
| A | B |
1 | 80 | 75 |
2 | 85 | 63 |
3 | 73 | 52 |
4 | 62 | 40 |
5 | 50 | 25 |
问题是电子表格需要一些时间来填充下一个输入值(在本例中为 A2),当为自定义函数提供输入来计算随机值的速度太慢时,这会产生错误下一行。
照原样,自定义函数是一个代码块,用于标识事件工作表和单元格范围。然后,它循环遍历行数,检索输入值,确定随机值并将它们写入相邻的单元格。
function generate_random_numbers()
{
var sheet = SpreadsheetApp.getActiveSheet()
var range = sheet.getActiveRange()
var counter = 0
for (var y = 1; y <= range.getHeight(); y++)
{
counter = counter + 1
if (counter != 3)
{
var maximum = range.getCell(y, 1).getValue()
var random = (maximum != 0) ? Math.floor(Math.random() * maximum) + 1: 0
}
else
{
random = ""
counter = 0
}
range.getCell(y, 2).setValue(random)
}
}
我考虑将函数拆分为一个单独的部分来检索值,并使用 isNaN 检查来确定是否成功,如果失败则将函数 setTimeout 设为 100。不幸的是,Google Apps 脚本似乎不支持 setTimeout。
我希望获得有关如何获取电子表格和使用动态值顺利协同工作的脚本的建议。
最佳答案
问题出在 Google Apps 脚本的前瞻缓存中,它将自定义函数限制为调用自定义函数时电子表格中存在的值。
可以使用 SpreadsheetApp.flush() 来更新缓存——将自定义函数计算出的新值写入电子表格,并将电子表格中的结果值读入缓存——但方法是速度很慢,因为需要重复执行才能保持缓存最新,即使如此,电子表格中的某些单元格可能会卡在“正在加载...”
最后,我选择将电子表格中的所有计算移至自定义函数中。这需要一些学习,但速度要快得多,而且永远不会卡住。通过将值存储在全局数组中(每个字符并存储到轮次中,以及通过易于命名的全局常量而不是数字引用的值)并将计算隔离在它们自己的函数中,可以轻松管理和修改。
由于根本问题从未得到解决,而是被回避了,I posted the issue on Google's Apps Script Issues and Requests ,根据桑迪的建议。
关于Javascript 等待动态输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25817234/