Google Apps Script - отправка электронной почты на основе даты в ячейке

Я огляделся по сторонам и нашел кусочки, но не могу собрать головоломку. Я пытаюсь создать сценарий, который будет работать на триггере, настроенном для ежедневного запуска. Триггер будет настроен в разделе «Ресурсы» в редакторе.

В основном, я ищу сценарий для захвата диапазона ячеек, определения даты выполнения, которая будет заполнена в столбце, сопоставления ее с текущей датой. Если это соответствует, тогда пошлите электронное письмо. Я начал с отправки электронного письма из учебника электронных таблиц в Google. Я добавил оператор if, чтобы проверить дату, но теряю ее при сравнении с dataRange. Любой может помочь исправить это или указать мне в направлении исследования.

Сценарий, кажется, запускается, но ничего не происходит, что я считаю, потому что & quot; if (currentTime == dataRange) & quot; DataRange не соответствует правильно ??

Вот код:

function sendEmails() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;  // First row of data to process
var numRows = 50;   // Number of rows to process
// Fetch the range of cells
var dataRange = sheet.getRange(startRow, 1, numRows, 2)
// Fetch values for each row in the Range.
var data = dataRange.getValues();   
//Get todays date     
var currentTime = new Date();
var month = currentTime.getMonth() + 1;
var day = currentTime.getDate();
var year = currentTime.getFullYear();      
//Test column  for date due & match to current date
    if ( currentTime == dataRange) {
  for (i in data) {
var row = data[i];
var emailAddress = row[0];  // First column
var message = row[1];       // Second column
var subject = "Task Item Due";
MailApp.sendEmail(emailAddress, subject, message);

}
}
}

Я обновляю предложение, предоставленное Сриком, и предоставляю его в приведенном ниже коде. Я пытался опубликовать это пару раз, так что я не уверен, почему он не прошел прошлую экспертную оценку?

 function sendEmail() {

var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;  // First row of data to process
var numRows = 50;   // Number of rows to process

var dataRange = sheet.getRange(startRow, 1, numRows, 50);

// Fetch values for each row in the Range.
var data = dataRange.getValues();
//Browser.msgBox(data)

for (i in data) {
var row = data[i];
var date = new Date();
var sheetDate = new Date(row[1]);

if (date.getDate() == sheetDate.getDate() && date.getMonth() == sheetDate.getMonth() && date.getFullYear() == sheetDate.getFullYear());
{
  var emailAddress = row[0];  // First column
  var message = row[2];       // Second column
  var subject = "Sending emails from a Spreadsheet";
  MailApp.sendEmail(emailAddress, subject, message);
 // Browser.msgBox(emailAddress)

}

}

}

Кажется, код выполняется, но я получаю следующую ошибку в редакторе сценариев. & quot; Не удалось отправить электронное письмо: нет получателя (строка 23) & quot ;. Но он по-прежнему отправляет электронные письма. Он должен сравнивать даты и отправлять электронную почту, только если дата совпадает. Это отправка электронной почты для каждой строки. Я предоставил доступ к электронной таблице, чтобы увидеть код и настройку электронной таблицы.Общая таблица

ОБНОВЛЕННЫЙ КОД W / SERGE HELP на регистраторе и Utilities.formatDate .. Спасибо !!

function sendEmail() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;  // First row of data to process
var numRows = sheet.getLastRow()-1;   // Number of rows to process
// Fetch the range of cells A2:B3
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());
// Fetch values for each row in the Range.
var data = dataRange.getValues();
//Logger.log(data)

