我正在为执行日常签到的工作人员构建一个Slack App。在Slack中使用/checkin
斜杠命令进行人员签入。松弛要求在3秒内对slash命令作出响应。如果不是,则会向发起该命令的人员显示operation_timeout错误。
在我的设置中,斜杠命令对每个用户来说都是第一次失败,但是第二次总是起作用。除了依靠这个问题解决之外,还有没有办法确保脚本在3秒内响应? Google Apps脚本似乎有点慢。即使返回简单的响应也很慢。
我可以先对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,找到发起它的人的名字,然后发布该名字放入正确的Google表格。这可能很耗时,所以我可以理解为什么这会阻止响应。
将响应返回给Slack后可以运行logUser吗?
答案 0 :(得分:2)
使用PropertiesService
将用户名存储到脚本的属性中,然后在返回到Slack之后运行函数logUser()
。
您可以直接将信息存储为脚本属性,然后在logUser()
函数中使用该信息来登录用户。这将需要对当前代码进行一些重新处理,但基本的运行方式如下:
userId
存储为脚本属性logUser()
然后触发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);
});
}
我希望这对您有帮助!