Google Sheets Script Apps - 所选学生的电子邮件花名册,格式问题
Google Sheets Script Apps-Email roster of selected students, formatting issue
我已经为我们的教练创建了一个电子表格。他们选择了一项运动,然后在电子表格中填满了可能的学生名册。他们单击参加活动的学生姓名旁边的复选框,键入日期,然后单击发送按钮。它向列出的教师发送一封电子邮件(第二个选项卡包含所有花名册和电子邮件)。我写的脚本做这一切没问题。我遇到的问题涉及格式化。名称以逗号分隔水平打印出来:
学生一、学生二(等)
[这是原来的 post,但我想出了如何跳过数组中的空白点
如果跳过花名册中的学生,打印输出如下所示:
学生一、学生三、学生四、学生六(等)]
如果未选中该复选框,我不希望打印名称,但我希望电子邮件的打印输出看起来更清晰一些。 我使用一个数组来读取名称,我意识到它只是打印出数组并且它有一个空框。 (解决了空名部分) 我希望电子邮件看起来像:
学生一
学生二
我不确定如何完成这个并且已经搜索了很多。我拥有的是功能性的,但看起来不太好。另一个循环可以完成这个,但我不知道如何在格式化电子邮件的同时做到这一点。当我尝试在里面放一个循环时,它绝对不喜欢。
这是电子表格:Sample Sports Email Spreadsheet
这是我输入的代码:
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);
}
};
编辑
我已经创建了另一个函数来尝试将其获取到 return 每个名字后面有一个 return,但我只能让它做名字:
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";
参考:
我已经为我们的教练创建了一个电子表格。他们选择了一项运动,然后在电子表格中填满了可能的学生名册。他们单击参加活动的学生姓名旁边的复选框,键入日期,然后单击发送按钮。它向列出的教师发送一封电子邮件(第二个选项卡包含所有花名册和电子邮件)。我写的脚本做这一切没问题。我遇到的问题涉及格式化。名称以逗号分隔水平打印出来:
学生一、学生二(等)
[这是原来的 post,但我想出了如何跳过数组中的空白点 如果跳过花名册中的学生,打印输出如下所示:
学生一、学生三、学生四、学生六(等)]
如果未选中该复选框,我不希望打印名称,但我希望电子邮件的打印输出看起来更清晰一些。 我使用一个数组来读取名称,我意识到它只是打印出数组并且它有一个空框。 (解决了空名部分) 我希望电子邮件看起来像:
学生一
学生二
我不确定如何完成这个并且已经搜索了很多。我拥有的是功能性的,但看起来不太好。另一个循环可以完成这个,但我不知道如何在格式化电子邮件的同时做到这一点。当我尝试在里面放一个循环时,它绝对不喜欢。
这是电子表格:Sample Sports Email Spreadsheet
这是我输入的代码:
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);
}
};
编辑
我已经创建了另一个函数来尝试将其获取到 return 每个名字后面有一个 return,但我只能让它做名字:
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";