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

时间:2014-12-14 05:31:42

标签: javascript google-apps-script

我搜索并尝试使用我能找到的东西,但我被卡住了。我正在尝试创建一个脚本,用于扫描Google表格(大约30张)以查找新输入且低于60%的值。然后,我希望脚本通过电子邮件向我发送当前数据行的第2列(学生姓名),第4列(教师姓名)中的数据以及百分比(测试分数)低于60%(例如克拉克,约翰夫人布朗56.64%)。我是Java脚本的新手,但一直在努力学习。

这是我到目前为止的脚本。它找到正确的工作表没有问题。它也会给我发电子邮件(错误的信息,但它仍然有效)。但是有一些事情我坚持下去。就像我知道我必须设置某种onEdit触发器,以便它只发送新输入的分数,但我不知道在哪里放或者如何做到这一点。我也知道我的dataRange代码对我来说似乎不对,if语句似乎也错了。我不知道如何指定"低于60%"。 我是一名技术老师,使用Google Drive为我们学校建立了一个庞大的数据系统。我希望每当学生需要特定评估的帮助时,主数据表会自动通过电子邮件发送给校长。你可以给我的任何帮助将不胜感激! 非常感谢你们所有的时间,我喜欢花时间在这里向大家学习 布兰登

Here is a link to an example of the data spreadsheet we use

下面的Choppy脚本



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)
    }
  }
}
&#13;
&#13;
&#13;

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..          
        }
    }
}

}

我添加了上面的新代码,并且可安装的触发器处于活动状态。我仍然无法使电子邮件功能正常工作。有任何想法吗? 感谢...

1 个答案:

答案 0 :(得分:0)

听起来您可以使用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);
            }
        }
    }
}

查看google referance页面以获取有关触发器的更多信息:https://developers.google.com/apps-script/guides/triggers/events

编辑

由于您要使用IMPORTRANGEonEdit触发器不会触发。尝试使用下面的功能,并使用此功能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);
}