javascript - Google Apps Script / Slack - 异步或快速响应
问题描述
我正在为进行日常签到的员工构建一个 Slack 应用程序。员工/checkin
在 Slack 中使用斜杠命令签到。Slack 要求在 3 秒内响应斜杠命令。如果没有,那么它会给发起命令的人一个 operation_timeout 错误。
在我的设置中,斜杠命令第一次对每个用户都失败,但第二次总是有效。与其依靠这个问题消失,有没有办法确保脚本在 3 秒内响应?Google Apps Script 似乎有点慢。即使返回一个简单的响应似乎也很慢。
我可以先快速回复 Slack,然后再处理数据吗?看来我的 logUser 函数执行时间比 3s 长。或者它可以以非阻塞方式运行吗?但即便如此,反应似乎还是慢得不合理。
function doPost(request){
var params = request.parameters;
var user = params.user_id;
var text = params.text;
if(text == ''){
logUser(user);
return ContentService.createTextOutput(':white_check_mark: Checked In! Thank you! <@' + user + '> ');
}
}
编辑:我想我可以ScriptApp.newTrigger("logUser").timeBased().after(200).create();
用来延迟 logUser 的运行,以允许消息提前返回给 Slack。但是后来我失去了为 logUser 函数提供参数的能力?
编辑:logUser
按要求运行
function logUser(user){
var checkinSheet = getTodaySheet();
var name = getNameFromId(user);
var date = new Date();
var time = date.getTime();
checkinSheet.appendRow([name, user[0], "TRUE"]);
}
logUser 正在选择正确的 Google 表格(我们每天都有一个),根据员工电子表格检查启动 Slack 命令的人的 SlackID,找到启动它的人的姓名,然后将该姓名发布到正确的谷歌表。这可能很耗时,所以我可以理解为什么这会阻止响应。
将响应返回给 Slack 后可以运行 logUser 吗?
解决方案
回答:
使用 将PropertiesService
用户名存储到脚本的属性中,然后logUser()
在您返回 Slack 后运行该函数。
更多信息:
您可以将信息直接存储为脚本属性,然后在您的logUser()
函数中使用它来登录用户。这将需要对您当前的代码进行一些修改,但基本运行如下:
- 在 POST 上,将 存储
userId
为脚本属性 - 将基于时间的触发器设置为
logUser()
在未来未指定的时间内运行 - 将您的内容返回给 Slack
然后触发logUser()
:
- 获取当前脚本属性
- 分别浏览每一个并将它们记录到工作表中
- 用户登录后删除该属性。
代码:
首先在你的doPost()
:
function doPost(request){
var params = request.parameters;
var user = params.user_id;
var text = params.text;
if(text == ''){
PropertiesService.getScriptProperties().setProperty(user, "logged-in");
ScriptApp.newTrigger("logUser").timeBased().after(200).create();
return ContentService.createTextOutput(':white_check_mark: Checked In! Thank you! <@' + user + '> ');
}
}
然后为您的logUser()
功能:
function logUser(){
var checkinSheet = getTodaySheet();
var usersToLogIn = PropertiesService.getScriptProperties().getKeys();
var date = new Date();
var time = date.getTime();
usersToLogIn.forEach(function(user) {
var name = getNameFromId(user);
checkinSheet.appendRow([name, user[0], "TRUE"]);
PropertiesService.getScriptProperties().deleteProperty(user);
});
}
参考:
推荐阅读
- angular - 如何使用同步融合表以角度显示行悬停图标
- keras - 理解 keras.layers.Embedding
- java - 如何根据主报表的页码设置子报表中的文本表达式时的打印
- javascript - 如何使用带有无线电前置的输入来选择一些此类输入之一
- firebase - 我应该将图片上传到 Cloud Firestore 还是 Firebase Storage?
- python - 优化 Pandas 的 replace() 以替换 0 以外的值
- python - Django - 用户搜索
- database - 概率:使用随机样本估计 NoSQL 查询大小/计数
- python - 如果字符串包含两个元素,如何拆分字符串
- reactjs - 我可以将 react-app 部署到 SAP Cloud Platform 吗?