Неудачные меры избыточности в скрипте Google для отправки электронных писем через листы Google - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь отправить напоминание для еженедельного вебинара с электронными письмами, которые живут в Google Sheet, используя редактор сценариев Google / codelab.Ссылка на учебник, на котором он основан, находится здесь: https://developers.google.com/apps-script/articles/sending_emails

Во втором разделе кода, который они публикуют, это улучшенная версия, потому что после отправки электронного письма он заполняет столбец "EMAIL_SENT" идолжен предотвратить отправку дубликата электронной почты, потому что "EMAIL_SENT" занимает это место (насколько я понимаю).

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

Failed to send email: no recipient (line 24, file "macros"). 

Макросы - это имя файла.Другая проблема, с которой я сталкиваюсь, заключается в том, что, если я снова запустю скрипт после заполнения EMAIL_SENT, он все равно отправит дополнительное электронное письмо, даже если это не предполагается.

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

`// This constant is written in column C for rows for which an email
// has been sent successfully.
var EMAIL_SENT = 'EMAIL_SENT';

/**
 * Sends non-duplicate emails with data from the current spreadsheet.
 */
function sendEmails_w_verification() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 116; // First row of data to process
  var numColumns = 8;
  var startColumn = 1;
 // Fetch the range of cells as object
  var dataRange = sheet.getRange(startRow, startColumn, 
sheet.getLastRow(), numColumns);
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[1]; // Second column
    var message = "Thank you for registering for the webinar"; // Second 
column
    var emailSent = row[8]; // ninth column
    if (emailSent != EMAIL_SENT) { // Prevents sending duplicates
      var subject = 'AFWERX Webinar Reminder';
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(startRow + i, 9).setValue(EMAIL_SENT);
     // Make sure the cell is updated right away in case the script is 
interrupted
      SpreadsheetApp.flush();
    }
  }
}

Ожидаемые дубликаты не отправляются и сообщение об ошибке «Не удалось отправить электронное письмо: нет получателя (строка 24, файл« макросы »)» при отправке электронного письма.

1 Ответ

0 голосов
/ 24 мая 2019

Ваша первая ошибка без получателя, по-видимому, вызвана тем, как вы запускаете цикл for. Если вы переключите его на i++, скрипт будет работать нормально.Это связано с тем, что при использовании ++i вы выбираете дополнительную строку, в которой нет адреса электронной почты, в результате чего выдается сообщение об ошибке «нет получателя».

Второйпроблема в том, что скрипт не может проверить столбец 9 из-за того, что определенный вами диапазон составляет всего 8 столбцов, а не 9. Я обнаружил это с помощью простого Logger.log(emailSent), который вернулся как undefined, и это то, что вы 'я ожидал увидеть, что значение вообще не определено в диапазоне.

// This constant is written in column C for rows for which an email
// has been sent successfully.
var EMAIL_SENT = 'EMAIL_SENT';

/**
* Sends non-duplicate emails with data from the current spreadsheet.
*/
function sendEmails_w_verification() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 1; // First row of data to process
  var numColumns = 9;
  var startColumn = 1;
  // Fetch the range of cells as object
  var dataRange = sheet.getRange(startRow, startColumn, sheet.getLastRow(), numColumns);
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; i++) {
    var row = data[i];
    var emailAddress = row[1]; // Second column
    var message = "Thank you for registering for the webinar"; // Second     column
    var emailSent = row[8]; // ninth column
    if (emailSent != EMAIL_SENT) { // Prevents sending duplicates
      var subject = 'AFWERX Webinar Reminder';
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(startRow + i, 9).setValue(EMAIL_SENT);
      // Make sure the cell is updated right away in case the script is interrupted
      SpreadsheetApp.flush();
    }
  }
}

Я изменил оператор for, чтобы использовать i++ вместо ++i, который исправляет "нет"сообщение об ошибке получателя ".

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

Затем измените ваш var numColumns на 9 вместо 8, чтобы он мог видеть столбец, который вы пытаетесь проверить с помощью оператора if.

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