LoginSignup
4
3

More than 3 years have passed since last update.

【GAS】GoogleAppsScriptを用いてClassroomでDriveの課題を配布する方法(CourseWork.create)

Last updated at Posted at 2021-02-03

こんにちは!GoogleAppsScriptを使った業務効率化に夢中の初心者プログラマー、太郎です。

今日はGoogleAppsScript(GAS)を用いてClassroomで課題を配布する方法について書いていきたいと思います。

初心者向けですが、javascriptの基本的なルールは押さえておいた方が理解はしやすいと思いますので、まだの方はProgateでサクッとjavascriptの文法を学習してみてください。

また、初心者が手当たり次第にコードを書いてみて詰まったところやその時の心の声などもつらつらと書いています。やり方のみさっと知りたい方は、最後のまとめを参照ください。

また、ReferenceError: Classroom is not definedとエラーが出てしまった方は、こちらの記事を参考にしてみてください。
では、早速トライしていきましょう!

それっぽいメソッドが2つ

公式ドキュメントには、courseWorkとcourseWorkMaterialの2つ、それっぽいクラスがあるのですが、こちらの記事では、courseWorkを使って作成されているみたいですので、まずはそのやり方を真似したいと思います。

提出する課題はGoogleドライブにある提出課題(テスト)という何でもないスライド資料とします。

ますは、公式ドキュメントより、courseworkの中身を一応見てみます。

{
  "courseId": string,
  "id": string,
  "title": string,
  "description": string,
  "materials": [
    {
      object (Material)
    }
  ],
  "state": enum (CourseWorkState),
  "alternateLink": string,
  "creationTime": string,
  "updateTime": string,
  "dueDate": {
    object (Date)
  },
  "dueTime": {
    object (TimeOfDay)
  },
  "scheduledTime": string,
  "maxPoints": number,
  "workType": enum (CourseWorkType),
  "associatedWithDeveloper": boolean,
  "assigneeMode": enum (AssigneeMode),
  "individualStudentsOptions": {
    object (IndividualStudentsOptions)
  },
  "submissionModificationMode": enum (SubmissionModificationMode),
  "creatorUserId": string,
  "topicId": string,

  // Union field details can be only one of the following:
  "assignment": {
    object (Assignment)
  },
  "multipleChoiceQuestion": {
    object (MultipleChoiceQuestion)
  }
  // End of list of possible types for union field details.
}

うん、めっちゃいっぱいあるな。。。たくさんあり過ぎて詳しく読む気があんまりしなくなってしまったので、さっきの記事を参考に作ってみたいと思います。
この記事では、配布する課題の情報として、title, description, maxPoints, dueDate, dueTime, state, workType, materialsを指定していますね。
dueDateとdueTimeはなしでも行けるような気がするので、それ以外の情報は指定して、CourseWork.createメソッドを使ってみましょう。

function createCourseWork() {
  var targetCourseId = '○○○○';//コースIDを入力

  //作成したい課題を作る
  var createAssignment = {
    title: 'テスト',
    description: 'これはテストです',
    maxPoints: 100,
    state: 'PUBLISHED',
    workType: 'ASSIGNMENT',
    materials: [{
      "driveFile": {
        "driveFile": {"id": "○○○○"}// 配布したいDriveファイルのIDを入力
      }
    }]
  };
  Classroom.Courses.CourseWork.create(createAssignment, targetCourseId);
}

これで回してみると、、、
なんと!!!ばっちり課題が配布されていました~~~!
スクリーンショット (69).png
ClassroomのAPIは上手くいかないことの方が多いから、こんなにすっと実行出来て逆に不思議という、、、笑
それでは、せっかくなので、最小どの情報まで入力すれば良いのかを調べたところ、
title, state, workType, materialsの4点を入力すれば良いことが分かりました。
ちなみに、stateを入力しないと、「下書き」となるようです。

おっ、ただ配布したファイルが閲覧のみになっている模様。。。

普段使用するときは、生徒みんなにコピーを配布することが多いので、その形で配布したいですね。
調べてみると、driveFileのプロパティにshareModeというキーがありました。これをSTUDENT_COPYと指定すればコピーを配布できそうです。
再度試してみます。

function createCourseWork() {
  var targetCourseId = '○○○○';//コースIDを入力

  //作成したい課題を作る
  var createAssignment = {
    title: 'テスト',
    description: 'これはテストです',
    maxPoints: 100,
    state: 'PUBLISHED',
    workType: 'ASSIGNMENT',
    materials: [{
      "driveFile": {
        "driveFile": {"id": "○○○○"},// 配布したいDriveファイルのIDを入力
        "shareMode": 'STUDENT_COPY'
      }
    }]
  };
  Classroom.Courses.CourseWork.create(createAssignment, targetCourseId);
}

うん、上手くいきましたね!以上、まとめます!!!

まとめ-GoogleClassroomでDriveの課題を配布する方法

コードは以下。

function createCourseWork() {
  var targetCourseId = '○○○○';//コースIDを入力

  //作成したい課題を作る
  var createAssignment = {
    title: 'テスト',
    state: 'PUBLISHED',
    workType: 'ASSIGNMENT',
    materials: [{
      "driveFile": {
        "driveFile": {"id": "○○○○"},// 配布したいDriveファイルのIDを入力
        "shareMode": 'STUDENT_COPY'
      }
    }]
  };
  Classroom.Courses.CourseWork.create(createAssignment, targetCourseId);
}

コース名からコースIDを取得するところから記述するとこんな感じになります。

function createCourseWork() {
  //所属しているクラスの一覧を配列で取得
  var myCourses = Classroom.Courses.list().courses;

  ////取得したいクラスのIDを、クラス名から取得
  var targetCourseName = '○○○○';// 課題を配布したいクラス名を入力
  for (i = 0; i < myCourses.length; i++) {
    if (myCourses[i]['name'] === targetCourseName) {//targetClassNameに一致するときのみ以下の処理を実施
      var targetCourseId = myCourses[i]['id'];
    } else {
      continue;
    }
  }

  var createAssignment = {
    title: 'テスト',
    state: 'PUBLISHED',
    workType: 'ASSIGNMENT',
    materials: [{
      "driveFile": {
        "driveFile": {"id": "○○○○"},// 配布したいDriveファイルのIDを入力
        "shareMode": 'STUDENT_COPY'
        }
      }]
  };
  Classroom.Courses.CourseWork.create(createAssignment, targetCourseId);
}

以上、参考になれば嬉しいです。Google Classroom APIは日本語の情報が少ないため、今後も様々トライしてみた結果を記事に書いていきたいと思います!

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3