【问题标题】:Google Apps Script / Slack - async or a quick responseGoogle Apps Script / Slack - 异步或快速响应
【发布时间】:2020-06-11 09:46:33
【问题描述】:

我正在为每天签到的员工构建一个 Slack 应用程序。员工在 Slack 中使用 /checkin 斜杠命令签到。 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 吗?

【问题讨论】:

  • 你能展示你的logUser()函数吗?
  • @RafaGuillermo 添加。执行确实需要时间。我想我需要在将消息返回给 Slack 后能够运行它。不知道如何。
  • 是否有可能多人同时或大约同时登录?另外,您在记录的登录时间上有多少余地?
  • @RafaGuillermo 很可能很多人会在同一时间运行该脚本。记录签到时间的余地很大。如果需要,几分钟。

标签: javascript google-apps-script v8 slack slack-api


【解决方案1】:

答案:

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

更多信息:

您可以将信息直接存储为脚本属性,然后在您的 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);
  });  
}

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多