見出し画像

#35 組織内のクラスを一覧にする

きっかけ

Facebook のグループで、以下のような質問が寄せられていました。

Classroomについて
学内で教師が作ったClasseroomのクラスコードの一覧というのは管理者の方で確認することはできますでしょうか。

同じようなことを以前に考えたものの、管理コンソールにはそのような一覧を表示する機能が用意されていないようだったので、GAS で Classroom API を呼び出して、組織内で作成されているクラスの一覧を作成するプログラムを作成しました。

その当時(2020年 5月)は、ただゴリゴリと API を実行するだけで効率よく処理することは考えていませんでした。GAS のプログラムに触れてから約 2年が経過し、処理方法を見直したら、かなり高速に一覧が出力できるようになりました。(^-^)v

作成したプログラム

作成したのは「Google スプレッドシート」に GAS のプログラムを追加したものです。今回はメニューから処理を選択する形態になっています。

作成したスプレッドシート(シート「説明」)
メニューから処理を選択する

以下の URL にアクセスすることで、自身の Google ドライブにスプレッドシートをコピーできます。

https://docs.google.com/spreadsheets/d/1oSIJdapth6CjUzxdYawnjrwiY4S8movkyvpLtdXxqa8/copy

スプレッドシートがコピーできたら、以降の手順のように操作します。
なお、スクリプトの初回実行時には、実行するアカウントによる確認作業が必要になります。詳しくは以下の投稿をご覧ください。

注意: このプログラムは、一般権限のアカウントでも実行できますが、そのアカウントがアクセスできる範囲のクラスしか取得できません。組織内で作成されているクラスをすべて一覧にしたい場合には、特権管理者で実行しなければなりません。 ※詳細は、後述します。

使い方

  • スプレッドシート内のシート「説明」で、簡単な説明をまとめてあります。こちらもご覧ください。

  • メニュー 「クラスの一覧」からそれぞれの項目を選択して処理を実行します。メニューは、どのシートが選択されている状態でも選択できますが、シート「クラスの一覧」が選択された状態で実行してください。

  • スプレッドシートに前回の実行結果が残っているのであれば、メニューから「クラスの一覧」→「確認結果をクリア」を選択して、一覧をクリアします。

(1)クラスの一覧を取得

シート「クラスの一覧」を選択します。

メニューから「クラスの一覧」→「手順1 : クラスの一覧を取得」を選択します。しばらく待っていれば、ログインしているアカウントで閲覧できるクラスの一覧が A ~ G の列に読み込まれます。

  • 列 A : id クラスの ID

  • 列 B : name クラスの名前

  • 列 C : courseState クラスの状態 ※今回のプログラムでは常に ACTIVE

  • 列 D : enrollmentCode クラスコード

  • 列 E : ownerId クラスのオーナーの ID(メールアドレスではなく、内部的な ID) ※(2)の操作でメールアドレスに変換

  • 列 F: ※(2)の操作で設定するため、この時点では空欄

  • 列 G : creationTime コースの作成日時

注意点としては、

  • 一般のアカウントでスクリプトを実行した場合には、自身が参加しているクラスの情報しか表示されません。

  • 組織内に作成されているすべてのクラスを一覧にしたいのであれば、特権管理者でスクリプトを実行しなければならない。

  • Resource: Course」で定義されている情報であれば、プログラムの簡単な修正で一覧に追加可能。

(2)参加している生徒を数える

前項で、クラスの一覧が作成できたならば、「クラスの一覧」→「手順2 : 参加している生徒を数える」を選択すると、次の処理を行います。 ※前項(1)までの一覧で、必要な情報が得られていて、以下の処理が必要ないのであれば、この処理は実行しなくても構いません。

  • 前項で得られた ownerId(メールアドレスではない内部的な ID)を、ログイン時に使用するメールアドレスに変換する。

  • それぞれのクラスに属している生徒を数える。

処理は、セル「A1」から順に、クラスの ID について処理します。
これらの処理には、それなりの時間を要するため、クラスの作成されている数や、参加している生徒の数によっては、GAS の実行時間制限でエラーになってしまう場合があります。

  • 列E クラス所有者のメールアドレス

  • 列F 当該クラスに参加している生徒数
    → ここで表示されるのは、実際にクラスに参加している人数で、招待されても、まだ参加していない人は含まれない。

途中でタイムアウトになったときは、セル「I1」に処理を再開するセルの番号を保存してあるので、再度、「手順2 : 参加している生徒を数える」を選択して処理を継続させる。

補足説明

  • 以前に作成したプログラムでは、手順1の処理結果をセル一つずつ設定していましたが、一度の Classroom.Courses.list( ) で得られた結果をまとめてスプレッドシートに書き出すようにしたことで、処理の高速化につながりました。

    • Classroom や スプレッドシートの API はまとめて実行した方がよい。

    • ただし、(2)の処理については、実行時間の制限で中断してしまった場合に、スムーズに再開させることを考慮して、ゴリゴリ 1行ずつ処理するままにしてあります。

  • 規模が大きくなるとクラスの一覧を取得しきれなくなってしまうため、(1)と(2)に分割してあります。

    • (2)で行っている ownerId からメールアドレスへの変換だけでも、(1)に含めようとも思いましたが、クラス数だけ呼び出すとかなりの時間になるため分割してあります。

  • 今回のプログラムでは、参加している「生徒」の数をカウントするようにしていますが、プログラムを修正変更することで、参加している「教師」の数を確認することもできるでしょう。

  • 作成されるクラスの一覧は、「creationTime コースの作成日時」の新しい順になっているようです。

  • 前述したように、組織内で作成されているクラスの一覧を作成しようとするのであれば、特権管理者でプログラムを実行しなければ、当該アカウントでアクセスできるクラスの一覧しか作成できないので注意!
    → 規模の大きな組織になるほど、このプログラムで一覧を作成できる人が限られてくるだろう…

  • 参考までに…
    わたしの職場の環境では、約 5,300件のクラスが ACTIVE な状態だったようで、(1)の処理 ListAllCourses が 51秒、(2) の処理 CourseStudents が 4回のタイムアウト(30分 × 4)+ 628秒で完了しました。

実行に要した時間(例)
  • ownerId からメールアドレスへの変換時に、「次のエラーが発生し、classroom.userProfiles.get の呼び出しに失敗しました: The caller does not have permission」というエラーが発生する場合がありました。
    恐らく、以下の URL で案内されているようなクラスを作成したアカウントが既に存在していないのだと考えられます。

実際のプログラム

最後に

最後に、お決まりのフレーズなどを書いておきます。

  • 一応の動作確認は行っているものの、不慮のトラブルによって損害等が生じても、責任はとれませんので予めご了承ください。

  • コメントを含めても 130行余りのスクリプトであり、実行に際して目的外の場所への書き出しや収集などは行っていません。

  • 特別なエラー処理は行っていないので、意図しないケースでエラーが発生してしまうかもしれません。どうにもならない場合には、ご連絡ください。

わたし自身にしてみると、このような「スクリプトを作ること」が目的になっているような感じですが、このスクリプトが何かの役に立てば幸いです。

※追記

記事を公開してから、#02 としてゴリゴリ処理していたプログラムを公開していたことに気付きました。記事を取り下げるまでもないので、両方とも公開しておきます。(^-^;

※追記(2023/01/21)

組織内に大量のクラスが作成されている場合でも、実行時間の制限を回避して、一度に処理できるようにしたプログラムです。

この記事が気に入ったらサポートをしてみませんか?