Google Apps脚本/ Slack-异步或快速响应

问题描述 投票:0回答:1

我正在为日常签到的工作人员构建一个Slack应用。人员使用Slack中的/checkin斜杠命令签入。 Slack需要在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吗?

javascript google-apps-script v8 slack slack-api
1个回答
0
投票

答案:

使用PropertiesService将用户名存储到脚本的属性中,然后在返回到Slack之后运行函数logUser()

更多信息:

您可以直接将信息存储为脚本属性,然后在logUser()函数中使用它来登录用户。这将需要对当前代码进行一些重新处理,但基本运行情况如下:

  • 在POST上,将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);
  });  
}

希望对您有帮助!

参考:

© www.soinside.com 2019 - 2024. All rights reserved.