Скрипт Google Apps для перечисления всех заданий всех классов в Google Classroom

Мне нужно перечислить все задания всех классов в Google Classroom. Одна строка не работает, но я не знаю, как ее исправить, что приводит к ошибке «TypeError: не удается прочитать свойство« length »из неопределенного». позже.

function listAssignments2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('TAREAS');  

  var response = Classroom.Courses.list();
  var courses = response.courses;
  for (i = 0; i < courses.length; i++) {
    var course = courses[i];

// This line below is not written right, which gives me an error further on.
    var class = Classroom.Courses.CourseWork.list(course.id);

}          

  var w = class.courseWork;
  var arr=[];

// The error comes out here stating "TypeError: Cannot read property "length" from undefined.". 
  for (i = 0; i < w.length; i++) {
    var c = w[i];
    var ids = c.id;
    var user = c.creatorUserId;
    var type = c.workType;
    var ti = c.title;
    var des = c.description;
    var st = c.state;
    var sch = c.scheduledTime;
    var due = c.dueDate;
    arr.push([ids,user,type,ti,des,st,sch,due]); 
  }
  sh.getRange(1, 1, arr.length, arr[0].length).setValues(arr);   

}

person Jason Jurotich    schedule 11.02.2018    source источник
comment
Вероятно, ваша ошибка связана с тем, где вы объявляете и присваиваете значение переменной w. Изучите, что на самом деле возвращается class.courseWork ... это может быть не массив.   -  person TheAddonDepot    schedule 11.02.2018


Ответы (2)


Я был совершенно не в порядке с тем, что я помещал, и, кроме того, мне нужно было изменить две переменные цикла for.

function listAllAssignments() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('TAREAS');  
  var response = Classroom.Courses.list();
  var courses = response.courses;

// First, the "arr" array had to be out of the for loop, this was the first error.
  var arr =[];

  for (i = 0; i < courses.length; i++) {
    var course = courses[i];
    var id = course.id;
    var class = Classroom.Courses.CourseWork.list(id);
    var w = class.courseWork;

/* The second and third error were here. First I had separated 
the for loops, when I should have put the second for loop inside 
the first, like I have here. Then, I should have changed the variable 
of the second for loop (like I did here with the "k"). This seems to 
have fixed the problems. */

        for (k = 0; k < w.length; k++) {
          var c = w[k]; 
          var ids = c.id;
          var user = c.creatorUserId;
          var type = c.workType;
          var ti = c.title;
          var des = c.description;
          var st = c.state;
          var sch = c.scheduledTime;
          var due = c.dueDate;
          arr.push([ids,user,type,ti,des,st,sch,due]);
          }
    }
  sh.getRange(1, 1, arr.length, arr[0].length).setValues(arr); 
}
person Jason Jurotich    schedule 13.02.2018

Частичный ответ.

Возможно, Classroom.Courses.list () возвращает пустой ответ. Чтобы предотвратить появление ошибки в сценарии замены, используйте что-то вроде следующего

  var response = Classroom.Courses.list();
  var courses = response.courses;
  if (courses && courses.length > 0) {
    for (i = 0; i < courses.length; i++) {
      var course = courses[i];
      Logger.log('%s (%s)', course.name, course.id); // Replace this with operations to be don on each iteration
    }
  } else {
    Logger.log('No courses found.');
  }

Кстати, в сценарии по вопросу есть инструкция for, которая на каждой итерации присваивает новое значение class. Весьма вероятно, что вам следует включить следующие строки в блок кода for:

  var w = class.courseWork;
  var arr=[];

// The error comes out here stating "TypeError: Cannot read property "length" from undefined.". 
  for (i = 0; i < w.length; i++) {
    var c = w[i];
    var ids = c.id;
    var user = c.creatorUserId;
    var type = c.workType;
    var ti = c.title;
    var des = c.description;
    var st = c.state;
    var sch = c.scheduledTime;
    var due = c.dueDate;
    arr.push([ids,user,type,ti,des,st,sch,due]); 
  }
person Rubén    schedule 12.02.2018
comment
Я не знаю, что случилось, но похоже, что что-то не работает с var w = class.courseWork; Даже когда я помещаю конкретный идентификатор курса в var class = Classroom.Courses.CourseWork.list (COURSE ID); он по-прежнему говорит, что не может что-то схватить, хотя я знаю, что это работало раньше. Когда я помещаю var class = Classroom.Courses.CourseWork.list (ID) .courseWork; Logger.log (класс); Результат не определен. (Вводя конкретное удостоверение личности). Вот где проблема. - person Jason Jurotich; 13.02.2018
comment
@JasonJurotich: попробуйте код из Быстрый запуск скрипта Google Apps | Google Classroom API и сообщите нам, работает ли он в вашей среде. - person Rubén; 13.02.2018
comment
Прекрасно работает. Ошибка находится в var class = Classroom.Courses.CourseWork.list (ID) .courseWork; - person Jason Jurotich; 13.02.2018
comment
Обновление: что-то должно было повлиять на скрипт на сервере Google, потому что я просто попробовал его снова, и теперь он работает, по крайней мере, я получил список заданий от одного класса. Позвольте мне попробовать снова использовать цикл for, чтобы получить все назначения от всех из них. - person Jason Jurotich; 13.02.2018
comment
Кажется, проблема в том, что цикл for обрывается, когда класс не имеет назначений. Я собираюсь поэкспериментировать с попыткой - поймать и посмотреть, закончится ли это. - person Jason Jurotich; 13.02.2018