Сценарий sendEmail будет отправлять почту только иногда - PullRequest
0 голосов
/ 28 августа 2018

Иногда я могу настроить его на автоматическую отправку при изменении времени, иногда сценарий запускается, но электронное письмо не отправляется. Если ячейка в строке O говорит «ИСТИНА» (из формулы), и она не работает, я могу вручную ввести «ИСТИНА», и она внезапно будет работать на всех ячейках со значением «ИСТИНА», даже если другие ячейки иметь «ИСТИНА», заполненную формулой. Это кажется настолько случайным, что я не знаю, что работает, а что нет. Это было прекрасно несколько дней подряд, а потом внезапно останавливается. Я понятия не имею.

Я использую триггеры, основанные на времени. Поскольку я хочу, чтобы он был отправлен в определенное время, я использую 30-минутный таймер (который достаточно близок). Ячейка, на которую я ссылаюсь, становится истинной только в том случае, если ячейка в строке x не = «EMAIL_SENT», что, как мне кажется, является странным способом приблизиться к ней. Это работает, хотя, потому что если он отправляет электронное письмо, он превращается в «ЛОЖЬ». Эта формула работает отлично. Моя проблема в том, чтобы заставить его всегда отправлять, когда значение = TRUE

Мой скрипт:

function sendEmails(e) {
  var spreadsheet = SpreadsheetApp.openById("some id")
  var sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);
  var startRow = 1;

  var range = sheet.getDataRange();
  var values = range.getDisplayValues();

  var lastrow = sheet.getLastRow();
  var lastcolumn = sheet.getLastColumn();

  var dataRange = sheet.getRange(startRow, 1, lastrow, lastcolumn);
  var data = dataRange.getValues();

  var EMAIL_SENT = 'EMAIL_SENT';
  var T = 'TRUE'

  var i = 1;
  for (i = 1; i < data.length; i++) {
    var row = data[i];
    var emailAddress = row[1];
    var msgHtml = '<HTML><BODY>' + 'Hello again,<p>This is a reminder that you are scheduled to participate in our paid driving study! The upcoming driving session that you are scheduled for is<b> ' + values[i][3] + ' </b>at<b> ' + values[i][4] + ' </b>at ' + 'ADDRESS' + '. The session will last approximately 4.5 hours, but be prepared for an additional 60 minutes of time required. Please plan to stay for the entire session.' + '<b>You are required to bring proof of insurance and your valid drivers license with you to your session.</b></p>' + '<font color="blue"><mark>Please respond to this email as soon as possible to confirm your attendance at this session.</mark></font>' + ' If you must cancel or reschedule your session, we require at least 24 hours advanced notice. Failure to give 24 hours advanced notice will result in a suspension from further participation. Your participation is very valuable to this study, and each driving session is crucial to our research. </p><p> Please be aware that cancellations may be made by our team for extraneous circumstances(e.g., inclement weather, construction,etc). If any of these circumstances do occur, we will let you know as soon as possible. We will do our best to rescheule you, but we cannot make any guarantees. If you have any questions, please let me know.</p>' + '<font color="red"><b>Please refer to the specific instructions provided in the scheduling email (i.e., "scheduled for L2 Driving Sessions") AND review these reminders:</b></font>' + '<p>1. Get plenty of rest and receive a healthy amount of sleep the night before your driving session<br>2. Do not drink alcohol or use any substance that may impair your driving the night before and morning of your driving session <br>3. Wash your hair within 12 hours before your session (i.e., if your session is at 1pm, you should wash your hair after 1am the previous night and before your 1pm session) <br>4. Do not put on makeup or any heavy skin products <br>5. Wear a loose-fitting shirt <br>6. Leave early so that you have enough time to find parking, go to the bathroom, etc. before your session starts</br></p>' + 'See you on<b> ' + values[i][3] + '</b>!' + '</BODY></HTML>';
    var subject = 'Driving Study ' + values[i][3] + ' at ' + values[i][4];

    if (values[i][14] == T) { 
      MailApp.sendEmail({ to: emailAddress, subject: subject, htmlBody: msgHtml});
      sheet.getRange(startRow + i, 8).setValue(EMAIL_SENT);
      SpreadsheetApp.flush();
    }  
  }
}

Пример листа

Вот расшифровка стенограммы. Он «завершается», но не попадает в оператор if, который фактически отправляет электронное письмо.

[18-08-28 10:59:45:401 PDT] Starting execution
[18-08-28 10:59:45:510 PDT] SpreadsheetApp.openById([10RCcnc22RYRaf3wQhMzPp_q3f1_-LBsm2tQjYrd0h1s]) [0.099 seconds]
[18-08-28 10:59:45:511 PDT] Spreadsheet.getSheets() [0 seconds]
[18-08-28 10:59:45:512 PDT] SpreadsheetApp.setActiveSheet([Sheet]) [0 seconds]
[18-08-28 10:59:45:883 PDT] Sheet.getDataRange() [0.37 seconds]
[18-08-28 10:59:46:096 PDT] Range.getDisplayValues() [0.212 seconds]
[18-08-28 10:59:46:188 PDT] Sheet.getLastRow() [0.088 seconds]
[18-08-28 10:59:46:373 PDT] Sheet.getLastColumn() [0.184 seconds]
[18-08-28 10:59:46:374 PDT] Sheet.getRange([1, 1, 447, 15]) [0 seconds]
[18-08-28 10:59:46:692 PDT] Range.getValues() [0.317 seconds]
[18-08-28 10:59:46:708 PDT] Execution succeeded [1.294 seconds total runtime]

1 Ответ

0 голосов
/ 28 августа 2018

Вы не упоминаете, как вы запускаете этот скрипт, но похоже, что вы установили для него триггер редактирования. Попробуйте удалить триггер редактирования, а затем повторно добавить его. Обратите внимание, что такой триггер выполняется только тогда, когда человек изменяет файл Sheets, а не при изменении формул. Это по замыслу и не изменится.

Подробнее о скрипте и триггерах Google Apps см. В документации . Вы можете счесть основанный на времени триггер более полезным, если вам нужно отправлять электронные письма без участия пользователя. Обратите внимание, что ваш сценарий в настоящее время не использует флаг, установленный в каждой строке после отправки электронного письма - вы, вероятно, захотите проверить это при просмотре строки, например,

if (values[i][7] == EMAIL_SENT)
  continue;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...