for (i in data) {
  var row = data[i];
  var date = new Date();
  date.setHours(0);
  date.setMinutes(0);
  date.setSeconds(0);
  //Logger.log(date);
  var sheetDate = new Date(row[2]);
 //Logger.log(sheetDate);
 var Sdate = Utilities.formatDate(date,'GMT+0200','yyyy:MM:dd')
 var SsheetDate = Utilities.formatDate(sheetDate,'GMT+0200', 'yyyy:MM:dd')
     Logger.log(Sdate+' =? '+SsheetDate)
        if (Sdate == SsheetDate){
          var emailAddress = row[0];  // First column
          var message = row[1];       // Second column
          var subject = "Your assigned task is due today." +message;
          MailApp.sendEmail(emailAddress, subject, message);
          //Logger.log('SENT :'+emailAddress+'  '+subject+'  '+message)
            }    
   }
  }

Ответы на вопрос(3)

Решение Вопроса

я использовал Utilities.formatDate, чтобы составить строки ваших дат, чтобы вы могли выбрать то, что вы сравниваете (только дни, часы? мин?)

Я прокомментировал почтовый звонок только для моих тестов, включите его, когда вам нужно

function sendEmail() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = sheet.getLastRow()-1;   // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  Logger.log(data)

  for (i in data) {
    var row = data[i];
    var date = new Date();
    var sheetDate = new Date(row[1]);
    Sdate=Utilities.formatDate(date,'GMT+0200','yyyy:MM:dd')
    SsheetDate=Utilities.formatDate(sheetDate,'GMT+0200', 'yyyy:MM:dd')
    Logger.log(Sdate+' =? '+SsheetDate)
    if (Sdate == SsheetDate){
      var emailAddress = row[0];  // First column
      var message = row[2];       // Second column
      var subject = "Sending emails from a Spreadsheet";
//      MailApp.sendEmail(emailAddress, subject, message);
     Logger.log('SENT :'+emailAddress+'  '+subject+'  '+message)
    }    
  }
}

не забудьте посмотреть логи ;-)

 17 июн. 2012 г., 09:34
Вероятно, проблема, с которой вы столкнулись, связана с часовым поясом, я использовал GMT + 0200, который подходит мне, но, вероятно, не вам ;-) Проверьте также настройки в вашей таблице. (проверьте старый форум для информации о датах в ГАЗЕ)
 jjones31217 июн. 2012 г., 03:39
Хорошо ... Хорошо ... Похоже, что прогресс достигнут ... Спасибо за использование регистратора ... если вы заметили комментарии Browswer.msgBox, я попытался немного отладить сам. но регистрация намного лучше. Похоже, текущая дата показывает день раньше времени. 6/17/2012 ?? Как это выводит это в журналы 2012: 06: 17 =? 2012: 06: 15 Не совсем уверен, почему он будет тянуть дату на завтра, а не на фактический день .. начну копать и буду обновлять, как я раскрою :)
 jjones31217 июн. 2012 г., 04:33
