Javascript等待动态输入
Javascript Wait for Dynamic Input
我使用脚本的变体在电子表格的多列中生成随机数,Tim Cooper在stackoverflow上分享了这一点,它通过选择任何范围的连续单元格并从onOpen菜单运行脚本来工作。
该变体在Google Sheets中作为自定义函数实现,并使用INPUT列(a)中的值作为相邻OUTPUT列(B)中生成的随机数的最大值,电子表格依次使用这些值来导出后续INPUT值。一个简化的例子:
自定义函数读取A1,并在B1中写入0和A1之间的随机数(80)。然后通过将10加到B1等来计算A2。
| 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检查来确定成功,如果失败,则将函数设置为100。不幸的是,谷歌应用程序脚本似乎不支持setTimeout。
我很感激关于如何获得电子表格和脚本的建议,它们使用动态值来顺利地协同工作。
问题在于Google Apps Script的前瞻性缓存,它将自定义函数限制为调用自定义函数时电子表格中存在的值。
可以使用SpreadsheetApp.flush()来更新缓存——将自定义函数计算的新值写入电子表格,并将结果值从电子表格中读取到缓存中——但这种方法很慢,因为它需要重复执行才能保持缓存的新鲜,即使这样,电子表格中的一些单元格也可能会被"加载…"卡住
最后,我选择将所有计算从电子表格移到自定义函数中。这需要一些学习,但速度要快得多,而且永远不会冻结。通过将值存储在全局数组中(每个字符和循环中,以及由易于命名的全局常数而不是数字引用的值),并将计算隔离在各自的函数中,可以轻松管理和修改。
由于根本问题从未得到解决,而是回避了,根据Sandy的建议,我在谷歌的应用程序脚本问题和请求上发布了这个问题。
- Highcharts:根据表单输入动态显示数据
- 如何根据两个不同的输入动态设置链接的路径
- 使用用户输入动态转换数据(Highcharts,JavaScript,Django)
- 基于文本输入动态更改图片
- 如何为jQuery帖子输入动态数据参数
- 根据用户表单输入动态生成 SQL 语句
- 使用单选按钮将文本输入动态添加到列表中
- 如何将外部输入动态注入 SlimerJS 脚本
- 根据用户输入动态设置高图表尾行选项
- 如何根据输入动态形成字符串
- 将用户输入动态地附加到<script src=“">来自Java Script中的文本框
- 使用其他输入动态添加和删除输入
- Rails根据用户输入动态更新View
- 在Powerpoint中根据用户输入动态更改幻灯片
- 使用用户输入动态创建表
- 从输入动态添加选项
- 根据用户输入动态创建HTTP链接
- 如何检测输入动态变化时的变化
- Angular2使用输入动态添加到表单模型中
- 禁用按钮和输入动态名称