【问题标题】:Automatic GMail Grading (Google Script)自动 GMail 分级(谷歌脚本)
【发布时间】:2021-05-24 02:57:32
【问题描述】:

下面的代码是一个 sendEmail 函数,我用它使用 Google Script 发送 GMail 消息,以便学生获得数学测试的反馈。我创建了一个测试,顶部的第一个值列表由我输入(see example of grading here)。我想标记不等于顶部行的问题(“不正确”)。

特别是给我带来麻烦的代码行如下:if (Answer(j)!=row[j]) {row[j]=row[j]+" (Incorrect)";}

如果我输入 Answer(5),它会将其识别为顶部的第一行和第五列,它正在执行应有的操作。但是,当我使用变量 j 调用 Answer(j) 时,它会将所有问题标记为不正确。现在,Answer(j) 对应于学生输入的 row[j]。我不知道我做错了什么,我一直试图弄乱代码一段时间,但似乎没有任何效果。任何帮助将不胜感激!

function sendEmail() {
 var sheet = SpreadsheetApp.getActiveSheet();
 var startRow = 2; // First row of data to process
 var numRows = 5; // Number of rows to process
 var numQuestions = 17; //Number of Questions Asked on Assessment
 // Fetch the range of cells A2:B3
 var dataRange = sheet.getRange(startRow, 1, numRows, 25);
 // Fetch values for each row in the Range.
 var data = dataRange.getValues();
 for (var i = 0; i < data.length; ++i) {
   var row = data[i];
   var emailAddress = row[1]; // First column
   var message = row[0]+","+"\n"+"\n"+"Below is feedback on your assessment. Your score is a "+row[4]+".\n";
   for(var j = 4; j < numQuestions+4; ++j) {
     k=j-3;
     function Answer(n){
     return SpreadsheetApp.getActiveSheet().getRange(1, n).getValue();
     }
     if (Answer(j)!=row[j]) {row[j]=row[j]+" (Incorrect)";
     }
     message = message+"\n"+"Question #" +k+": "+row[j];
   }
   var emailSent = row[2]; // Third column
   if (emailSent !== EMAIL_SENT) { // Prevents sending duplicates
     var subject = 'Math Feedback';
     MailApp.sendEmail(emailAddress, subject, message);
     sheet.getRange(startRow + i, 2+1).setValue(EMAIL_SENT);
     // Make sure the cell is updated right away in case the script is interrupted
     SpreadsheetApp.flush();
   }
 }
}

【问题讨论】:

    标签: google-apps-script google-sheets gmail


    【解决方案1】:

    我认为您的问题的原因可能是由于数组索引(第一个数字是 0.)和列号(第一个数字是 1.)之间的差异。在您的脚本中,for(var j = 4; j &lt; numQuestions+4; ++j) {j 用作row 的索引。但是在function Answer(n){return SpreadsheetApp.getActiveSheet().getRange(1, n).getValue();}j 被用作列号。既然如此,那么下面的修改呢?

    发件人:

    return SpreadsheetApp.getActiveSheet().getRange(1, n).getValue();
    

    收件人:

    return SpreadsheetApp.getActiveSheet().getRange(1, n + 1).getValue();
    

    注意:

    • 在您的脚本中,当标题行和数据行通过一个请求通过分离检索时,处理成本可能会降低。当这反映到你的脚本中时,它变成如下。

        function sendEmail() {
          var sheet = SpreadsheetApp.getActiveSheet();
          var startRow = 1; // First row of data to process <--- Modified
          var numRows = 5; // Number of rows to process
          var numQuestions = 17; //Number of Questions Asked on Assessment
          // Fetch the range of cells A2:B3
          var dataRange = sheet.getRange(startRow, 1, numRows, 25);
          // Fetch values for each row in the Range.
          var [header, ...data] = dataRange.getValues(); <--- Modified
          for (var i = 0; i < data.length; ++i) {
            var row = data[i];
            var emailAddress = row[1]; // First column
            var message = row[0] + "," + "\n" + "\n" + "Below is feedback on your assessment. Your score is a " + row[4] + ".\n";
            for (var j = 4; j < numQuestions + 4; ++j) {
              k = j - 3;
              if (header[j] != row[j]) { <--- Modified
                row[j] = row[j] + " (Incorrect)";
              }
              message = message + "\n" + "Question #" + k + ": " + row[j];
            }
            var emailSent = row[2]; // Third column
            if (emailSent !== EMAIL_SENT) { // Prevents sending duplicates
              var subject = 'Math Feedback';
              MailApp.sendEmail(emailAddress, subject, message);
              sheet.getRange(startRow + i, 2 + 1).setValue(EMAIL_SENT);
              // Make sure the cell is updated right away in case the script is interrupted
              SpreadsheetApp.flush();
            }
          }
        }
      

    参考:

    【讨论】:

    • 非常感谢!
    • @William Garske 感谢您的回复。很高兴您的问题得到解决。
    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多