Получил работу, не уверен, что это лучший или самый умный способ. Я использовал .setHours, .setMinutes и setSeconds для текущей даты, которая теперь совпадает с датами, извлеченными из электронной таблицы. Электронная почта течет как раз :) Спасибо, Серж, за помощь в этом. Если кто-то думает, что я добавлю методы .setHOurs и т.д., пожалуйста, дайте мне знать. Javascript является новым для меня, поэтому я пытаюсь впитать все, что могу .. Еще раз спасибо ..

    if ( currentTime == dataRange) {

currentTime - это объект Date, тогда как dataRange - это объект Range - они никогда не будут равны и поэтому ничего не происходит. Что вы можете сделать, это (DATE_COL - это столбец с вашей датой)

for ( var i in data ){
  var row = data[i] ; 
  var today = new Date(); 
  var date = new Date(row[DATE_COL]) ; 

  if (today.getDate() == date.getDate() && 
      today.getMonth() == date.getMonth() && 
      today.getYear() == date.getYear() {
    /* Your email code here */ 
  }
}
 jjones31214 июн. 2012 г., 20:58
Вот обновленный код, добавленный в отзыв от Срика. Все еще не в состоянии заставить его распознать и запустить электронное письмо. У меня есть таблица Google с тремя столбцами A, B, C. a = электронная почта, b = задание, c = данные, подлежащие оплате. скрипт должен захватывать диапазон, начинающийся с a2: c6 (заполнить 6 строк), посмотреть, соответствуют ли даты, введенные в столбце C, текущей дате, если это так, отправьте электронное письмо. Формат даты выключен, потому что он не совпадает?
 15 июн. 2012 г., 06:25
Где обновленный код?
 jjones31216 июн. 2012 г., 20:28
Срик, я продолжаю редактировать твой пост, чтобы добавить обновленный код, который я не уверен, почему он не прошел мимо рецензирования? Я здесь новичок, поэтому не уверен, что я что-то упустил. Я могу опубликовать это в другом ответе?
 jjones31214 июн. 2012 г., 20:49
Является ли "я" переменная, которая получает значение на основе массива в переменных данных?
 jjones31214 июн. 2012 г., 20:32
Спасибо за отзыв. В настоящее время я работаю над его проверкой, не все так далеко, но, думаю, я уже близко. У меня есть один вопрос, так как я новичок в JavaScript / GAS и полностью понимаю «for (var i in data)». Я вижу, что вы добавили его таким образом и выше из учебника по GAS, его отмеченного "для (я в данных)". Может ли кто-нибудь помочь мне понять это и что такое "я"? средства?

Настройте электронную таблицу следующим образом: https://docs.google.com/spreadsheet/ccc?key=0AkGlO9jJLGO8dDJad3VNTkhJcHR3UXlJSVRNTFJreWc

Измените код на:

function sendEmails() {
  var spreadsheet = SpreadsheetApp.openById('Type spreadsheet key here from spreadsheet URL');       
  /// e.g.  var spreadsheet = SpreadsheetApp.openById('0AkGlO9jJLGO8dDJad3VNTkhJcHR3UXlJSVRNTFJreWc');     

  var sheet = spreadsheet.getSheets()[0]; // gets the first sheet, i.e. sheet 0

  var range = sheet.getRange("B1"); 
  var dateString = new Date().toString();
  range.setValue(dateString);   // this makes all formulas recalculate

  var startRow = 4;  // First row of data to process
  var numRows = 50;   // Number of rows to process
  // Fetch the range of cells
  var dataRange = sheet.getRange(startRow, 1, numRows, 4)
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();   

  for (i in data) {
    var row = data[i];
    if( row[3] == true) {
      var emailAddress = row[0];  // First column
      var message = row[1];       // Second column
      var subject = "Task Item Due";
      try {
          MailApp.sendEmail(emailAddress, subject, message);
      } catch(errorDetails) {
        // MailApp.sendEmail("[email protected]", "sendEmail script error", errorDetails.message);
      }

    }
  }
}

Триггер:

Из-за триггера вам нужно будет открыть электронную таблицу, используя openById.  Для этого в коде замените «Введите ключ электронной таблицы здесь с URL-адреса электронной таблицы».  Чтобы найти ключ, откройте электронную таблицу Документов Google, ссылка имеет & quot; key = A0a0df ... & quot; вставьте код. Смотрите пример.

JavaScript:  если вы хотите узнать больше об использовании Java Script, я рекомендуюhttp://www.w3schools.com/js/default.asp

 jjones31216 июн. 2012 г., 20:34
Спасибо за предложение w3schools. Я действительно просмотрел этот сайт для ссылок и т. Д. Я действительно зарегистрировался на lynda.com, чтобы помочь, а также использовать несколько книг. Я только углубляюсь в JavaScript и многое другое, поэтому Google Apps Script, так как моя компания является компанией Google Apps. Я склонился к варианту Srik, указанному ниже, так как считаю, что он больше соответствует моим потребностям. По сути, у меня есть электронная таблица планирования проекта, в которой есть столбцы информации. срок выполнения, соответствует текущей дате и отправьте уведомление по электронной почте, если соответствует.

Ваш ответ на вопрос