Как заставить Google Листы отправлять вам электронные письма, когда автоматически обновляемая ячейка меняет значение - PullRequest
1 голос
/ 10 января 2020

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

По сути, у меня есть Google Sheet, который отслеживает список дней рождения в одном столбце, а также к какой возрастной группе этот человек будет принадлежать - ребенок (до 13 лет), подросток (13–17 лет) или взрослый (18+) - в другом столбце. Столбец «Возрастная группа» рассчитывается по следующей формуле:

=IF(DATEDIF(H2, TODAY(), "Y") >= 18, "Adult", IF(DATEDIF(H2, Today(), "Y") >= 13, "Teen", "Child"))

со столбцом H, являющимся столбцом дня рождения.

Мой Лист Google настроен на пересчет Функция Today () работает каждый час, независимо от того, открыт файл или нет, поэтому в случае 13-го или 18-го дня рождения человека столбец «Возрастная группа» будет обновляться автоматически.

Моя цель - создать функцию, которая отправляет мне электронное письмо всякий раз, когда чья-либо возрастная группа меняется с «Ребенок на подросток» или «Подросток на взрослый», не требуя, чтобы пользователь открывал или изменял какие-либо листы Google для запуска.

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

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

Мой код в настоящее время выглядит следующим образом (обратите внимание, что этот код только отображает всплывающее уведомление, а не отправляет реальное электронное письмо - я еще не дошел до этого part):

/*
This is the function that is triggered by an edit to
the Google Sheet
*/
function onEdit(e) {
  sendEmailOnApproval(e);  
}

/*
Primarily used for earlier debugging
*/
function showMessageOnApproval(e)
{
  var edited_row = checkStatusIsApproved(e);
  if(edited_row > 0)
  {
    SpreadsheetApp.getUi().alert("Row # "+edited_row+" approved!");
  }
}

/*
Determines if the Age Group column reads Teen or Adult.
Column 9 (or 'I' in the sheet) is the Age Group column.
*/
function checkStatusIsApproved(e)
{
  var range = e.range;

  if(range.getColumn() <= 9 && 
     range.getLastColumn() >=9 )
  {
    var edited_row = range.getRow();

    var status = SpreadsheetApp.getActiveSheet().getRange(edited_row,9).getValue();
    if(status == 'Adult' || status == 'Teen')
    {
      return edited_row;
    }
  }
  return 0;
}

function sendEmailOnApproval(e)
{
  var approved_row = checkStatusIsApproved(e);

  if(approved_row <= 0)
  {
    return;
  }

  sendEmailByRow(approved_row);
}


/*
At the moment, this function only creates a little pop-up
box containing the text of the email I would like to send.
*/
function sendEmailByRow(row)
{
  var values = SpreadsheetApp.getActiveSheet().getRange(row,1,row,9).getValues();
  var row_values = values[0];

  var mail = composeApprovedEmail(row_values);

  SpreadsheetApp.getUi().alert(" subject is "+mail.subject+"\n message "+mail.message);
}


/*
Writes the email. Column 0 (or 'A') is the first name,
1 (or 'B') is the last name.
*/
function composeApprovedEmail(row_values)
{
  var first_name = row_values[0];

  var last_name = row_values[1];

  var age = row_values[8];

  var message = "The following person should be updated on the website: "+first_name+" "+last_name+
    " Age Range: "+age;
  var subject = "UPDATE WEBSITE for "+first_name+" "+last_name;

  return({message:message,subject:subject});
}

Хотя этот код работает при ручном изменении значений в столбце «Возрастной диапазон», как я могу адаптировать его, чтобы перехватывать автоматические c обновления, вызванные ежедневным пересчетом функции Today () на столбец опирается?

1 Ответ

0 голосов
/ 14 января 2020

Согласно документации Apps Script Trigger :

  • onOpen(e) запускается, когда пользователь открывает электронную таблицу, документ , презентация или форма, которую пользователь имеет право редактировать

  • onEdit(e) запускается, когда пользователь изменяет значение в электронной таблице

Следовательно, то, что вы пытаетесь сделать, не может быть сделано с помощью метода, который вы использовали ранее, так как вы пытались использовать триггер, который срабатывал каждый раз, когда изменение было сделано функцией ( Формула листов), а не пользователем.

Обходной путь

Вместо этого вы можете:

  1. Использовать формулу листов, которую вы использовали ранее, но изменить Пересчет настройки на При изменении вместо При изменении и каждый час , как вы делали ранее.

Таким образом, вы по-прежнему будут классифицироваться по возрастам на основании предоставленных дат.

Используйте следующий скрипт:

function ageChanges(){
  var ss = SpreadsheetApp.getActive().getActiveSheet();
  var dateVals = ss.getRange("YOUR_RANGE_FOR_THE_DATES").getValues();
  var ageVals = ss.getRange("YOUR_RANGE_FOR_THE_AGES").getValues();
  var dateNow = new Date();
  var recipient = "EMAIL_ADDRESS";
  var subject = "Age Change in Spreadsheet";
  var body = "";

  for (var i=0; i<dateVals.length; i++){

    var ages = (dateNow - dateVals[i][0])/(3.154e+10);

    if (ages > 18 && ageVals[i][0]!="Adult") {
      ss.getRange(i+1, 9).setValue("Adult");
      body = "Change in column H, row"+i+".";
      MailApp.sendEmail(recipient,subject,body);

    }
    else if (ages > 13 && ages < 18 && ageVals[i][0]!="Teen") {
      ss.getRange(i+1, 9).setValue("Teen");
      body = "Change in column H, row"+i+".";
      MailApp.sendEmail(recipient,subject,body);
    }

  }

}

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

Чтобы ежедневно отслеживать изменения, вам придется использовать вышеуказанный скрипт в качестве устанавливаемый триггер .

Создайте устанавливаемый триггер со следующими параметрами:

enter image description here

Таким образом, скрипт будет запускаться каждый день во время день, выбранный вами (в данном случае, от полуночи до 01:00 ), и если произойдут какие-либо возрастные изменения, вы получите электронное письмо с этими изменениями.

Кроме того, я предлагаю вам взгляните на эти ссылки, так как они могут помочь в вашем будущем развитии:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...