Classroomから受講者名簿の生成
2022-04-08(金)
長期に渡り使われてきたCSTポータルIIが遂に廃止となりました。ClassroomとCanvasが乗り換え先な訳ですが,ClassroomはSIS (Student Information System)との連携前提なので学生番号という概念がなく,Web UIだけだと受講者を選択してメール送信を選んでようやくユニークな情報に到達する面倒な状態なのでGoogle Apps Scriptで特定の担当コースの学生情報(アドレス,氏名)を抽出してみました。
Classroom APIで情報取得する際はページ単位(30個/ページ がデフォルト)で持って来ようとするので,ページあたりのデータ数を増やしてもっと寄越せと指定しても仕様で「いっぱいくれと言われてもあげないよ」と書かれており,
- 取得(pageToken(今どこまで読んだか)も返される)
- 読んだデータを別バッファにpush
- 貰ったpageTokenを示しつつ取得
- pageTokenがnullになるまで繰り返し
という処理になる。 ↓は手を抜いていて実際には
var cList = Classroom.Courses.list();
だと30個までしかコースは取得できないのだが30個以上コース持つことは無いだろうということでそのまま。
function myFunction() {
// 一覧を抽出するコース名 (Classroom)上の名前
var courseName = '画像処理';
var cList = Classroom.Courses.list();
var myCourses = cList.courses;
for (i = 0; i < myCourses.length; i++) {
Logger.log(myCourses[i]) //デバッグ用に表示
//コース名はアーカイブされているものは重複しても許されるので courseStateの確認が必要
if (myCourses[i]['name'] == courseName && myCourses[i]['courseState'] != 'ARCHIVED') {
var inviteClassId = myCourses[i]['id'];
}
}
var pageToken = "";
var studentsString = "";
//どう頑張っても小塊でしか拾ってくれない(デフォ30)ので,Students.list での取得時にトークンを渡す
//トークンは取得ごとに更新されるので do - whileの最後に nextPageTokenに置換えると次のページを取得できる
do {
var search = Classroom.Courses.Students.list(inviteClassId, {"pageToken": pageToken});
for (i = 0; i < search['students'].length; i++) {
//ここは雑にカンマ区切りのstringを作ってしまう。データごとに改行を入れる
studentsString = studentsString + "\n" +
search['students'][i]['profile']['emailAddress'] + "," + search['students'][i]['profile']['name']['fullName']
+"," + search['students'][i]['profile']['name']['familyName']+"," + search['students'][i]['profile']['name']['givenName']
}
pageToken = search.nextPageToken;
} while(pageToken)
var contentType = 'text/plain';
var charset = 'utf-8';
// スクリプトの場所を取得する術がなさそうなのでまんま実行。MyDriveのルートにファイルが作られる
var blob = Utilities.newBlob('',contentType,courseName+'.csv').setDataFromString(studentsString, charset)
DriveApp.createFile(blob);
}
※挙動が不明だったので冗長に書いてます
実際にはGoogle Driveで新規作成からGoogle Apps Scriptを選んで(なければ追加),サービスからClassroom APIを追加し,ソースをコピペして実行すれば良い。