簡體   English   中英

Google Apps Script / Slack - 異步或快速響應

[英]Google Apps Script / Slack - async or a quick response

我正在為進行日常簽到的員工構建一個 Slack 應用程序。 員工在 Slack 中使用/checkin斜杠命令簽入。 Slack 要求在 3 秒內響應斜杠命令。 如果沒有,那么它會給發起命令的人一個 operation_timeout 錯誤。

在我的設置中,斜杠命令第一次對每個用戶都失敗,但第二次總是有效。 與其依靠這個問題消失,有沒有辦法確保腳本在 3 秒內響應? Google Apps Script 似乎有點慢。 即使返回一個簡單的響應似乎也很慢。

我可以先快速回復 Slack,然后再處理數據嗎? 看來我的 logUser function 的執行時間比 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 function一個參數的能力?

編輯:按要求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將用戶名存儲到腳本的屬性中,然后在您返回 Slack 后運行 function logUser()

更多信息:

您可以將信息直接存儲為腳本屬性,然后在logUser() function 中使用它來登錄用戶。這將需要對您當前的代碼進行一些修改,但基本運行如下:

  • 在 POST 上,將userId存儲為腳本屬性
  • 設置基於時間的觸發器以在未來未指定的時間內運行logUser()
  • 將您的內容返回給 Slack

然后觸發logUser()

  • 獲取當前腳本屬性
  • Go 分別通過每個並將它們記錄到工作表
  • 用戶登錄后刪除該屬性。

代碼:

首先在您的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:

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);
  });  
}

我希望這對你有幫助!

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM