Использование Google Sheet в качестве веб-сервиса

У меня есть сложный лист со многими формулами и значениями ячеек, который вычисляет результат на основе некоторых заданных значений в определенных ячейках. По сути, я хочу использовать этот лист как функцию: калькулятор на основе веб-сервиса, который принимает аргументы (из другого веб-приложения) и выдает некоторый результат json. Теперь последняя часть (возврат данных) обрабатывается функцией Google Script doGet, например ContentService.createTextOutput(JSON.stringify(output)).

Что мне интересно: как мне передать листу мои входные аргументы?

Я хочу, чтобы этот «калькулятор» использовался несколькими пользователями (возможно) одновременно, поэтому я думаю, что не могу обновлять ячейки на листе, чтобы получать рассчитанные значения, иначе у меня возникнут некоторые проблемы, такие как конфликты записи и т. д.?

Есть ли что-то вроде виртуальных ячеек в Google Sheet? Есть ли другие способы добиться этого?

Вы можете использовать LockService для предотвращения конфликтов, но это скорее случайность, когда одновременные запросы выполняются слишком быстро. Существует также потолок в 30 одновременных запросов.

TheMaster 08.04.2019 14:05

@TheMaster, есть ли способ/хак, чтобы не было одновременной записи в общий ресурс (ячейку листа)? Может быть, сделать копию всего листа, а затем удалить его или что-то в этом роде?

Twice_Twice 08.04.2019 14:30

Вам, вероятно, лучше воспроизвести свою логику в JavaScript, так как тогда у него не будет общих ресурсов для использования. В качестве альтернативы, продублируйте свой расчетный лист несколько раз (заботясь о том, чтобы в нем не было слишком много ячеек или слишком много данных, которые вы нарушаете внутренние ограничения размера) и отслеживайте, какие из них используются с CacheService

tehhowch 08.04.2019 15:25

@tehhowch, это главное - лист с формулами и расчетами должен быть черным ящиком, который понимает и редактирует только аналитик, поэтому я не могу/не должен воспроизвести логику в Javascript. Я проверю CacheService, спасибо!

Twice_Twice 08.04.2019 15:29

Скажите аналитику написать это на JavaScript ;)

tehhowch 08.04.2019 15:39

@ Дважды LockService это путь. Когда я говорю «слишком быстро», я имею в виду очень-очень быстро — порядка миллисекунд.

TheMaster 08.04.2019 16:22

@TheMaster Спасибо, но не могу принять ваш комментарий. Можете ли вы опубликовать это как ответ?

Twice_Twice 08.04.2019 17:59

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

Cooper 08.04.2019 18:00

@Cooper, именно поэтому я задал этот вопрос, получив много разных мнений :) не могли бы вы рассказать о своем подходе?

Twice_Twice 09.04.2019 06:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
635
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  • 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))
}

Использованная литература:

Другие вопросы по теме