[英]Javascript Wait for Dynamic Input
我正在使用一種腳本變體在電子表格的多列中生成隨機數 ,這由Tim Cooper在stackoverflow上共享,它可以通過選擇任意范圍的連續單元格並從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。
我非常感謝有關如何獲取電子表格和使用動態值來平穩工作的腳本的建議。
問題出在Google Apps腳本的超前緩存中,該緩存將自定義函數限制為調用自定義函數時電子表格中存在的值。
可以使用SpreadsheetApp.flush()更新緩存-將自定義函數計算出的新值寫入電子表格,並將結果從電子表格讀取到緩存中-但這種方法很慢需要重復進行以保持高速緩存的更新,即使這樣,電子表格中的某些單元格也可能會卡住“正在加載...”
最后,我選擇將所有計算從電子表格移至自定義函數。 它花了一些時間,但速度更快,而且從未停止。 通過將值存儲在全局數組中(每個字符並分成幾輪,並使用易於命名的全局常數而不是數字來引用值)並將計算隔離在它們自己的函數中,可以輕松管理和修改。
由於基本問題從未得到解決,而是回避了, 所以根據桑迪的建議, 我將該問題發布到了Google的Apps腳本問題和請求中 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.