尝试设置Google表单测验分数时出错

时间:2018-05-07 03:46:02

标签: google-apps-script google-form google-form-quiz

我试图根据答案改变回复的等级。

以下是我使用的代码:

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);
   }}

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

1 个答案:

答案 0 :(得分:0)

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

可以通过更改整个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;
}