Как отправить отложенный ответ (Slack api) с помощью веб-приложения Google Apps Script? - PullRequest
0 голосов
/ 21 февраля 2019

У нас есть небольшое веб-приложение Google Apps Script, которое обрабатывает команды Slack slash.Это делает некоторые удобные вещи, такие как добавление, обновление и запрос записей на наш лист, прямо из Slack.Все работает просто отлично большую часть времени.Однако Slack API ожидает ответа от запроса менее чем за 3 секунды, иначе он истечет.Наш скрипт Google Apps не всегда может ответить в этот период, который будет только ухудшаться по мере роста нашего листа или усложнения наших запросов.

Slack API позволяет использовать асинхронные вызовы с использованием отложенного ответа, но это означает, что Google Apps Script должен немедленно ответить (в течение 3 секунд) и выполнить некоторую работу в фоновом режиме.

Теперь это проблема

Я не могувыяснить, как заставить работать асинхронный вызов в скрипте Служб Google

Я знаю, что работники не поддерживаются в скрипте Служб Google, и мое решение, приведенное ниже, застряло в стене из-за ReferenceError: 'google' isне определено .(Просто игнорируйте класс Payload, он форматирует ответ Slack)

function doPost(request) {
  var responseUrl = request.parameter.response_url

  // This is how I try to circumvent the lack of threads in Google Apps Script
  google.script.run

  // Send an asynchronous slack response with result
  .withSuccessHandler(function(payload) {
    UrlFetchApp.fetch(responseUrl, {
      'method' : 'post',
      'contentType': 'application/json',
      'payload' : payload.toString()
    });
  })

  // Send an asynchronous slack response with error message
  .withFailureHandler(function(payload) {
    UrlFetchApp.fetch(responseUrl, {
      'method' : 'post',
      'contentType': 'application/json',
      'payload' : payload.toString()
    });
  })

  // do work in the background
  .sleep(5);

  return new Payload("Let me think about this...").asResponse();
}

function sleep(seconds) {
  Utilities.sleep(1000 * seconds);
  return new Payload("I waited for " + seconds + " seconds");
}

У кого-нибудь есть идеи, как заставить это работать?Существуют ли альтернативные решения для обработки асинхронного запроса в Google Apps Script?

1 Ответ

0 голосов
/ 21 февраля 2019

Мне также не известны какие-либо потоки в скрипте приложений, и, как вы заметили, google.script.run работает только в интерфейсе скрипта приложений.

В качестве обходного пути вы можете использовать Google Forms в качестве своей "очереди задач"».Я собрал простую G-форму с одним вопросом и проверил ее окончательную версию, чтобы получить соответствующие имена параметров и URL.Затем я установил устанавливаемый триггер on-form-submit для запуска моего скрипта.Вот мой код POC:

function doPost(e) {
  var form = 'https://docs.google.com/forms/d/e/1FAIpQLScWBM<my-form-id>CRxA/formResponse';
  UrlFetchApp.fetch(form, {method:'POST', payload:'entry.505669405=' + e.parameter.example});
  return ContentService.createTextOutput('OK');
}

function onForm(e) {
  //triggered async from doPost via a Google Forms
  SpreadsheetApp.getActive().getSheetByName('Sheet1').appendRow(e.values);
}

Он отлично работал на моих тестах и ​​должен подойти для вашего случая использования.

...