Я пытаюсь опубликовать сообщение Slack для каждой новой строки таблицы с помощью Google Scripts, но получаю только одно сообщение. Что я делаю неправильно? - PullRequest
1 голос
/ 25 октября 2019

Я пытаюсь создать простое приложение для публикации сообщения в Slack для каждой новой строки в электронной таблице Google. Я могу получить информацию с листа и опубликовать ее в логгере, и могу опубликовать в Slack, но я могу только заставить ее работать с первой строкой в ​​цикле (тогда как регистратор получит все значения для всех строк). Я, наверное, просто испорчу работу петель (новичок в этом), но, глядя на нее несколько часов, я не вижу этого. Мое намерение состоит в том, чтобы установить это для запуска при редактировании (оно заполняется из формы Google), поэтому я добавил столбец, чтобы пометить, когда сообщение Slack было отправлено, просто чтобы избежать безумного цикла бесконечных сообщений по любой причине.

Я попытался зарегистрировать вывод и могу получить все значения там. Помещение поста в Slack часть кода в одном и том же месте приводит только к одному посту.

//Set up a variable to show when we've sent a message to Slack
var slackSentText = "Yes";
//This is hte Slack hook
var url = "https://hooks.slack.com/services/tokens!";

function getNewInfo() {
var sheetname = "Info"
var myspreadsheet = SpreadsheetApp.openById('secretID!'); 
  var sheet = myspreadsheet.getSheetByName(sheetname);

// set rows until work out how to do more elegantly...
  var startRow = 8; // First row of data to process
  var numRows = 5; // Number of rows to process
  var dataRange = sheet.getRange(startRow, 1, numRows, 11);
  var data = dataRange.getValues();

  // iterate and make variables for Slack
  for (var i = 0; i < data.length; ++i) {
  var row = data[i];
  var idNumber = row[0]; 
  var projectType=row[6];
  var supplierName=row[2];
  var projectName=row[3];
  var projectDescription=row[4];
  var projectStatus=row[1];
  var projectDate=row[5];
  var slackSent = row[10];

  // check if column is marked with Slack sent note and if so ignore. If not send Slack  
  if (slackSent !== slackSentText) { 

  // Slack bit
  var slackMessage = {
    "channel": "ID-number-bot",
    "username": "ID-bot",
    "text": "\n :white_check_mark:" +
    "\n *New Project:* " + idNumber +
    "\n *Project Name:* "  + projectName +
    "\n *Supplier:* "  + supplierName +
    "\n *Project Status:* "  + "["+projectStatus+"]" +
    "\n *Project Description:* "  + "_"+projectDescription+"_" +
    "\n *Project Type:* "  + projectType +
    "\n *Estimated Delivery Date:* "  + projectDate +
    "\n"+ slackSent +
    "\n Job folder string: \n" + "RCM "+jobNumber+" "+projectName +
    "\n \n"
  };

  var options = {
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify(slackMessage)
  };

  return UrlFetchApp.fetch(url,options);

  sheet.getRange(startRow + i, 11).setValue(slackSentText);

Logger.log("jobNumber:"+jobNumber)
Logger.log("projectType:"+projectType)
Logger.log("supplierName:"+supplierName)
Logger.log("projectName:"+projectName)
Logger.log("projectDescription:"+projectDescription)
Logger.log("projectStatus:"+projectStatus)
Logger.log("projectDate:"+projectDate)
      }
    }

//   SpreadsheetApp.flush();


  }

Большое спасибо всем. Надеюсь, я дал достаточно информации.

1 Ответ

1 голос
/ 25 октября 2019

Как предложил @Tanaike, ваша проблема должна быть исправлена ​​путем изменения:

return UrlFetchApp.fetch(url,options);

На это:

UrlFetchApp.fetch(url,options)

Ключевое слово return выводит вас из цикла. Код находит return в первой итерации, поэтому он не распространяется на следующие строки, и поэтому вы получаете только первую отправленную строку.

...