Google Apps 脚本/Slack - 异步或快速响应
Google Apps Script / Slack - async or a quick response
我正在为进行日常签到的员工构建一个 Slack 应用程序。工作人员在 Slack 中使用 /checkin
斜杠命令签到。 Slack 要求在 3 秒内响应斜杠命令。如果没有,则它会向启动命令的人发出 operation_timeout 错误。
在我的设置中,斜线命令第一次对每个用户都失败,但第二次总是有效。有没有办法确保脚本在 3 秒内响应,而不是依赖这个问题消失? Google Apps 脚本似乎有点慢。即使是 return 一个简单的回复似乎也很慢。
我可以先return快速响应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 的 运行ning,以允许消息尽早 returned 到 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 Sheet(我们每天都有一个),根据员工电子表格检查发起 Slack 命令的人的 SlackID,找到发起它的人,然后将该名称发布到正确的 Google Sheet。这可能很耗时,所以我可以理解为什么这会阻止响应。
在 return 响应 Slack 后,logUser 可以 运行 吗?
答案:
使用 PropertiesService
将用户名存储到脚本的属性中,然后 运行 返回 Slack 后的函数 logUser()
。
更多信息:
您可以直接将信息存储为脚本 属性,然后在您的 logUser()
函数中使用它来让用户登录。这需要对您当前的代码进行一些修改,但是 bsaic 运行下来会是这样:
- 在 POST 上,将
userId
存储为脚本 属性
- 将基于时间的触发器设置为 运行
logUser()
在未来未指定的时间内
- Return 你的内容到 Slack
然后触发 logUser()
:
- 获取当前脚本属性
- 逐一检查并记录到 sheet
- 用户登录后删除属性。
代码:
首先在您的 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);
});
}
参考文献:
我正在为进行日常签到的员工构建一个 Slack 应用程序。工作人员在 Slack 中使用 /checkin
斜杠命令签到。 Slack 要求在 3 秒内响应斜杠命令。如果没有,则它会向启动命令的人发出 operation_timeout 错误。
在我的设置中,斜线命令第一次对每个用户都失败,但第二次总是有效。有没有办法确保脚本在 3 秒内响应,而不是依赖这个问题消失? Google Apps 脚本似乎有点慢。即使是 return 一个简单的回复似乎也很慢。
我可以先return快速响应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 的 运行ning,以允许消息尽早 returned 到 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 Sheet(我们每天都有一个),根据员工电子表格检查发起 Slack 命令的人的 SlackID,找到发起它的人,然后将该名称发布到正确的 Google Sheet。这可能很耗时,所以我可以理解为什么这会阻止响应。
在 return 响应 Slack 后,logUser 可以 运行 吗?
答案:
使用 PropertiesService
将用户名存储到脚本的属性中,然后 运行 返回 Slack 后的函数 logUser()
。
更多信息:
您可以直接将信息存储为脚本 属性,然后在您的 logUser()
函数中使用它来让用户登录。这需要对您当前的代码进行一些修改,但是 bsaic 运行下来会是这样:
- 在 POST 上,将
userId
存储为脚本 属性 - 将基于时间的触发器设置为 运行
logUser()
在未来未指定的时间内 - Return 你的内容到 Slack
然后触发 logUser()
:
- 获取当前脚本属性
- 逐一检查并记录到 sheet
- 用户登录后删除属性。
代码:
首先在您的 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);
});
}