Javascript等待动态输入

时间:2014-09-12 21:37:15

标签: javascript random google-apps-script google-sheets

我正在使用Tim Cooper在stackoverflow上共享的a script to generate random numbers in multiple columns of a spreadsheet的变体,它通过选择任何范围的连续单元格并从onOpen菜单运行脚本来工作。

变体在Google表格中作为自定义函数实现,并使用INPUT列(A)中的值作为相邻OUTPUT列(B)中生成的随机数的最大值,而电子表格又使用该值来导出后续的INPUT值。一个简化的例子:

  

自定义函数读取A1并在B1中写入0到A1(80)之间的随机数。然后通过向B1等添加10来计算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检查确定成功,如果失败,则setTimeout的函数为100.不幸的是,Google Apps脚本似乎不支持setTimeout

我很欣赏有关如何获取电子表格和使用动态值一起工作的脚本的建议。

1 个答案:

答案 0 :(得分:0)

问题在于Google Apps脚本的前瞻缓存,它将自定义函数限制为在调用自定义函数时电子表格中存在的值。

可以使用SpreadsheetApp.flush()更新缓存 - 将自定义函数计算的新值写入电子表格,并将结果值从电子表格读入缓存 - 但方法是因为需要反复进行以保持缓存新鲜,所以很慢,甚至电子表格中的某些单元格可能会卡住“正在加载...”

最后,我选择将电子表格中的所有计算移动到自定义函数中。它需要一些学习,但它更快,永远不会冻结。通过将值存储在全局数组中(每个字符和圆形以及由易于命名的全局常量而不是数字引用的值)并将计算隔离在它们自己的函数中,它很容易管理和修改。

根据桑迪的建议,根本问题从未得到解决,而是侧重,I posted the issue on Google's Apps Script Issues and Requests