Google Classroomで学生ごとの処理をGASでやりたい場合、まず対象クラスの学生情報リストを取得することになります。Classroom APIでは日本語で「クラス」と言っている対象はCourseに該当しますが、面倒なので本稿ではクラス=コース、の意味でまぜこぜで使います。
基本的にはClassroom.Courses.list().courses
でクラス(コース)のリストを取得し、name
が対象クラスのクラス名に等しいものについて処理するのが簡単です(コースのidが分かっていればClassroom.Courses.get(id)
で一発でとれますが、筆者の知る範囲ではコースidを調べるには結局list()
で取ってnameの一致でidを特定することになるので、だったらそこもコードに含めてしまえ、ということです)。
ただ、list()
で返ってくる学生数は固定で30となっているようで、全員の情報を取得するには返ってくるリスト情報に含まれるnextPageToken
を使って尽きるまで取り続ける必要があります。
Google APIの他のリスト系関数ではmaxResults
で上限数を上書きできるものもありますが、どうもClassroom.Courses
ではそもそもこのパラメータがないらしい…。
で、単純にググってもなかなかこれ!という記事を見つけられなかったので、自分でまとめてみたのが末尾のコードです。というか必要な情報は断片的にあちこちに散らばってるのでそれをつなぎ合わせただけですが。
要点は、list()
で取得する学生リストには、更に続きがあればnextPageToken
が含まれていて、
リストを取りつくしたらnullが返ってくるので、do { } while()
でnextPageToken
がnullになるまで回す、というだけです。
んにしても上限30って少ない気がする…。
function gSLtestByName() {
let course = 'Google Classroomのリスト取得';
let students = getStudentListByName(course);
students.map(function(s) { console.log(s['profile']['name']['fullName']); });
}
function getStudentListByName(target) {
let studentList = [];
let courses = Classroom.Courses.list().courses;
let course = courses.filter(function(c) {return c['name'] === target; })
let nextPageToken = null;
do {
let students = Classroom.Courses.Students.list(
course[0]['id'],{pageToken: nextPageToken}
);
studentList = studentList.concat(students['students']);
nextPageToken = students.nextPageToken;
} while(nextPageToken != null);
return studentList;
}