时间超过2:00小时后,会向我的电子邮件发送通知

时间:2019-12-10 17:22:32

标签: google-apps-script

我从事运输工作,所以我必须跟踪每辆卡车在这里有多长时间。我已经设置了一个电子表格,其中包含卡车到达和离开的时间(此信息由我们的安全团队输入)。我有一个公式集可以告诉卡车在这里待了多长时间,并且有条件格式化以便在到达时间2之后显示红色我要设置小时数,因此只有在时间超过2小时时才收到电子邮件。 你能帮我吗?

我的书架很累,由于某种原因我无法使其正常工作

谢谢, 马特

2 个答案:

答案 0 :(得分:0)

这比起初我想的要棘手,因为持续时间格式只提供了一天的时间。因此,我尝试在获取数据之前和之后切换格式,以便获取实际的小数值。因此,所有时间列的持续时间格式都没有日期

function runOne() {
  var ss=SpreadsheetApp.openById("Spreadsheet ID");
  var sh=ss.getSheetByName("TimeSheet");
  var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
  var drg=sh.getRange(2,2,sh.getLastRow()-1,1);
  var mrg=sh.getRange(2,3,sh.getLastRow()-1,1);
  var mA=mrg.getValues();
  var dA=drg.getValues();
  var fA=rg.getNumberFormats();
  rg.setNumberFormat("0.####################");
  var vA=rg.getValues();
  rg.setNumberFormats(fA);
  var now=new Date();
  Logger.log(now);
  var daystart=new Date(now.getFullYear(),now.getMonth(),now.getDate()).valueOf();
  var time=(now.valueOf()-daystart)/86400000;//converted to fraction of a day
  Logger.log(time);
  for(var i=0;i<vA.length;i++) {
    if(!vA[i][5]) {
      var start=vA[i][0];
      dA[i][0]=time-start;
      mA[i][0]=time-start>2/24?"Email":"No Email";
    }
  }
  drg.setNumberFormat("0.####################");
  drg.setValues(dA);
  drg.setNumberFormat("hh:mm:ss");  
  mrg.setValues(mA);
  var msg=[];
  for(var i=0;i<vA.length;i++) {
    if(mA[i][0]=="Email" && !vA[i][5]) {
      msg.push(vA[i][3]);
    }
  }
  if(msg) {
    var recipient="your email";
    var subject="Trucks with durations greater than 2 hours";
    var body=Utilities.formatString('Trucks in the following locations: %s have been here for 2 hours or more.',msg.join(','));
    //GmailApp.sendEmail(recipient, subject, body);//email disabled
    var html=Utilities.formatString('recipient: %s<br />subject: %s<br />body: %s',recipient,subject,body);
    var userInterface=HtmlService.createHtmlOutput(html);
    SpreadsheetApp.getUi().showModelessDialog(userInterface, "Trucks longer than two hours");
  }
}

这是电子表格。 1,2和6列设置了持续时间格式

enter image description here

我禁用了Gmail行,并使用了该对话框进行测试。您可能要删除它。

答案 1 :(得分:0)

在下面的代码中,您可以运行函数createTrigger,该函数将创建一个onEdit触发器[1],以在编辑工作表时运行函数sendEmail。如果已编辑的单元格在D列中(您可以设置该列),并且通过条件格式设置为红色(按代码颜色[2]进行比较),它将使用GmailApp [3]类发送电子邮件。

function sendEmail(e) {
  var redCol = 4; //D column for durations
  var editedCell = e.range;
  var col = editedCell.getColumn();

  //Red color code, taken from a cell with red background in this case cell D2
  //You can replace this for the code string when you know it, default red is '#ff0000' 
  var cellColor =  SpreadsheetApp.openById("1ehUnxIraQI2ZWA_dLOt78Y4_c9k7zsQf1eiJiI9RMLk").getSheetByName("Sheet1").getRange(2, redCol).getBackground();

  if(col == redCol) {
    var editedCellColor = editedCell.getBackground();
    if(editedCellColor == cellColor){
      Logger.log(cellColor)
      //Will send email when a cell in D column turns red
      GmailApp.sendEmail("email@example.com", "Subject: It has passed 2 hours", "Message body:" + cellColor);
    }
  }
}

function createTrigger() {
  var ss = SpreadsheetApp.openById("[SPREADSHEET-ID]");
  ScriptApp.newTrigger('sendEmail')
  .forSpreadsheet(ss)
  .onEdit()
  .create();  
}

[1] https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

[2] https://developers.google.com/apps-script/reference/spreadsheet/range#getbackground

[3] https://developers.google.com/apps-script/reference/gmail/gmail-app#sendemailrecipient,-subject,-body