【GAS】GoogleAppsScriptを用いてClassroomに生徒を招待する方法(Invitations.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)を参考にしてみてください。
では、早速トライしていきましょう！
##招待したいクラスルームのIDを名前から取得
こちらは今自分所属しているクラスルームです。
![スクリーンショット (54).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108046/83433416-77b9-9ad9-4ae9-77e6a221cc75.png)
今回は、一番左の「生徒を招待するクラス」に招待していきたいと思います。
[GoogleAppsScript(GAS)を用いてClassroomに所属している生徒の一覧を取得する方法](https://qiita.com/coticoticotty/items/6d424482182a557a8600)の記事でも書きましたが、まずは招待したいクラスルームのIDを取得しましょう。コードはこのように書きます。詳しい解説が知りたければ、先のリンクをご参照ください。

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

  ////取得したいクラスのIDを、クラス名から取得
  var targetClassName = '生徒を招待するクラス'
  for (i = 0; i < myCourses.length; i++) {
    if (myCourses[i]['name'] === targetClassName) {//targetClassNameに一致するときのみ以下の処理を実施
      var inviteClassId = myCourses[i]['id'];
    } else {
      continue;
    }
  }
}
```
はい、これでお目当てのクラスを取得できました。[公式ドキュメント](https://developers.google.com/classroom/reference/rest/v1/courses.students)を見ると、Studentsの中にcreateメソッドがあります。最終的にこれ使ったら良さそう。ということで、まずは追加したい生徒情報のまとまったオブジェクトを作成したいと思います。どんなメソッドがいいのか分からないので、いつも通り、**「.(ドット)作戦」**を実施したいと思います！！！
`※.(ドット)作戦とは・・・どんなメソッドが用意されているのか分からない、というか公式ドキュメントを読みこなせないので、「.(ドット)」を入力したときに出る予測入力を利用して、使いたいメソッドを探す方法`

そしたら、ほらClassroomと入力したそのすぐ後に、よさげなメソッド、newStudentを発見しましたよ！
![スクリーンショット (55)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108046/f8bb7162-6fc2-e780-71d4-8bdf1a005d24.jpeg)
student情報に格納できるのは、以下の情報です。

```javascript
{
  "courseId": string,
  "userId": string,
  "profile": {
    object (UserProfile)
  },
  "studentWorkFolder": {
    object (DriveFolder)
  }
}
```
さて、、、あとはどこまで情報を足せばいいかですね。。。とりあえずメールアドレスだけで追加できないかを実験してみます。

```javascript
var addStudent = Classroom.newStudent(userId='gastrain01@gmail.com');
Classroom.Courses.Students.create(addStudent, inviteStudent);
```
はい、案の定エラーですね。addStudentを出力してみると、空のオブジェクトが出力されてしまいました。インスタンスの作り方が間違っているっぽいです。まず、何も情報を入れないstudentのインスタンスを作ります。

```javascript
var addStudent = Classroom.newStudent();
```
そして、このインスタンスに情報を入れていきたいわけですが、はい、ここでも**.(ドット)作戦**です！
![スクリーンショット (56).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108046/7e72366d-0469-1df7-b335-dffbe0c8f6e1.png)
おお、なかなかいい情報が得られましたよ！
ひとまず、userIdのみメールアドレスを入れてみます。さっきとは書き方変えてます。それで追加できないか試してみましょう。

```javascript
var addStudent = Classroom.newStudent();
addStudent.userId = 'gastrain01@gmail.com';
  
Classroom.Courses.Students.create(addStudent,inviteClassId);
```
はい、エラー出ました。う～～ん、[このあたりの記事](https://logicalerror.seesaa.net/article/476597493.html)を読むとこれで十分できそうなんだけど。。。エラーメッセージはこんな感じ。
`The caller does not have permission`
おっ、[こんな記事](https://web-breeze.net/classroom-usermod/)も見つけました！この記事によると、オーナー権限がない場合は、「追加」は出来ないみたいですね。ただ、たぶんオーナーなんですが、、、
というかあれですね。createメソッドは「追加」をするメソッドで「招待」ではないんですね。
二つの違いがよく分かっていないですが、[さっきの記事](https://web-breeze.net/classroom-usermod/)にしたがって招待するやり方で書いてみます。

```javascript
  var addStudent = Classroom.newStudent();
  addStudent.userId = '××××@gmail.com';
  addStudent.courseId = inviteClassId;
  addStudent.role = 'STUDENT';
```
この書き方がうまく格納できたので、生徒を招待してみます。

```javascript
Classroom.Courses.Students.create(addStudent);
```
はい、上手くいきませんでした。。。
改めて公式ドキュメントを見てみると、Invitationsというクラスがあることが分かりましたので、そちらのやり方でやってみます。（ただここで文句を言いたいのは、newInvitationなんて記述が公式ドキュメントには一切ないこと。勝手に名付けた.(ドット)作戦をやってみてようやく発見したのですが、、、どっかに書いといてよ～～～）

```javascript
Classroom.newInvitation();
```
上記の記述で行いたい招待が作ります。まだ情報は空っぽなので足していきましょう。[公式ドキュメント](https://developers.google.com/classroom/reference/rest/v1/invitations#CourseRole)を参照すると、invitationの中には以下の情報が格納できることが分かります。

```javascript
{
  "id": string,
  "userId": string,
  "courseId": string,
  "role": enum (CourseRole)
}
```
最後のroleがけっこう重要で、これは生徒か先生か管理者かどれかを選べます。idはクラスルーム参加後に付与されるidなのでまだ取得してないはず。userIdはメールアドレスだから分かる。そんなわけで、userIdとcourseIdとroleの3つに値を指定して、Invitationのcreateメソッドを行いたいと思います。

```javascript
var makeInvitation = Classroom.newInvitation();
var invitationData = {
  'userId': 'gastrain01@gmail.com',
  'courseId': inviteCourseId,
  'role': 'STUDENT'
}
  Classroom.Invitations.create(invitationData);
```
上記のコードを実行してみると、、、
![スクリーンショット (60)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108046/21ab98b3-ff22-70bc-b980-ed22b26e1230.jpeg)
**ついにできました！！！**
これは軽く感動ですね！！！何か詰まった時は、公式ドキュメントをしっかり読むこと＋.(ドット)作戦が大事ですね。では最後まとめます！

##まとめ-Classroomに生徒を招待する方法
招待したいクラスのIDが分かっていれば、以下の記述でOKです！

```javascript
function inviteStudent() {
  var inviteCourseId = '○○○○';// 招待したいコースのIDを入力
  var makeInvitation = Classroom.newInvitation();
  var invitationData = {
    'userId': '××××@××××',// 招待したいユーザーのメールアドレスを入力
    'courseId': inviteCourseId,//
    'role': 'STUDENT'
    };
  Classroom.Invitations.create(invitationData);
}
```
クラス名からクラスIDを取得して生徒を招待したい場合は以下のコードですね。

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

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

  var makeInvitation = Classroom.newInvitation();
  var invitationData = {
    'userId': '××××@××××',
    'courseId': inviteCourseId,// 招待したいユーザーのメールアドレスを入力
    'role': 'STUDENT'
    }
  
  Classroom.Invitations.create(invitationData);
}
```
以上、参考になれば嬉しいです。Google Classroom APIは日本語の情報が少ないため、今後も様々トライしてみた結果を記事に書いていきたいと思います！