GASメモ:Classroom

個人的なメモです。

このページに書かれていることは、あくまで個人的なメモです。どなたかの参考になれば嬉しいですが、その内容を保証するものではありません。私が試してうまく行ったことをメモしているだけです。ご了承ください。

最初にやること

サービス「Classroom」を追加する

GAS で Classroom を操作するためには、サービス「Classroom」を使える状態にする必要があります。

AppsScript画面で「サービス」右側の「+」をクリックし、リストから「Google Classroom API」をクリックします。下のID欄に「Classroom」と表示されたのを確認したら「追加」をクリックしてください。

サービス Classroom を追加

以下のようにサービスの下に「Classroom」と表示されていればOKです。

サービス Classroom 追加完了

管理者でなくても出来ること

Classroom のクラスを列挙する(全部)

管理者でなくても存在するすべてのクラス情報を取得できるようです。

function listClassroom() {
  const response = Classroom.Courses.list();
  const courses = response.courses;

  for (data of courses) {
    Logger.log(data.name + " / " + data.id);
  }
}

Classroom のクラスを列挙する(自分が教師)

さらに自分が教師として参加しているクラスに絞ってみました。最後の行にクラス数も表示させてみた。

function listClassroom() {
  const options = {  // オプション
    teacherId: 'me'  // 自分meが教師
  };

  const response = Classroom.Courses.list(options);  // 引数を追加
  const courses = response.courses;

  for (data of courses) {
    Logger.log(data.name + " / " + data.id);
  }

  Logger.log(courses.length);  // クラス数を表示
}

Classroom のクラスを列挙する(自分が生徒)

あまりない気もするけど自分が生徒として参加しているクラスに絞ってみました。

function listClassroom() {
  const options = {  // オプション
    studentId: 'me'  // 自分meが生徒
  };

  const response = Classroom.Courses.list(options);  // 引数を追加
  const courses = response.courses;

  for (data of courses) {
    Logger.log(data.name + " / " + data.id);
  }

  Logger.log(courses.length);  // クラス数を表示
}

Classroom のクラスを列挙する(自分が教師+キーワード)

自分が教師になっているクラス、なぜか100近くあるのでキーワードで絞り込みたいと思います。includesメソッドで「2025」を含むものに絞りました。

function listClassroom() {
  const keyword = "2025";
  const options = {
    teacherId: 'me'
  };

  const response = Classroom.Courses.list(options);
  const courses = response.courses;

  for (data of courses) {
    if (data.name.includes(keyword)) { // data.name に keyword を含むなら
      Logger.log(data.name + " / " + data.id);
    }
  }
}

data.name.match でも同じことができるけど、調べたら match は正規表現が使えて、includes は使えないという違いみたいです。戻り値は真偽のみなのでシンプルに扱えるとのこと。

Classroom のクラスを列挙する(自分が教師+複数キーワードAND)

自分が教師になっているクラス、なぜか100近くあるのでキーワードで絞り込みたいと思います。includesメソッドで「2025」を含むものに絞りました。

function listClassroom() {
  const keyword = "2025";
  const options = {
    teacherId: 'me'
  };

  const response = Classroom.Courses.list(options);
  const courses = response.courses;

  for (data of courses) {
    if (data.name.includes(keyword)) { // data.name に keyword を含むなら
      Logger.log(data.name + " / " + data.id);
    }
  }
}

Classroom のクラスを列挙する(自分が教師+複数キーワードOR)

AND が出来たので、OR も試してみました。「2A」と「数学」どちらかが含まれるものがリストアップされました。絞りすぎて出てこないときはこれかな。

function listClassroom() {
  const keywords = ["2A","数学"];
  const options = {
    teacherId: 'me'
  };

  const response = Classroom.Courses.list(options);
  const courses = response.courses;

  for (data of courses) {
    let anyFound = false;  // どれか見つかったフラグを false

    for (keyword of keywords) {  // keywords から1つずつ取り出して繰り返す
      if (data.name.includes(keyword)) {  // キーワードを含むなら
        anyFound = true;  // どれか見つかったフラグを false
        break;  // 1つでも含むならチェック終了
      }
    }

    if (anyFound) {  // どれか見つかったフラグが true なら
      Logger.log(data.name + " / " + data.id);  // 発見!
    }
  }
}

クラスID から Classroom の情報を取得する

クラスID(コースID)が分かったら、クラスの情報を取得したくなります。Classroom.Courses.get() で取得できました。データ構造はページ最後にあります。

function listClassroom() {
  const courseId = "コースID";

  course = Classroom.Courses.get(courseId);

  Logger.log(course.id);
  Logger.log(course.name);
  Logger.log(course.courseState);
}

