Как выйти из цикла ForEach после выполнения условия

Я создал небольшой скрипт, который будет генерировать электронное письмо, если у сотрудника есть проблемы с посещаемостью. Я использую два шаблона: один, если у сотрудника есть «поздние» нарушения, и один, если есть другие нарушения, не включая «опоздания» (например, неявка без звонка, вызов без уважительной причины и т. д.). Однако в моем цикле forEach я не могу понять, как выйти из цикла, поэтому я не получаю несколько электронных писем. Как я могу выйти из цикла после отправки одного (1) электронного письма?

function sendEiEmail(){
  var ss = SpreadsheetApp.getActive().getSheetByName('Attendance Narrative Generator');
  var arr = ss.getRange(7, 1, 10, 1).getValues(); //Get all values from sheet
  // Logger.log(arr);
var htmlBodyNoLate = HtmlService.createTemplateFromFile("AttendanceNoLate").evaluate().getContent();
var htmlBodyLate = HtmlService.createTemplateFromFile("AttendanceLate").evaluate().getContent();

  arr.forEach(function(res) {
    if(res == 'Late'){

  MailApp.sendEmail({
    to: Session.getActiveUser().getEmail(),
    subject: `Attendance Infractions Narrative - ${firstName} ${lastName} #${employeeEID}`,
    htmlBody: htmlBodyLate,
  });
 return;

  }else{

 MailApp.sendEmail({
    to: Session.getActiveUser().getEmail(),
    subject: `Attendance Infractions Narrative - ${firstName} ${lastName} #${employeeEID}`,
    htmlBody: htmlBodyNoLate,
  });

}

  });
}

Вы можете заменить arr.forEach(res => {...}) на for (var res of arr) {...} и разорвать цикл for на любой итерации, которую вы хотите.

Yuri Khristich 17.05.2022 19:27

Вы не можете выйти из цикла forEach

Cooper 17.05.2022 19:38
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Невозможно сломать цикл forEach. (если вы не хотите использовать исключения, но это не рекомендуется) Есть два варианта решения проблемы:

  1. Измените тип цикла на for, а не на forEach, а затем используйте оператор break.
  2. Используйте флаг, чтобы узнать, что электронное письмо было отправлено:

function sendEiEmail() {
    var ss = SpreadsheetApp.getActive().getSheetByName('Attendance Narrative Generator');
    var arr = ss.getRange(7, 1, 10, 1).getValues(); //Get all values from sheet
    var htmlBodyNoLate = HtmlService.createTemplateFromFile("AttendanceNoLate").evaluate().getContent();
    var htmlBodyLate = HtmlService.createTemplateFromFile("AttendanceLate").evaluate().getContent();

    var isEmailSent = false;
    arr.forEach(function (res) {
        if (isEmailSent == false) {
            if (res == 'Late') {
                MailApp.sendEmail({
                    to: Session.getActiveUser().getEmail(),
                    subject: `Attendance Infractions Narrative - ${firstName} ${lastName} #${employeeEID}`,
                    htmlBody: htmlBodyLate,
                });
                isEmailSent = true;
            } else {
                MailApp.sendEmail({
                    to: Session.getActiveUser().getEmail(),
                    subject: `Attendance Infractions Narrative - ${firstName} ${lastName} #${employeeEID}`,
                    htmlBody: htmlBodyNoLate,
                });
                isEmailSent = true;
            }
        }

    });
} 

Спасибо!! Хорошо, приятно знать, ради моего понимания мне нужно выяснить, как изменить тип цикла на цикл For, но на данный момент этот обходной путь работает. Действительно ценю это

Chris P Bacon 17.05.2022 20:09

Другие вопросы по теме