首页 > 解决方案 > 尝试设置 Google 表单测验分数时出错

问题描述

我正在尝试根据其答案更改响应的等级。

这是我正在使用的代码:

function myFunction() {

var form = FormApp.openById('formID123456');

  // For a question with options: "1", "2", "3", and "4",
 // award points for responses that correlate with their answers.
 var formResponses = FormApp.getActiveForm().getResponses();
 // Go through each form response
 for (var i = 0; i < formResponses.length; i++) {
   var response = formResponses[i];
   var items = FormApp.getActiveForm().getItems();
   // Assume it's the first item
   var item = items[0];
   var itemResponse = response.getGradableResponseForItem(item);
   // Give 4 points for "4".
   if (itemResponse != null && itemResponse.getResponse() == '4') {
     var points = item.asScaleItem().getPoints();
     itemResponse.setScore(points == 4);
   }
   // Give 3 points for "3".
     else if (itemResponse != null && itemResponse.getResponse() == '3') {
     var points = item.asScaleItem().getPoints();
     itemResponse.setScore(points == 3);
     }
     // Give 2 points for "2".
         else if (itemResponse != null && itemResponse.getResponse() == '2') {
     var points = item.asScaleItem().getPoints();
     itemResponse.setScore(points == 2);
         }
     // Give 1 points for "1".
   else if (itemResponse != null && itemResponse.getResponse() == '1') {
     var points = item.asScaleItem().getPoints();
     itemResponse.setScore(points == 1);
     // This saves the grade, but does not submit to Forms yet.
     response.withItemGrade(itemResponse);
   }
 }
 // Grades are actually submitted to Forms here.
 FormApp.getActiveForm().submitGrades(formResponses);
}

这将返回错误:

We're sorry, a server error occurred. Please wait a bit and try again. (line 23, file "Code")

似乎在更改响应分数时遇到了问题,但它没有返回特定错误,因此我尝试隔离更改分数的部分。

在这里,脚本仅尝试更改响应的分数。

function myFunction() {

var form = FormApp.openById('formID123456');

var formResponses = FormApp.getActiveForm().getResponses();
 // Go through each form response
 for (var i = 0; i < formResponses.length; i++) {
   var response = formResponses[i];
   var items = FormApp.getActiveForm().getItems();
   // Assume it's the first item
   var item = items[0];
   var itemResponse = response.getGradableResponseForItem(item);
   // Set Score to 3
var points = item.asScaleItem().getPoints();
     itemResponse.setScore(points == 3);
   }}

再次,它返回了相同的错误,这证实了我的怀疑。为什么我会遇到这个问题,我该如何解决?任何帮助将非常感激。谢谢!

标签: google-apps-scriptgoogle-formsgoogle-form-quiz

解决方案


正如我在评论中提到的ItemResponse#setScore,当方法期望接收一个值时,您发布的代码在调用中错误地使用了布尔Integer值。

可以通过更改整个if-elseif链来解决内部服务器错误:

if (itemResponse != null && itemResponse.getResponse() == '4') {
  var points = item.asScaleItem().getPoints();
  itemResponse.setScore(points == 4);  //<--- 'points == 4' evaluates to True or False
}
// Give 3 points for "3".
else if (...

对此:

// Skip changing the score if there was no answer or the answer is "falsey" 
if (!itemResponse || !itemResponse.getResponse())
  continue; 
var answer = itemResponse.getResponse();
var newPoints = answer *1; // Convert "2" to 2, etc.
// Assumption: newPoints <= maximum possible points.
itemResponse.setScore(newPoints);
response.withItemGrade(itemResponse);

下面的代码是一个示例,说明如何将表单的所有回复中的所有评分项目设置为最大可能值。

function everyonePassesForTrying() {
  var form = FormApp.getActiveForm();
  var responses = form.getResponses();
  responses.forEach(function (fr) {
    fr.getGradableItemResponses().forEach(function (gr) {
      if (gr.getResponse()) {
        var maxPoints = getPointValue_(gr.getItem());
        if (gr.getScore() !== maxPoints) {
          // Re-grade the item's response.
          gr.setScore(maxPoints);
          // Update the form response with the new grade.
          fr.withItemGrade(gr);
        }
      }
      else { /* They didn't even try, so no change */ }
    });
  });
  // Submit the altered scores.
  form.submitGrades(responses);
}

var itemCache = {};
function getPointValue_(item) {
  var id = item.getId();
  // Use a pseudo-cache of the item's point values to avoid constantly determining what
  // type it is, casting to that type, and getting the max points.
  if(!itemCache[id]) {
    // Haven't seen it yet, so cast and cache.
    item = castToType_(item);
    itemCache[id] = {maxPoints: item.getPoints() *1};
  }

  return itemCache[id].maxPoints;
}

function castToType_(item) {
  // Cast the generic item to its type.
  var CHECKBOX = FormApp.ItemType.CHECKBOX,
      DATE = FormApp.ItemType.DATE,
      DATETIME = FormApp.ItemType.DATETIME,
      DURATION = FormApp.ItemType.DURATION,
      LIST = FormApp.ItemType.LIST,
      MULTICHOICE = FormApp.ItemType.MULTIPLE_CHOICE,
      PARAGRAPH = FormApp.ItemType.PARAGRAPH_TEXT,
      SCALE = FormApp.ItemType.SCALE,
      TEXT = FormApp.ItemType.TEXT,
      TIME = FormApp.ItemType.TIME;
  switch (item.getType()) {
    case CHECKBOX:    item = item.asCheckboxItem();
      break;
    case DATE:        item = item.asDateItem();
      break;
    case DATETIME:    item = item.asDateTimeItem();
      break;
    case DURATION:    item = item.asDurationItem();
      break;
    case LIST:        item = item.asListItem();
      break;
    case MULTICHOICE: item = item.asMultipleChoiceItem();
      break;
    case PARAGRAPH:   item = item.asParagraphTextItem();
      break;
    case SCALE:       item = item.asScaleItem();
      break;
    case TEXT:        item = item.asTextItem();
      break;
    case TIME:        item = item.asTimeItem();
      break;
    default:
      throw new Error("Unhandled gradable item type '" + item.getType() + "'");
      break;
  }
  return item;
}

推荐阅读