【Google Classroom】クラス一覧をスプレッドシートで取得する

前回に引き続き、Google Classroomの活用記事です。
基本的には、前回の記事を読んだ人向けの記事になっています。(GASを触ったことがある人であれば、この記事単発でも大丈夫です)

前回は、クラスを一括作成する方法を紹介しましたが、今回は、クラスの一覧表を作成する方法を紹介します。

*この記事を参考にしたことにより、ご利用者様、または第三者に損害・トラブル等が発生した場合でも、一切の責任を負いません。自己責任の上でのご利用をお願いいたします。

スプレッドシートを作る

まずは、スプレッドシートを用意してください。
前回の記事もお試しになっている場合は、そのファイルを使用できます。

用意できたら、コース情報という名前のシートを用意してください。
シート全体を選択し、セルの書式は「書式なしテキスト」にしておいてください。

下記の画像と同じ内容にしてください。(一言一句同じである必要はありません)

スプレッドシートの見本
今回は列数がかなり多い・・・

左上のボタンは、挿入 → 図形描画で作成しました。こちらも、どんな見た目でも構いません。

スクリプトを貼り付ける+ボタンに割り当てる

下記のコードをスクリプトエディタに貼り付けてください。
前回の記事と同じスプレッドシートを使用している場合は、前回貼り付けたスクリプトの下に、今回のスクリプトを貼り付けてください。

/***********************************************
 *  コース情報一覧を作成する
 ***********************************************/
function listCourses() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("コース情報");
  const select = Browser.msgBox("コース情報を抽出します。よろしいですか?", Browser.Buttons.OK_CANCEL);
  if (select == "cancel") {
      Browser.msgBox("キャンセルしました");
      return;
  }
  sheet.getRange("A5:O").clearContent();
  SpreadsheetApp.flush();
  let continueSelect = "yes";
  let procCnt = 0;
  const optionalArgs = {};
  if ( sheet.getRange(2, 2).getValue() ){ optionalArgs.studentId = sheet.getRange(2, 2).getValue() };
  if ( sheet.getRange(2, 3).getValue() ){ optionalArgs.teacherId = sheet.getRange(2, 3).getValue() };
  if ( sheet.getRange(2, 4).getValue() ){ optionalArgs.courseStates = sheet.getRange(2, 4).getValue() };
  if ( sheet.getRange(2, 5).getValue() ){ optionalArgs.pageSize = sheet.getRange(2, 5).getValue() };

  let rowNum = 5;
  while ( continueSelect == "yes" ) {
    const response = Classroom.Courses.list(optionalArgs);
    const records = [];
    if ( response.courses ) {
      for ( const course of response.courses ){

        // エイリアスを取得
        let alias = "";
        try {
          alias = Classroom.Courses.Aliases.list(course.id).aliases[0].alias;
        } catch(e) {
          // no alias
        }

        // ownerEmailを取得
        let ownerEmail = "";
        try {
          ownerEmail = Classroom.UserProfiles.get(course.ownerId).emailAddress;
        } catch(e) {
          ownerEmail = e;
        }

        // 教員フォルダリンク
        const teacherFolderLink = course.teacherFolder ? course.teacherFolder.alternateLink : "";
        
        // 配列に格納
        records.push([
          course.id,
          course.name,
          alias,
          course.section,
          course.room,
          course.ownerId,
          ownerEmail,
          course.courseState,
          course.alternateLink,
          course.enrollmentCode,
          course.teacherGroupEmail,
          course.courseGroupEmail,
          teacherFolderLink,
          course.creationTime,
          course.updateTime
        ])
      }
    } else {
      Browser.msgBox("対象データがありませんでした。"); 
      return;
    }
    
    // スプレッドシートにデータ出力
    sheet.getRange(rowNum, 1, records.length, records[0].length).setValues(records); // データ貼り付け
    rowNum += records.length;
    SpreadsheetApp.flush();
    if ( response.nextPageToken ) {
      optionalArgs.pageToken = response.nextPageToken;
      continueSelect = Browser.msgBox("他にもデータがあります。引き続き抽出しますか?", Browser.Buttons.YES_NO);
    } else {
      continueSelect = "no";
    }
  }
  Browser.msgBox("処理が終了しました。");  
}

そして、スプレッドシート上のコース情報抽出ボタンlistCoursesを割り当ててください。

処理が遅い場合の対処

エイリアスと所有者Emailを取得する部分に結構時間がかかるようです。

これらが不要な場合は、コードに下記の修正を加えると、速度が改善されると思います。

エイリアスが不要な場合

1.コードの下記の部分を削除(またはコメントアウト)します。

        // エイリアスを取得
        let alias = "";
        try {
          alias = Classroom.Courses.Aliases.list(course.id).aliases[0].alias;
        } catch(e) {
          // no alias
        }

2.// 配列に格納部分のalias,“”,に書き換えます。

所有者Emailが不要な場合