管理者で出来ること

ドメイン管理者でないと出来ないと思われる操作をここに並べていきます。

Classroom に 生徒 を登録する

Classroom に生徒を登録する方法は、生徒が招待コードで参加するか、教員が招待して生徒が承認するか、のどちらかです。ところが招待しても参加してこない生徒がいて困っています。そこでドメイン管理者で強制的に参加させる方法を試しました。これで全校生徒を一気にクラスに登録!なんてことが出来そうです。

“courseID”: courseId を削除しても成功するので不要かもしれません。

function addStudent() {
  const courseId = "コースID";
  const studentEmail = "生徒メールアドレス";

  var json = {
    "userId": studentEmail,
    "courseId": courseId
  };
  
  Classroom.Courses.Students.create(json,courseId);
}

Classroom から 生徒 を削除する

Classroom に所属する生徒を削除する GAS です。Classroom.Courses.Students.remove にコースIDと生徒のメールアドレスを渡すだけです。

function delStudent() {
  const courseId = "コースID";
  const studentEmail = "生徒メールアドレス";

  Classroom.Courses.Students.remove(courseId, studentEmail);
}

調べたこと

Classroom をいじる際、色々と調べたことをメモしておきます。

Classroom.Couses.list() の戻り値の構造

Gemini に聞いた!
 response = Classroom.Courses.list();

 戻り値 response の構造を教えて

{
  "courses": [
    {
      "id": string,               // コースの一意な識別子(コースID)
      "name": string,             // コースの名前
      "section": string,          // コースのセクション(オプション)
      "descriptionHeading": string, // コースの説明のタイトル(オプション)
      "description": string,      // コースの説明(オプション)
      "room": string,             // 教室の場所(オプション)
      "ownerId": string,          // コースのオーナー(作成者)のユーザーID
      "creationTime": datetime,   // コースが作成された日時
      "updateTime": datetime,     // コースが最後に更新された日時
      "enrollmentCode": string,   // コースの参加コード
      "courseState": enum (CourseState), // コースの状態 (ACTIVE, ARCHIVED, PROVISIONED, DECLINED, SUSPENDED)
      "alternateLink": string,    // コースのWebインターフェースへのURL
      "teacherGroupEmail": string, // 教師グループのメールアドレス(オプション)
      "courseGroupEmail": string,  // コースグループのメールアドレス(オプション)
      "guardiansEnabled": boolean, // 保護者機能が有効かどうか
      "calendarId": string        // GoogleカレンダーID(オプション)
    },
    // ... 他のコースオブジェクト
  ],
  "nextPageToken": string         // 次のページの結果を取得するためのトークン(ページング用)
}
  • courses:
    • APIから取得されたコースオブジェクトの配列。各要素が1つのClassroomコースを表す。
    • この配列は、リクエストに含まれるフィルター(teacherIdstudentIdcourseStates など)やページサイズによって内容が変わる。
  • 各コースオブジェクトの主要なプロパティ:
    • id (string): コースID。Classroomを特定する重要なデータ。
    • name (string): Classroomに表示されるコース名(例: “理科 2年A組”)。
    • section (string): セクション情報です(例: “春学期”)。
    • description (string): コースの説明文です。
    • room (string): 物理的な教室の場所などです。
    • ownerId (string): コースを作成したユーザーのGoogleユーザーID(メールアドレスとは限りません)。
    • creationTime (datetime): ISO 8601形式の日時文字列。
    • updateTime (datetime): ISO 8601形式の日時文字列。
    • enrollmentCode (string): 学生がコースに参加するためのコードです。
    • courseState (enum): コースの現在の状態を示します。
      • ACTIVE: アクティブなコース
      • ARCHIVED: アーカイブされたコース
      • PROVISIONED: プロビジョニング済み(作成準備中)
      • DECLINED: 拒否された(教師が招待を拒否した場合など)
      • SUSPENDED: 停止済み
    • alternateLink (string): ウェブブラウザでこのコースに直接アクセスするためのURLです。
    • guardiansEnabled (boolean): 保護者への連絡機能がこのコースで有効になっているかを示します。
    • calendarId (string): このコースに関連付けられたGoogleカレンダーのIDです。
  • nextPageToken:
    • 取得したコースのリストが、APIの1ページあたりの最大結果数(デフォルトは100)を超えている場合、このプロパティに次のページを取得するためのトークンが設定されます。
    • すべてのコースを取得するには、このトークンを使って再度 Classroom.Courses.list() を呼び出す必要があります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です