Google Sheets Script Apps — список избранных учащихся по электронной почте, проблема с форматированием

Я создал таблицу для наших тренеров. Они выбирают вид спорта, а затем электронная таблица заполняет список возможных учеников. Они устанавливают флажок рядом с именем учащегося (учащихся), присутствовавших на мероприятии, вводят дату и нажимают кнопку «Отправить». Он отправляет электронное письмо перечисленным учителям (на 2-й вкладке есть все списки и электронные письма). Сценарий, который я написал, делает все это без проблем. Проблема, с которой я столкнулся, связана с форматированием. Имена печатаются горизонтально с запятой, разделяющей каждое имя:

Студент Один, Студент Два (и т.д.)

[Это было в исходном посте, но я понял, как пропустить пустые места в массиве. Если студент в списке пропущен, распечатка выглядит следующим образом:

Ученик 1, Ученик 3, Ученик 4, Ученик 6 (и т. д.) ]

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

Студент Один

студент два

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

Вот таблица: Пример спортивной электронной почты

Вот код, который я набрал:

function emailRoster() 
{
  var teacher = SpreadsheetApp.getActive().getRange("Rosters!J2:J4").getValues();
  var roster = SpreadsheetApp.getActive().getRange("Sheet1!A6:B").getValues();
  var sport = SpreadsheetApp.getActive().getRangeByName("Sport").getValue();
  var date = SpreadsheetApp.getActive().getRangeByName("Date").getValue();
  var lenT = teacher.length;
  var lenR = roster.length;
  var playerTrue = [];
  
  for(var i=0; i<lenR; i++){
      if (roster[i][1])
      playerTrue[i] = roster[i][0];
      
    }
    playerTrue = playerTrue.filter(String); //recently added...fixed the printout so it ignores blank parts of the array
    playerTrue.forEach(function(name) {
          Logger.log(name);
         
      });
   
  for(var p=0; p<lenT-1; p++){
     

    var email = teacher[p];
    var subject = "Students out for " + sport;
    var body = "Teachers,\nThe following students will be out for " +sport+ " on " +date +": \n\n" + playerTrue +"\n";
   
    
    GmailApp.sendEmail(email,subject,body);
  }
};

РЕДАКТИРОВАТЬ

Я создал еще одну функцию, чтобы попытаться заставить ее возвращать каждое имя с возвратом после каждого имени, но я могу заставить ее делать только первое имя:

function createRoster(){
  var roster = SpreadsheetApp.getActive().getRange("Sheet1!A6:B").getValues();
  var playerTrue = [];
  var lenR=roster.length;
  
  for(var i=0; i<lenR; i++){
      if (roster[i][1])
      playerTrue[i] = roster[i][0];    }
    playerTrue = playerTrue.filter(String);
  Logger.log(playerTrue);
  for(var b=0; b<lenR-1; b++){
    return playerTrue[b] + "\n";
   
  }
   Logger.log(playerTrue);
 };

Итак, теперь переменная body в исходной функции выглядит так:

var body = "Teachers,\nThe following students will be out for " +sport+ " on " +date +": \n\n" + createRoster() +"\n";
Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python - это удобный способ автоматизировать процесс отправки электронных писем. Это может быть полезно для...
0
0
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Из вашего сценария показа кажется, что playerTrue - это массив. Такая ситуация возникает, когда массив используется непосредственно как тело текста. Если вы хотите выровнять значение по вертикали, как насчет следующей модификации с использованием join?

От:

var body = "Teachers,\nThe following students will be out for " +sport+ " on " +date +": \n\n" + playerTrue +"\n";

К:

var body = "Teachers,\nThe following students will be out for " + sport + " on " + date + ": \n\n" + playerTrue.join("\n") + "\n";

Или, если вы хотите указать значение каждые 2 строки, как насчет следующей модификации?

var body = "Teachers,\nThe following students will be out for " + sport + " on " + date + ": \n\n" + playerTrue.join("\n\n") + "\n";

Справка:

Это именно то, что я искал, но не мог найти! Огромное спасибо!! Я знаю достаточно java, чтобы столкнуться с проблемами с javascript, и просто не знал правильных слов для Google, чтобы найти это. join() для победы!

Allison Taylor 08.04.2022 22:38

@ Эллисон Тейлор Спасибо за ответ. Я рад, что ваша проблема была решена. И тебе спасибо.

Tanaike 09.04.2022 02:05

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