尝试制作一个脚本,如果值低于 60%,则扫描 Google 表格和电子邮件

Trying to make a script that scans a Google Sheet and emails if values are below 60%

本文关键字:扫描 Google 电子邮件 表格 如果 脚本 一个      更新时间:2023-09-26

我搜索并尝试使用我能找到的东西,但我被卡住了。 我正在尝试创建一个脚本来扫描 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);
}