#javascript #post #google-apps-script #slack-api
#javascript #Публикация #google-apps-script #slack-api
Вопрос:
Итак, я пытаюсь создать SlackBot, который может отслеживать реакции на опубликованное сообщение. Тем не менее, я также пытаюсь читать из таблицы Google, поэтому код для бота будет находиться в скрипте Google, подключающемся к форме.
Мне явно нужно включить события, чтобы видеть реакции, и первым шагом является получение и ответ на запрос POST, который отправляет Slack:
Our Request:
POST
"body": {
"type": "url_verification",
"token": "---",
"challenge": "---"
}
Я должен ответить чем-то вроде:
HTTP 200 OK,
Content-type: text/plain,
"the challenge code"
Когда я получаю запрос POST, он перезаписывает квадрат 1,1 таблицы Google, что не очень хорошо, но, что более важно, моя функция doPost не запускается.
Вот что я получаю от Slack:
Your Response:
"code": 200
"error": "challenge_failed"
"body": {
<!DOCTYPE html><html><head><link rel="shortcut icon" href="//ssl.gstatic.com/docs/script/images/favicon.ico"><title>Error</title><style type="text/css">body {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}</style></head><body style="margin:20px"><div><img alt="Google Apps Script" src="//ssl.gstatic.com/docs/script/images/logo.png"></div><div style="text-align:center;font-family:monospace;margin:50px auto 0;max-width:600px">The script completed but did not return anything.</div></body></html>
}
Теперь, вот весь код, который у меня есть в моем Google Script.
function doPost(request){
var postJSON = request.postData.getDataAsString();
var sheet = SpreadsheetApp.getActiveSheet();
// doesn't happen
sheet.getRange(5, 3).setValue("YEAH");
// when I send a req using CURL, I get the message
// "The script completed but did not return anything"
return postJSON;
}
Он уже развернут как веб-приложение, и я обновляю его каждый раз, когда вношу изменения в код, так что это не проблема.
Любые советы будут оценены, спасибо!
Ответ №1:
Я думаю, что в этом случае требуется вернуть значение challenge
. Итак, как насчет следующей модификации?
От:
var postJSON = request.postData.getDataAsString();
Для:
var postJSON = JSON.parse(request.postData.getDataAsString());
А также, пожалуйста, измените следующим образом.
От:
return postJSON;
Для:
return ContentService.createTextOutput(postJSON.challenge);
Примечание:
- В этой модификации предполагается, что
postJSON
в вашем текущем скрипте есть{"type": "url_verification", "token": "---", "challenge": "---"}
. Пожалуйста, будьте осторожны с этим. - Кроме того, предполагается, что веб-приложения развертываются как
Execute the app as: Me
иWho has access to the app: Anyone, even anonymous
. - Когда скрипт веб-приложений будет изменен, пожалуйста, повторно разверните его как новую версию. При этом последний сценарий отображается в веб-приложениях. Пожалуйста, будьте осторожны с этим.