为表格配置 Google Apps 脚本以在没有更新时停止 Slack post

Configure Google Apps Script for Sheets to stop Slack post when no updates

我已经设置了 google sheets 来监视一个文件夹的更新。在过去 24 小时内上传文件时,它会更新我的 google sheet(完美)。然后它向指定的松弛通道发送消息(完美)。我希望此脚本每分钟 运行 并且仅在 1 分钟的时间范围内上传新文件时才向 slack 发送更新。我如何更新代码?!?

问题

1) 如果没有文件更新,它会向 slack 发送一条消息,仍然说文件未定义 URL problem message in slack

2) 如果上传了多个文件,并且 google sheet 更新,slack 只会收到其中一个文件的消息。 only one link sent to slack image

想法

1) 我可以为 slack 添加一个功能,并创建一个每小时触发器来检查驱动器文件的更新,然后触发 slack 功能关闭 2) 不管是否有人解决了它,我都需要弄清楚代码,以便在没有更新时不会出现松弛消息。

/***************************************************
Script will send an slack notification to Slack Channel
when a file is uploaded to monitored Drive Upload folder. SDH 5.29.17
***************************************************/
function checkForChangedFiles() {

// edit this line below with the ID "XXXXXXXxxXXXwwerr0RSQ2ZlZms" of the folder you want to monitor for changes
var folderID = '"' + "XXXXX" + '"';  
var folderSearch = folderID + " " + "in parents";
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getActiveSheet();

// Get the spreadsheet slack channel
var channel = sheet.getRange("F1").getValue();

// Get the spreadsheet time zone
var timezone = ss.getSpreadsheetTimeZone();
var today     = new Date();

// Find files modified in the last 24 hours, Run script next day, and set below to 24 hours
// 60 * 1000 = 60 second
// 60* (60 * 1000) = 60 mins which is 1 hour
// 24* (60* (60 * 1000)) = 1 day which 24 hours
var oneDayAgo = new Date(today.getTime() - 1 * 60 * 1000);  
// var oneDayAgo = new Date(today.getTime() - 1 * 60 * 1000);  

var startTime = oneDayAgo.toISOString();

var search = '(trashed = true or trashed = false) and '+ folderSearch +' and (modifiedDate > "' + startTime + '")';   

var files  = DriveApp.searchFiles(search);

var row = "", count=0;

while( files.hasNext() ) {

var file = files.next();
var fileName = file.getName();
var fileURL  = file.getUrl();
var lastUpdated =  Utilities.formatDate(file.getLastUpdated(), timezone, "yyyy-MM-dd HH:mm");
var dateCreated =  Utilities.formatDate(file.getDateCreated(), timezone, "yyyy-MM-dd HH:mm")

row += "<li>" + lastUpdated + " <a href='" + fileURL + "'>" + fileName + "</a></li>";

sheet.appendRow([dateCreated, lastUpdated, fileName, fileURL]);

count++;


} 

// add function for SLACK? then I can have slack run for each update and the first function run daily :) 


var url = "https://hooks.slack.com/services/XXXX";

var payload = {
 "channel" : channel,
 "username" : "DriveUpload", // <-- optional parameter, use if you want to override default "robot" name 
 "text" : "Upload! *''"+fileName+"''* "+ fileURL, // <-- REQUIRED parameter
 "icon_emoji": ":robot_face:", // <-- optional parameter, use if you want to override default icon, 
 //"icon_url" : "http://image" // <-- optional parameter, use if you want to override default icon
}

sendToSlack_(url,payload)
}

function sendToSlack_(url,payload) {
var options =  {
"method" : "post",
"contentType" : "application/json",
"payload" : JSON.stringify(payload)
};
 return UrlFetchApp.fetch(url, options)
}

根据你的问题,这个样本假设如下。

  1. 在过去 24 小时内上传文件时,它会更新我的 google sheet(完美)。
  2. 然后它向指定的松弛通道发送消息(完美)。

对于问题 1

  • 原因:
    • 在您的脚本中,当它运行时,它每次都会 posts 到 Slack。所以即使没有更新的文件,"undefined" 也是 posted.
  • 解决方案:
    • 使用if (updatedfiles.length > 0) {,它post只有在有更新文件时才会出现。
    • 在这种情况下,当没有更新时,数据不会posted。

对于问题 2

  • 原因:
      while 循环中创建的
    • fileNamefileURL 是可变的。因此只有 searchFiles() 检索到的 files 中的最后一个文件用于 posting。
  • 解决方案:

修改脚本

修改后的脚本如下。在我的环境中,这个脚本有效负载工作正常。但如果这在您的环境中不起作用,则可能需要调试。

var updatedfiles = []; // <--- ##Added
while( files.hasNext() ) {
  var file = files.next();
  var fileName = file.getName();
  var fileURL  = file.getUrl();
  var lastUpdated =  Utilities.formatDate(file.getLastUpdated(), timezone, "yyyy-MM-dd HH:mm");
  var dateCreated =  Utilities.formatDate(file.getDateCreated(), timezone, "yyyy-MM-dd HH:mm")
  row += "<li>" + lastUpdated + " <a href='" + fileURL + "'>" + fileName + "</a></li>";
  sheet.appendRow([dateCreated, lastUpdated, fileName, fileURL]);
  count++;
  updatedfiles.push({"text": "Upload! *''"+fileName+"''* "+ fileURL}); // <--- ##Added
}
if (updatedfiles.length > 0) { // <--- ##Added
  var url = "https://hooks.slack.com/services/XXXX";
  var payload = {
    "channel" : channel,
    "username" : "DriveUpload",
    "attachments": updatedfiles, // <--- ##Added
    "icon_emoji": ":robot_face:",
  }
  sendToSlack_(url, payload);
}

修改了checkForChangedFiles()var row = "", count=0; 上面的脚本尚未修改。所以上面的脚本只显示了修改的部分。它显示修改的部分为<--- ##Added

如果我误解了你的问题,我很抱歉。