Classroomから受講者名簿の生成

2022-04-08(金)

長期に渡り使われてきたCSTポータルIIが遂に廃止となりました。ClassroomとCanvasが乗り換え先な訳ですが,ClassroomはSIS (Student Information System)との連携前提なので学生番号という概念がなく,Web UIだけだと受講者を選択してメール送信を選んでようやくユニークな情報に到達する面倒な状態なのでGoogle Apps Scriptで特定の担当コースの学生情報(アドレス,氏名)を抽出してみました。

Classroom APIで情報取得する際はページ単位(30個/ページ がデフォルト)で持って来ようとするので,ページあたりのデータ数を増やしてもっと寄越せと指定しても仕様で「いっぱいくれと言われてもあげないよ」と書かれており,

  1. 取得(pageToken(今どこまで読んだか)も返される)
  2. 読んだデータを別バッファにpush
  3. 貰ったpageTokenを示しつつ取得
  4. 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を追加し,ソースをコピペして実行すれば良い。

Category: Memo Tagged: Classroom GAS