Я создал таблицу для наших тренеров. Они выбирают вид спорта, а затем электронная таблица заполняет список возможных учеников. Они устанавливают флажок рядом с именем учащегося (учащихся), присутствовавших на мероприятии, вводят дату и нажимают кнопку «Отправить». Он отправляет электронное письмо перечисленным учителям (на 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";
Из вашего сценария показа кажется, что 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() для победы!