【问题标题】:How can I prevent Google Apps Scripts from returning HTML to slack after processing a custom slash command?如何防止 Google Apps 脚本在处​​理自定义斜杠命令后将 HTML 返回到 slack?
【发布时间】:2016-08-19 18:34:32
【问题描述】:

我在 Slack 中使用自定义斜杠命令通过 Google Apps Scripts 将数据添加到 Google Doc,但是,当脚本完成运行(成功)时,Google Script 将其发送到 Slack,用户将其解释为错误:

<DOCTYPE html><html><head><link rel="shortcut icon" href="//ssl.gstatic.com/docs/script/images/favicon.ico"><title>Error</title><style type="text/css">body {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}</style></head><body><div><img src="//ssl.gstatic.com/docs/script/images/logo.png"></div><center>The script completed but did not return anything.</center></body></html>

如何防止这条消息被发送到 Slack?

function doPost(request) {
  var sheets = SpreadsheetApp.openById('id-would-go-here');
  var params = request.parameters;

  var nR = getNextRow(sheets) + 1;

  if (params.token == "token-would-go-here") {

    // FALL BACK TO DEFAULT TEXT IF NO ORDER PROVIDED
    var order   = params.text || "No Order Entered";
    var employee = params.user_name || "Name Error";

    // RECORD TIMESTAMP AND USER NAME IN SPREADSHEET
    sheets.getRangeByName('date').getCell(nR,1).setValue(new Date());
    sheets.getRangeByName('employee').getCell(nR,1).setValue(employee);

    // RECORD UPDATE INFORMATION INTO SPREADSHEET
    sheets.getRangeByName('order').getCell(nR,1).setValue(order);

    var channel = "lunch-orders";

    postResponse(channel,order,employee);

    var eph_url = params.response_url; 
    var eph_response = UrlFetchApp.fetch(eph_url,200);

  } else {
    return;
  }
}

function postResponse(channel, order, employee) {

  var payload = {
    "channel": "#lunch-orders",
    "username": "Lunch Order",
    "link_names": 1,
    "attachments":[
       {
          "fallback": "A lunch order was placed, but the display here is a little messed up. Check the Google Doc to view the order.",
          "mrkdwn_in": ["pretext"],
          "color": "good",
          "fields":[
             {
                "title":"" + employee + "'s Lunch Order",
                "value": "" + order + "",
                "short":false
             }
          ]
       }
    ]
  };

  var url = 'incoming-webhook-url-goes-here';
  var options = {
    'method': 'post',
    'payload': JSON.stringify(payload)
  };

  var response = UrlFetchApp.fetch(url,options);
}

【问题讨论】:

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


    【解决方案1】:

    你的设置有点不对劲。您不会将数据 POST 回来,而是使用 ContentService 将其返回。现在一个小问题是您必须将 webapp 作为匿名身份验证运行。我所做的是将 slack 令牌保存在脚本属性服务中,并确保请求的 Slack 应用程序的令牌匹配。

    这是一个示例 webhook,它简单地将传递给 switch 命令的参数写入电子表格。

    function doPost(e) {
      var returnMessage;
      var slackToken = PropertiesService.getScriptProperties().getProperty("SlackToken") ;
      var postData = parseParams(e.postData.getDataAsString());
      if(postData.token === slackToken){
        SpreadsheetApp.openById('.....').getSheetByName("Log").appendRow([postData]);
        returnMessage = "Your record has been logged."
      }else{
         returnMessage = "Invalid Token"
      }
    
      return ContentService.createTextOutput(JSON.stringify({text:returnMessage})).setMimeType(ContentService.MimeType.JSON);
    }
    
    function parseParams(postData){
      var postObj = {}
       postData.split("&").map(function(param){var thisParam = param.split("="); postObj[thisParam[0]] = thisParam[1]});
       return postObj;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多