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

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

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

初心者向けですが、javascriptの基本的なルールは押さえておいた方が理解はしやすいと思いますので、まだの方は[Progate](https://prog-8.com/dashboard)でサクッとjavascriptの文法を学習してみてください。

また、初心者が手当たり次第にコードを書いてみて詰まったところやその時の心の声などもつらつらと書いています。やり方のみさっと知りたい方は、最後の[まとめ](#まとめ-classroomに生徒を招待する方法)を参照ください。

また、`ReferenceError: Classroom is not defined`とエラーが出てしまった方は、[こちらの記事](https://qiita.com/coticoticotty/items/fd73cf477140349b2809)を参考にしてみてください。
では、早速トライしていきましょう！
##それっぽいメソッドが2つ
[公式ドキュメント](https://developers.google.com/classroom/reference/rest)には、courseWorkとcourseWorkMaterialの2つ、それっぽいクラスがあるのですが、[こちらの記事](https://web-breeze.net/classroom-coursework-create/)では、`courseWork`を使って作成されているみたいですので、まずはそのやり方を真似したいと思います。

提出する課題はGoogleドライブにある[提出課題(テスト)](https://docs.google.com/presentation/d/1nwJN_kUypVZgBFSDVYdjDBDkYAfcUnZAOpn8K9foTF4/edit#slide=id.p)という何でもないスライド資料とします。

ますは、[公式ドキュメント](https://developers.google.com/classroom/reference/rest/v1/courses.courseWork)より、courseworkの中身を一応見てみます。

```javascript
{
  "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.
}
```
うん、めっちゃいっぱいあるな。。。たくさんあり過ぎて詳しく読む気があんまりしなくなってしまったので、[さっきの記事](https://web-breeze.net/classroom-coursework-create/)を参考に作ってみたいと思います。
この記事では、配布する課題の情報として、title, description, maxPoints, dueDate,　dueTime, state, workType, materialsを指定していますね。
dueDateとdueTimeはなしでも行けるような気がするので、それ以外の情報は指定して、CourseWork.createメソッドを使ってみましょう。

```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108046/0a80d9eb-67e6-72fa-bb53-a5b746369c4d.png)
ClassroomのAPIは上手くいかないことの方が多いから、こんなにすっと実行出来て逆に不思議という、、、笑
それでは、せっかくなので、最小どの情報まで入力すれば良いのかを調べたところ、
`title, state, workType, materials`の4点を入力すれば良いことが分かりました。
ちなみに、stateを入力しないと、「下書き」となるようです。

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

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

```javascript
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の課題を配布する方法
コードは以下。

```javascript
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を取得するところから記述するとこんな感じになります。

```javascript
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は日本語の情報が少ないため、今後も様々トライしてみた結果を記事に書いていきたいと思います！