Ошибка при попытке установить оценку теста Google Forms - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь изменить оценку ответа на основании его ответа.

Вот код, который я использую:

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 голосов
/ 08 мая 2018

Как я уже упоминал в комментариях, ваш опубликованный код ошибочно использует логическое значение при вызове 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;
}
...