我搜索并尝试使用我能找到的东西,但我被卡住了。 我正在尝试创建一个脚本来扫描 Google 工作表(大约有 30 张工作表(以查找新输入且低于 60% 的值。 然后,我希望脚本通过电子邮件将当前数据行的第 2 列(学生姓名(、第 4 列(教师姓名(中的数据以及低于 60% 的百分比(考试成绩((例如克拉克、约翰·布朗夫人 56.64%(。 我是Java脚本的新手,但一直在努力学习。
这是我到目前为止的脚本。 它可以毫无问题地找到正确的工作表。 它也会给我发电子邮件(带有错误的信息,但它仍然有效(。 但有些事情我坚持了下来。 就像我知道我必须设置某种 onEdit 触发器,以便它只发送新输入的分数,但我不知道把它放在哪里或如何做到这一点。 我也知道我拥有的dataRange代码对我来说似乎是错误的,if语句似乎也是错误的。 我不确定如何指定"低于 60%"。我是一名技术老师,使用谷歌云端硬盘为我们学校建立了一个庞大的数据系统。 我希望在学生在特定评估中需要帮助时,主数据表会自动向我的校长发送电子邮件。 您能给我的任何帮助将不胜感激!非常感谢你们的所有时间,我喜欢花时间在这里向大家学习。
布兰登
以下是我们使用的数据电子表格示例的链接
下面的断断续续的脚本
function sendEmail() {
var spreadsheet = SpreadsheetApp.openById('spreadsheet ID');
/// The ID of the data spreadshfeet
var sheet = spreadsheet.getSheets(); // gets all sheets
var startRow = 3; // Third row of data to process
var numRows = 40; // Number of rows to process
var dataRange = sheet.getRange(startRow, 10, numRows, 50); // Start row 3 column 10, and stop row 40, column 50
// Fetch values for each row in the Range.
var data = dataRange.getValues();
//Browser.msgBox(data)
for (i in data) {
var row = data[i];
if (dataRange.getValues() <= .60); {
var emailAddress = "my email";
var message = row[2]; // Second column
var subject = "ALERT - Assessment score below 60% inputted.";
MailApp.sendEmail(emailAddress, subject, message);
// Browser.msgBox(emailAddress)
}
}
}
function emailAlert(e) {
var range = e.range;
if (range.getColumn() >= 10) { // Only check column I and up
var editedSheet = e.source.getActiveSheet();
var editedRow = range.getRow();
var value = range.getValue();
if (value !== 'undefined') {
if (value < 0.6) {
var studentData = editedSheet.getRange(editedRow, 1, 1, 9).getValues();
Logger.log(
'StudentId: ' + studentData[0][0] +
'n Name: ' + studentData[0][1] +
'n HR: ' + studentData[0][2] +
'n Teacher: ' + studentData[0][3] +
'n Grade: ' + studentData[0][4] +
'n Race: ' + studentData[0][5] +
'n G: ' + studentData[0][6] +
'n Ed: ' + studentData[0][7] +
'n AVG: ' + studentData[0][8]);
var emailAddress = "brandon.mause@sleschool.org";
var message = Test
var subject = "ALERT - Assessment score below 60% inputted.";
MailApp.sendEmail(emailAddress, subject, message);
// Send email..
}
}
}
}
我在上面添加了新代码,并激活了可安装触发器。 我仍然无法让电子邮件功能正常工作。 有什么想法吗?谢谢。。。
听起来您的问题可以使用onEdit
触发器来解决。但是,由于您要发送电子邮件,因此需要手动添加触发器,因为该函数需要授权才能发送电子邮件。
试试这个:
function assessmentOnEdit(e) {
var range = e.range;
if (range.getColumn() >= 10) { // Only check column I and up
var editedSheet = e.source.getActiveSheet();
var editedRow = range.getRow();
var value = range.getValue();
if (typeof value === 'number') {
if (value < 0.6) {
var studentData = editedSheet.getRange(editedRow, 1, 1, 9).getValues();
var message = 'Assessment score: ' + Math.round((value * 100) * 10) / 10 + ' %' +
'nStudentId: ' + studentData[0][0] +
'nName: ' + studentData[0][1] +
'nHR: ' + studentData[0][2] +
'nTeacher: ' + studentData[0][3] +
'nGrade: ' + studentData[0][4] +
'nRace: ' + studentData[0][5] +
'nG: ' + studentData[0][6] +
'nEd: ' + studentData[0][7] +
'nAVG: ' + Math.round((studentData[0][8] * 100) * 10) / 10 + ' %';
var emailAddress = 'john.doe@example.com';
var subject = 'ALERT - Assessment score below 60% inputted.';
MailApp.sendEmail(emailAddress, subject, message);
}
}
}
}
查看谷歌参考页面,了解有关触发器的更多信息:https://developers.google.com/apps-script/guides/triggers/events
编辑
由于您要使用IMPORTRANGE
因此onEdit
触发器不会触发。尝试使用以下函数,并将此功能与 onChange
一起使用,而不是 onEdit
。
function assessmentOnChange(e) {
var editedSheet = e.source.getActiveSheet();
var scriptProperties = PropertiesService.getScriptProperties();
var propertyKey = 'currentColumn';
var currentColumn = scriptProperties.getProperty(propertyKey);
if (currentColumn === null) {
currentColumn = 14; //Fisrt Empty column is N
}
var table = editedSheet.getRange(3, Number(currentColumn), editedSheet.getLastRow(), editedSheet.getLastColumn()).getValues(),
rowNumber = 3,
valuesToProcess = [];
table.forEach(function(row) {
var column = 0;
row.forEach(function(cell) {
if (typeof cell === 'number') {
valuesToProcess.push({
value: cell,
row: rowNumber,
column: Number(currentColumn) + column
})
}
column++;
});
rowNumber++;
});
var maxColumn = Number(currentColumn);
for (var i in valuesToProcess) {
assessmentOnEdit({
source: e.source,
range: {
getRow: function() {
return valuesToProcess[i].row
},
getValue: function() {
return valuesToProcess[i].value
},
getColumn: function() {
return valuesToProcess[i].column
}
}
});
if (valuesToProcess[i].column > maxColumn) {
maxColumn = valuesToProcess[i].column;
}
}
scriptProperties.setProperty(propertyKey, maxColumn + 1);
}