1.コードの下記の部分を削除(またはコメントアウト)します。

        // ownerEmailを取得
        let ownerEmail = "";
        try {
          ownerEmail = Classroom.UserProfiles.get(course.ownerId).emailAddress;
        } catch(e) {
          ownerEmail = e;
        }

2.// 配列に格納部分のownerEmail,“”,に書き換えます。

実行してみる

完成したので、早速コース情報抽出ボタンを押してみます。

実行確認のダイアログ
OKをクリック
抽出した結果
クラスの一覧が抽出できました

無事、クラスの一覧が抽出できました。

ちなみに、画面上部の検索条件欄で、条件を絞り込むことができます。

学生ID or Email指定した学生が参加しているコースのみ抽出できます。
ID、メールアドレス、me のいずれかを入力してください。
教員ID or Email指定した教員が参加しているコースのみ抽出できます。
ID、メールアドレス、me のいずれかを入力してください。
ステータス抽出するクラスのステータスを指定できます。
ACTIVE、ARCHIVED、PROVISIONED、DECLINEDのいずれかを入力してください。
(この4つを「データの入力規則」に設定しておくと便利です)
抽出件数ここで少な目の件数を指定すると、小分けにデータを取得することができます。
対象クラスが多いと、結構処理が重くなるので、必要に応じて指定してください。

おわりに

いかがでしたでしょうか。参考になれば幸いです。

次回は、クラスのステータス一括変更、クラスの一括削除について紹介したいと思います。

コメント

  1. 質問したい人 より:

    TypeError: Cannot read property ‘getRange’ of null
    と出る場合はどのように対策すれば良いですか?

  2. 生徒でも登録されている人 より:

    記事ありがとうございました。
    生徒として登録されている場合に、 course.teacherFolder.alternateLink
    の部分でエラーが発生するので、そのエラーを回避するように
    変更したものを置いておきます。

    /***********************************************
    * コース情報一覧を作成する
    ***********************************************/
    function writeListCourses() {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“コース情報”);
    const select = Browser.msgBox(“コース情報を抽出します。よろしいですか?”, Browser.Buttons.OK_CANCEL);
    if (select == “cancel”) {
    Browser.msgBox(“キャンセルしました”);
    return;
    }
    sheet.getRange(“A5:O”).clearContent();
    SpreadsheetApp.flush();
    let continueSelect = “yes”;
    let procCnt = 0;
    const optionalArgs = {};
    if ( sheet.getRange(2, 2).getValue() ){ optionalArgs.studentId = sheet.getRange(2, 2).getValue() };
    if ( sheet.getRange(2, 3).getValue() ){ optionalArgs.teacherId = sheet.getRange(2, 3).getValue() };
    if ( sheet.getRange(2, 4).getValue() ){ optionalArgs.courseStates = sheet.getRange(2, 4).getValue() };
    if ( sheet.getRange(2, 5).getValue() ){ optionalArgs.pageSize = sheet.getRange(2, 5).getValue() };

    let rowNum = 5;
    while ( continueSelect == “yes” ) {
    const response = Classroom.Courses.list(optionalArgs);
    const records = [];
    if ( response.courses ) {
    for ( const course of response.courses ){

    // エイリアスを取得
    let alias = “”;
    try {
    alias = Classroom.Courses.Aliases.list(course.id).aliases[0].alias;
    } catch(e) {
    // no alias
    }

    // ownerEmailを取得
    let ownerEmail = “”;
    try {
    ownerEmail = Classroom.UserProfiles.get(course.ownerId).emailAddress;
    } catch(e) {
    ownerEmail = e;
    }

    // 配列に格納
    records.push([
    course.id,
    course.name,
    alias,
    course.section,
    course.room,
    course.ownerId,
    ownerEmail,
    course.courseState,
    course.alternateLink,
    course.enrollmentCode,
    course.teacherGroupEmail,
    course.courseGroupEmail,
    ]);
    if(course.teacherFolder){
    records[records.length-1].push([course.teacherFolder.alternateLink]);
    }else{
    records[records.length-1].push([“”]);
    }
    records[records.length-1].push([
    course.creationTime,
    course.updateTime
    ])
    }
    } else {
    Browser.msgBox(“対象データがありませんでした。”);
    return;
    }

    // スプレッドシートにデータ出力
    sheet.getRange(rowNum, 1, records.length, records[0].length).setValues(records); // データ貼り付け
    rowNum += records.length;
    SpreadsheetApp.flush();
    if ( response.nextPageToken ) {
    optionalArgs.pageToken = response.nextPageToken;
    continueSelect = Browser.msgBox(“他にもデータがあります。引き続き抽出しますか?”, Browser.Buttons.YES_NO);
    } else {
    continueSelect = “no”;
    }
    }
    Browser.msgBox(“処理が終了しました。”);
    }

    • ichi3270 ichi3270 より:

      コメントありがとうございました!参考にさせていただきまして、記事内のソースを更新しました。

タイトルとURLをコピーしました