У меня есть сложный лист со многими формулами и значениями ячеек, который вычисляет результат на основе некоторых заданных значений в определенных ячейках.
По сути, я хочу использовать этот лист как функцию: калькулятор на основе веб-сервиса, который принимает аргументы (из другого веб-приложения) и выдает некоторый результат json.
Теперь последняя часть (возврат данных) обрабатывается функцией Google Script doGet
, например ContentService.createTextOutput(JSON.stringify(output))
.
Что мне интересно: как мне передать листу мои входные аргументы?
Я хочу, чтобы этот «калькулятор» использовался несколькими пользователями (возможно) одновременно, поэтому я думаю, что не могу обновлять ячейки на листе, чтобы получать рассчитанные значения, иначе у меня возникнут некоторые проблемы, такие как конфликты записи и т. д.?
Есть ли что-то вроде виртуальных ячеек в Google Sheet? Есть ли другие способы добиться этого?
@TheMaster, есть ли способ/хак, чтобы не было одновременной записи в общий ресурс (ячейку листа)? Может быть, сделать копию всего листа, а затем удалить его или что-то в этом роде?
Вам, вероятно, лучше воспроизвести свою логику в JavaScript, так как тогда у него не будет общих ресурсов для использования. В качестве альтернативы, продублируйте свой расчетный лист несколько раз (заботясь о том, чтобы в нем не было слишком много ячеек или слишком много данных, которые вы нарушаете внутренние ограничения размера) и отслеживайте, какие из них используются с CacheService
@tehhowch, это главное - лист с формулами и расчетами должен быть черным ящиком, который понимает и редактирует только аналитик, поэтому я не могу/не должен воспроизвести логику в Javascript. Я проверю CacheService
, спасибо!
Скажите аналитику написать это на JavaScript ;)
@ Дважды LockService
это путь. Когда я говорю «слишком быстро», я имею в виду очень-очень быстро — порядка миллисекунд.
@TheMaster Спасибо, но не могу принять ваш комментарий. Можете ли вы опубликовать это как ответ?
Одна из проблем такого рода вопросов заключается в том, что вы получаете много разных мнений. Лично я бы использовал вашу сложную электронную таблицу в качестве шаблона, который копируется для каждого пользователя.
@Cooper, именно поэтому я задал этот вопрос, получив много разных мнений :) не могли бы вы рассказать о своем подходе?
Не рекомендуется комбинировать формулы со сценарием, поскольку это неэффективно и чревато ошибками. Однако, если нет другой альтернативы, можно попробовать следующее.
LockService
используется для предотвращения конфликтовflush()
используется для предотвращения кэширования/**
* Retrieves value in a spreadsheet based on inputs provided
* @param {Number} a1 - A number to input in a1 of sheet1
* @param {Number} b1 - A number to input in b1 of sheet1
* @return {Number} c1 - The value in c1, which was modified by formulas? due to a1 and b1 inputs
*/
function blackBox_(a1,b1) {
try{
LockService.getScriptLock().waitLock(2000);//Wait to get lock for 2s(Unreliable?)
const ss = SpreadsheetApp.getActive();
ss.getRange("Sheet1!A1:B1").setValues([[a1,b1]]);
SpreadsheetApp.flush(); //flush the changes
return ss.getRange("Sheet1!C1").getValue();
} catch(e) {
return e;
}
}
function doGet(e){
//e=e || {};
const par = e.parameter || {};
const a1 = par.a1 || 2;
const b1 = par.b1 || 2;
console.info(blackBox_(a1,b1))
}
Вы можете использовать LockService для предотвращения конфликтов, но это скорее случайность, когда одновременные запросы выполняются слишком быстро. Существует также потолок в 30 одновременных запросов.