1

Я использую вариант a script to generate random numbers in multiple columns of a spreadsheet, который поделился Тимом Купером в stackoverflow, который работает, выбирая любой диапазон смежных ячеек и запуская скрипт из меню onOpen.Javascript Wait for Dynamic Input

Вариант реализован как пользовательская функция в Таблицах Google и использует значения из столбца INPUT (A) в качестве максимальных значений для случайных чисел, сгенерированных в соседнем столбце OUTPUT (B), которые, в свою очередь, используются электронной таблицей для выведите последующие значения INPUT. Упрощенный пример:

Пользовательская функция считывает A1 и записывает случайное число между 0 и A1 (80) в B1. А2 затем вычисляется путем добавления 10 к B1 и т.д.

 | A | B | 
    1 | 80 | 75 | 
    2 | 85 | 63 | 
    3 | 73 | 52 | 
    4 | 62 | 40 | 
    5 | 50 | 25 | 

Проблема заключается в том, что электронные таблицы требуется некоторое время, чтобы заполнить следующее значение входного сигнала (в данном случае, А2), который будет производить ошибки при слишком медленно подавать вход для пользовательской функции для вычисления случайного значения в следующей строке.

Как есть, пользовательская функция представляет собой единый блок кода, который идентифицирует активный лист и диапазон ячеек. Затем он перебирает количество строк, извлекает входные значения, определяет случайные значения и записывает их в соседние ячейки.

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 Script не кажется, поддержка комплектTimeout.

Я был бы признателен за предложения по созданию таблицы и скрипта, который использует динамические значения для совместной работы.

+0

Я использовал бы '.getValue()' один раз, чтобы получить первое значение. Вы указали, что следующее значение столбца задается добавлением 10 к последнему значению столбца B. Таким образом, код имеет доступное ему значение. Вам не нужно извлекать его из листа. Если у вас есть формулы в столбце A, избавьтесь от них и просто установите значение столбца A из кода. –

+0

@ Сэнди - пример упрощения. Фактические расчеты более сложны и включают в себя другие движущиеся части над несколькими ячейками. – user345360

+0

Это может быть глупая, сумасшедшая идея, но если вы каким-то образом запустите JavaScript из HTML и каким-то образом используете запрос AJAX, есть способы подождать, пока ответ не вернется. –

ответ

0

Проблема заключается в надежном кэшировании сценариев Google Apps, который ограничивает пользовательские функции теми значениями, которые присутствовали в электронной таблице во время вызова пользовательской функции.

Возможно использование SpreadsheetApp.flush() для обновления кэша - выведение новых значений, вычисленных пользовательской функцией, в электронную таблицу и чтение в результате значений из электронной таблицы в кеш - но подход выполняется медленно, поскольку это необходимо сделать несколько раз, чтобы сохранить кеш свежим, и даже тогда некоторые ячейки в электронной таблице могут застрять «Загрузка ...»

В конце концов, я решил переместить все вычисления из таблицы в пользовательские функции. Это заняло некоторое обучение, но оно намного быстрее и никогда не зависает. Сохраняя значения в глобальных массивах (для каждого символа и в раундах и значениях, на которые ссылаются легко называемые глобальные константы вместо чисел) и изолируя вычисления в своих собственных функциях, легко управлять и возиться.

Поскольку основной вопрос никогда не был разрешен, а скорее побочным, I posted the issue on Google's Apps Script Issues and Requests, по предложению Сэнди.