Javascript等待动态输入

Javascript Wait for Dynamic Input

本文关键字:输入 动态 等待 Javascript      更新时间:2023-09-26

我使用脚本的变体在电子表格的多列中生成随机数,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的建议,我在谷歌的应用程序脚本问题和请求上发布了这个问题。