Использование Google Sheet в качестве веб-службы - PullRequest
0 голосов
/ 08 апреля 2019

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

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

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

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

1 Ответ

0 голосов
/ 08 апреля 2019

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

  • 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.log(blackBox_(a1,b1))
}

Ссылки:

...