Comparing Dates in Google Sheets Script Editor

有些话、适合烂在心里 提交于 2021-02-05 10:01:31

问题


I am very new to this, so please bear with me. I am trying to get my code to look at each cell in a column, then compare that date to the current date, and if they match send an email. I am aware I will need a loop of some sort to get it to look through the column, but I haven't even gotten that far. I've tried every method I can find online to just get it to compare one cell to the date and send the email. I tested the email function prior to adjusting it to compare the date, so I know that is working. Put something definitely isn't working...

function sendEmail() {
  //Fetch the date
  var removalDateRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Expirations").getRange("E2");
  var removalDate = removalDateRange.getValue();
 
  var currentDateRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Alerts").getRange("C2");
  var currentDate = new Date();
  
  var ui = SpreadsheetApp.getUi();
  
      //Check Date
      if (removalDate == currentDate) {
        
          //Fetch the email address
          var emailRange =
           SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Alerts").getRange("B2");
           var emailAddress = emailRange.getValue();
        
         //Fetch Item Brand
         var itemBrandRange =
          SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Expirations").getRange("B2");
          var itemBrand = itemBrandRange.getValue();
        
         //Fetch Item Name
         var itemNameRange =
          SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Expirations").getRange("A2");
          var itemName = itemNameRange.getValue();
        
         //Fetch Item Location
         var itemLocationRange =
          SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Expirations").getRange("H2");
          var itemLocation = itemLocationRange.getValue();
        
         // Send Alert Email
         var message = 'The ' + itemBrand + ' ' + itemName + ' in ' + itemLocation + ' will expire in 2 months. Please use and replace item.';
         
         // Second Column
         var subject = 'Pantry Alert';
            MailApp.sendEmail(emailAddress, subject, message);
    }
  }

EDIT

Okay, I had it working late last night and even got it to loop through, and somehow I've broken it again. I've been looking at answers for hours trying to adjust things to make it work. What am I doing wrong?

function emailAlert() {
  
  // today's date information
  var today = new Date();
  var todayMonth = today.getMonth() + 1;
  var todayDay = today.getDate();
  var todayYear = today.getFullYear();

  // 2 months from now
  var oneMonthFromToday = new Date(todayYear, todayMonth, todayDay);
  var oneMonthMonth = oneMonthFromToday.getMonth() + 2;
  var oneMonthDay = oneMonthFromToday.getDate();
  var oneMonthYear = oneMonthFromToday.getYear();

  // getting data from spreadsheet
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Exp");
  var startRow = 2; // First row of data to process
  var numRows = 500; // Number of rows to process

  var dataRange = sheet.getRange(startRow, 1, numRows, 999);
  var data = dataRange.getValues();

  //looping through all of the rows
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];    
    
    
    var expireDateFormat = Utilities.formatDate(new Date(row[5]),
      'ET',
      'MM/dd/yyyy'
    );

    //email Information
    var subject = 'Pantry Item Needs Attention!';
    var message1 =
      row[6] + ' ' + row[3] + ' of ' + row[2] + ' ' + row[1] + ' will expire on ' + expireDateFormat + '. Item can be found in ' + row[7]
       + '. Please Remove and Replace Item.' + 
      '\n' + 'Thanks Steve!';
      
    var message2 =
      row[6] + ' ' + row[3] + ' of ' + row[2] + ' ' + row[1] + ' will expire on ' + expireDateFormat + '. Item can be found in ' + row[7] + 
      '. Please ensure item has been replaced, removed from the pantry, and deleted from inventory.' +
      '\n' + 'Thanks Steve!'

    //expiration date information
    var expireDateMonth = new Date(row[5]).getMonth() + 1;
    var expireDateDay = new Date(row[5]).getDate();
    var expireDateYear = new Date(row[5]).getYear();

    //checking for today
    if (
      expireDateMonth === todayMonth &&
      expireDateDay === todayDay &&
      expireDateYear === todayYear
    ) {
     
       ui.alert(message1);
    }
   }
  }

回答1:


Dates can be frustrating to work with, so consider doing the whole thing (loop, if then statement...) with an integer first and then returning to the date part if you're having trouble. That said, try adjusting the top of your code to look like the following:

var ss =SpreadsheetApp.getActiveSpreadsheet();
var removalDateVal = ss.getSheetByName("Expirations").getRange("E2").getValue();
var removalDate = new Date(removalDateVal);

var currentDateVal = ss.getSheetByName("Alerts").getRange("C2").getValue();
var currentDate = new Date(currentDateVal);

That will give you two date objects. But BEWARE! These dates contain time as well as calendar date so they may not equal each other even when they appear to. Use setHours() to zero out the date as seen below.

currentDate.setHours(0,0,0);
removalDate.setHours(0,0,0);

Other notes, it's best practice to set a variable for a spreadsheet and worksheet as shown by Google here. It makes the code much more readable.



来源:https://stackoverflow.com/questions/61764014/comparing-dates-in-google-sheets-script-editor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!