GoogleClassroom APIを使って学校業務を効率化 入門編【Node.js】

JavaScript

※この記事にはプロモーションが含まれています。

GoogleClassroomとは何ですか?

GoogleClassroomとは

 GoogleClassroomは、教育機関向けの無料のオンライン学習管理システムです。教師はクラスの作成、課題の配布と採点、学生とのコミュニケーションをオンラインで行え、また生徒は、課題の提出、フィードバックの受け取りが可能で、他のGoogleサービスと連携することもできます。シンプルで使いやすく教育の効率化を支援します。➡ GoogleClassroom

これだけでもすばらしいシステムなのに、わざわざAPIを使う必要はあるのですか?

それでは GoogleClassroom API を使用するメリットについて解説しましょう。

GoogleClassroom API を使用するメリット

 GoogleClassroom APIは、教育機関がGoogleClassroomをより効果的に活用するための強力なツールです。このAPIを利用することで、教育活動の自動化、効率化、そして高度なカスタマイズが可能となります。

作業の効率化

 クラスの作成や課題の配布、成績の管理などの反復的な作業を自動化することで、教師や管理者の作業負担を大幅に軽減できます。

正確性の向上

 自動化されたプロセスにより、手動での入力ミスや漏れを防ぐことができます。特に大規模な教育環境では正確なデータ管理が重要です。

リアルタイムのデータアクセス

 APIを通じてリアルタイムのデータを取得できるため、学生の進捗状況や課題の提出状況を即座に把握し、迅速な対応が可能です。

柔軟な統合

 GoogleClassroom APIを利用することで、他のシステムやツールと簡単に統合でき、より高度でカスタマイズされた教育ソリューションを構築できます。例えば、LMS(学習管理システム)や成績管理システムと統合することで、教育活動をさらに効率化できます。

拡張性

 APIを利用することで、規模が大きくなるクラスやコースの管理も容易に拡張できます。特に、オンライン教育の普及に伴い、大規模な学生グループを管理する際に有用です。

APIを使用した具体例

クラスの自動作成と管理

 学期の始まりにたくさんのクラスを一括で作成し、各クラスに学生や教師を自動的に追加する。

課題の自動配布と提出管理

 特定の単元や期間ごとに課題を自動的に配布し、その提出状況を追跡・管理する。

成績管理の自動化

 クラスの成績を計算し、それをGoogleClassroomに自動的に反映させる。

GoogleClassroomは誰でもクラスを作成して運用することができるのですか?

GoogleClassroomのアカウント作成について

 GoogleClassroomは基本的に教育機関向けに設計されています。アカウントを作成するには、教育機関向けに特化したクラウドツールを提供するサービスであるGoogle Workspace for Educationのアカウントが必要で、このアカウントは通常、学校や教育機関のドメインで管理されており、基本的に学生や教師、教育機関のスタッフに提供されます。

 よって、個人のGoogleアカウントやビジネスアカウントでは、教育機関で使用しているGoogleClassroomにアクセスすることはできません。ただし、学校外での利用の場合、利用規約を遵守する限り(個人アカウント取得時に同意を求められる)において、個人アカウントや塾などでもクラスを作成し、GoogleClassroomを活用することができます。

 また、GoogleClassroom APIを利用する際の料金について、基本的にAPIのリクエスト数に制限があるもののGoogleClassroom API自体は無料で提供されています。ただし、Google Cloud Platform(GCP)のリソースを使う場合などは他の料金が発生することがあります。

それではいよいよAPIを利用したアプリケーションを構築していきますが、GoogleClassroomの利用がリアルタイム性を求められるものなので、JavaScriptの Node.js を使って構築していきます。

【AD】オンラインで学ぶ!小中学生向けプログラミング「デジタネ」

Node.jsとは

 Node.jsは、JavaScriptを使用してサーバーサイドのアプリケーションを開発するためのランタイム環境で、イベント駆動型で非同期処理を得意とし、高いパフォーマンスを提供します。特に、チャットアプリやリアルタイムのデータ処理が求められるアプリケーションに適しています。
 Node.jsは、シングルスレッドで動作しながらも、非同期I/O(非同期入力/出力)を活用することで、複数のクライアントからのリクエストを効率的に処理できます。NPMを使ったパッケージ管理も強力です。

Node.js使用環境の構築

 Node.jsをまだ使っていない方は、下記のNode.js 公式サイト よりダウンロードして、環境を準備します。

 Node.jsをインストールできているか確認します(コマンドはGit Bashを使用しています)。

$ node -v
v20.17.0

 システムにインストールされている npm(Node Package Manager)のバージョンを確認します。

$ npm -v
10.8.2

 インストールが確認できたら、最初にプロジェクトディレクトリ(ここではclass-project)を作成してディレクトリ内に移動、JavaSciprtのindex.jsファイルを作成しておきます。

package.jsonファイルの作成

 プロジェクトの依存関係、スクリプト、バージョンなどを管理を容易にするため、package.jsonファイルを作成します。

 プロジェクトディレクトリに移動、下記のコマンドを打つことによってデフォルト設定で即座にファイルを作成することができます。

$ npm init -y

作成されたファイル

{
  "name": "class-project",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": ""
}

 次からは必要なモジュールをインストールしていきます。

必要なモジュールをインストールする

$ npm install googleapis

 googleapisはGoogleが提供する公式のNode.jsクライアントライブラリで、さまざまなGoogle APIにアクセスし、操作を行うためのツールです。このライブラリは、多くのGoogleサービス(Google Classroom、Google Drive、Google Sheets、Google Calendarなど)にアクセスするための共通インターフェースを提供します。

$ npm install express

 Expressは、Node.js上で動作する軽量なウェブフレームワークで、ウェブアプリケーションやAPIの構築を簡単にします。ルーティングやミドルウェアの管理が柔軟で、少ないコードで複雑な処理を実装可能です。

 これらのインストールが完了するとpackage.jsonファイルのdependencies(依存関係)にモジュールが追加されます。

"dependencies": {
    "express": "^4.19.2",
    "googleapis": "^143.0.0"
  }

 次からはAPI 側の準備を進めていきましょう。

6ヶ月で全世界5万ユーザー&12億円売り上げAIボイスレコーダー PLAUD NOTE

GoogleClassroom APIの準備

API についておさらいしましょう!

 APIとは、Application Programming Interface(アプリケーション プログラミング インターフェース)といって、Webサービスやソフトウェアの機能を、別のWebサービスやソフトウェアから呼び出せるようにしたものです。

 以前にGoogleのAPIの別な記事を書いていますので、そちらも参考にして頂けると幸いです。

 まずGoogleClassroom API を使用するには、Google Cloud Platform (GCP)を利用するのですが、GCPとは、Googleが提供するクラウドサービスのプラットフォームで、サーバーの運用、データ保存、ビッグデータ分析、機械学習などインターネット経由でさまざまなコンピュータリソースやツールを利用することができます。また、GCPには多くのAPIがあり、これを使ってアプリケーションの機能を拡張したり、データやサービスにアクセスしたりできます。

 それではGCPの管理画面である Google Cloud Console にアクセスしてログインします。

 ログインしたらプロジェクトを選択するか、新規プロジェクトを作成して「APIとサービス」をクリックします。

 「+ APIとサービスを有効にする」をクリック!

 Google Workspaceの「すべて表示」をクリック!

「Google Classroom API 」をクリックして認証情報の作成に入ります。

認証情報の作成

 GoogleClassroom APIの認証情報の設定は、後述するOAuth 2.0の認証システムを使用していることもあり、他のAPIの設定よりも複雑な印象があります。順を追って一つ一つ確認していきましょう。

 また、GoogleClassroom APIがここまで強固なセキュリティを持つ理由は、ユーザーの個人情報や教育データの保護が極めて重要であるためです。教育関連のデータは非常に敏感で、誤用や漏洩が重大な影響を及ぼす可能性がありますので、APIアプリケーションの実装に際しては、情報漏洩には十分注意し自己責任で取り扱って下さい。

アクセスするデータの種類

 アクセスするデータの種類は、ユーザーデータとアプリケーションデータのどちらかを選択するように求められますが、今回は個人アカウントのテストアプリケーションなので、ユーザーデータの方を選択します。

ユーザーデータ
 ・教師が自分のクラスの課題を効率的に管理したりするなど、個人の作業やクラス単位での効率化を目指す場合など。

アプリケーションデータ
 ・学校全体の成績管理システムや出席状況の統計ツールなど、学校全体のデータを統合して管理したい場合など。

スコープの設定

 アプリがアクセスできるデータや操作の範囲を設定します。このスコープを設定しないとアプリが必要とするデータや機能にアクセスできません。

よく使われるGoogleClassroom API のスコープの例

クラスの全操作  用途 クラスの作成、読み取り、更新、削除
 https://www.googleapis.com/auth/classroom.courses

クラスの読み取り専用  用途 クラスの情報の読み取り専用
 https://www.googleapis.com/auth/classroom.courses.readonly

生徒リストの読み取り専用  用途 生徒や教師のリストの読み取り専用
 https://www.googleapis.com/auth/classroom.rosters.readonly

課題の全操作  用途 課題の作成、読み取り、更新、削除
 https://www.googleapis.com/auth/classroom.coursework

課題の提出物の全操作  用途 自分の課題提出物の情報を表示、更新
 https://www.googleapis.com/auth/classroom.coursework.me

授業のメンバーシップの全操作  用途 ユーザーのメールアドレス情報にアクセス
 https://www.googleapis.com/auth/classroom.profile.emails

 また、このスコープは認証情報を作成したあとに「APIとサービス」 ➡ 「OAth同意画面」 ➡ 「アプリを編集」で再度スコープを追加、または削除することができます。

OAuthクライアントIDとは

 OAuth(オーオース)は、インターネット上で安全に「他のサービスに自分の情報を渡す」ための仕組みです。たとえば、あるウェブサイトにログインする時に、そのサイトに直接パスワードを入力する代わりに、GoogleやFacebookのアカウントを使ってログインできることがあります。このとき、GoogleやFacebookがそのサイト(ここではクライアント)にあなたの情報を提供するために使われるのがOAuthです。

 そして、クライアントIDとは、OAuthを使うときに、そのクライアント(アプリやサービス)が誰なのかを識別するための「ID」です。これを使って、GoogleやFacebookなどの認証提供者(サーバー)は、「ああ、このアプリが私たちのサービス(OAuthシステム)を使っているのね」と認識します。

 つまり、クライアントIDがなければ、認証提供者(例: Google)はどのアプリが情報を要求しているのかを判断できませんので、クライアントIDは、アプリやサービスが正規のものであることを認証提供者に伝えるために必要なものなのです。

 引き続き認証情報の作成に入ります。

 アプリケーションの種類 ➡ 「ウェブ アプリケーション」を選択して、名前の欄には任意のクライアントアプリケーションの名前を設定します。


 承認済みのJavaScript生成元 HTMLフォームからGoogle Classroom APIにアクセスする場合は、必ず承認済みのJavaScript生成元を設定する必要があります。これにより、ブラウザからのAPIリクエストがGoogleによって許可されます(例 : https://yourwebsite.comなど)。


 承認済みのリダイレクトURINode.jsのみでバックエンドとしてGoogle Classroom APIを利用する場合は、通常、承認済みのJavaScript生成元の設定は不要です。これは、認証がサーバー側で行われ、ブラウザ上のクライアントから直接リクエストが送信されないためです。

 これらもまだ開発段階の場合は、http://localhost:3000 のようにローカル環境で設定しておいて、本番環境で運用するときに実際のドメイン名(例:https://yourwebsite.com)を設定するように変更することができます。

クライアントシークレット

 クライアントシークレットは、Google APIを使うアプリが正しいことを証明するための「パスワード」のようなものです。クライアントシークレットファイルには、このクライアントシークレットと、アプリを識別するためのクライアントID、リダイレクトURIなどが含まれていて、ダウンロードした際は、通常JSON形式のファイルになっています。

 このファイルはアプリがGoogleにアクセスする際に必要な機密情報であるため、外部に漏れないよう厳重に保管する必要があります。

認証情報の作成お疲れ様でした。再びNode.jsに戻って実装を再開しましょう!

オンライン講座で最先端のAI技術を学ぶ!「DMM 生成AI CAMP」

Node.jsでの実装

 まずは今まで準備したNode.js環境が正しく動作するか確認します。

 index.jsファイルに下記のコードを入力します。

console.log("Hello,Node.js!")

 ターミナルで下記のコマンドを打ち、入力したコードが表示されればOKです。

$ node index.js
Hello,Node.js!

 さらにpackage.jsonのscriptsのセクションを変更すると、実行コマンドを簡略化させることができます。ここでは start に変更。

"scripts": {
    "start": "node index.js"
  },

 次のようにコマンドを入力します。

$ npm run start

> class-project@1.0.0 start
> node index.js

Hello,Node.js!

 同じようにjsファイルを読み込こんでターミナルに表示させることが出来ました !

 次から実際のコードを作成していきます。

認証情報の設定

 まずは必要なライブラリを読み込みます。

const { google } = require('googleapis');
const express = require('express');
const path = require('path');
const fs = require('fs');

 下記のコードはクライアントシークレットファイルの絶対パスを取得して、この後のプログラムに必要な認証情報を設定していきます。また、ここではあらかじめクライアントシークレットファイルはindex.jsファイルと同じディレクトリ内に移動しておきましょう。

// クライアントシークレットファイルの絶対パスを取得
const credentialsPath = path.join(__dirname, 'client_secret.json');

// OAuth 2.0のクライアントID、クライアントシークレット、リダイレクトURLを設定
const credentials = JSON.parse(fs.readFileSync(credentialsPath));
const { client_secret, client_id, redirect_uris } = credentials.web;
const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);

 fs.readFileSyncは、対象のファイルが読み込まれるまで次の行のコードが実行されない同期的な読み込みを行います。そして、生成されたclient_secret.jsonファイルを、JSON.parseを使ってJavaScriptのオブジェクトに変換します。

 ここでの一連の処理はファイルが正しく読み込めるものとして例外処理は省略しています。

const { client_secret, client_id, redirect_uris } = credentials.web;

 次にGoogle APIの認証に必要な クライアントIDクライアントシークレット、および リダイレクトURI を、credentials オブジェクトから分割代入で取り出しています。
 もしオブジェクトの構造がわかりにくい場合は、一度 cosole.log(credentials); でターミナルに表示させてみるとわかりやすくなります。

{
  web: {
    client_id: 'your-client-id.apps.googleusercontent.com',
    project_id: 'my-classroom-project-id',
    auth_uri: 'https://accounts.google.com/o/oauth2/auth',
    token_uri: 'https://oauth2.googleapis.com/token',
    auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs',
    client_secret: 'your-client-secret',
    redirect_uris: [ 'http://localhost:3000/callback' ]
  }
}

 分割代入で取り出した認証情報をgoogleのOAuth2クラスのコンストラクタの引数に設定して、OAuth2クライアントオブジェクトを生成します。

const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);

 次はAPIにアクセスするための認証情報であるアクセストークンを取得するための認証URLをOAuth2クライアントオブジェクトのgenerateAuthUrlメソッドを使って生成します。

// 認証URLを生成
const authUrl = oAuth2Client.generateAuthUrl({
  access_type: 'offline',

  // クラス情報の読み取りスコープ
  scope: ['https://www.googleapis.com/auth/classroom.courses.readonly'],  
});

console.log('認証URL:', authUrl);

 ここで設定されているスコープは、ユーザーに対してアプリケーションが具体的にどの権限を要求しているのかを明確にして認証時に正確な権限を求めるため、明示的にプログラム上で再度指定します。

リフレッシュトークン

 access_type: ‘offline’ を指定することで、アプリケーションはアクセストークンとともにリフレッシュトークンを取得し、ユーザーが再ログインしなくても長期間にわたってファイルにアクセスし続けることができます。逆に online の場合は、アクセストークンは短期間のみ有効で、期限切れ後は再認証が必要です。

 初回認証時は、cosole.log でターミナルに表示させた認証URLCtrl+クリック することによって認証リクエストを送信してトークンを取得しますが、次回以降はこの時に取得したアクセストークンとリフレッシュトークンをjsonファイルなどにして保存して管理し、それを読み込むことによって認証を簡略化させます。

 つまり、今回はすべてのコードをひとつのファイルに記述していますが、実装する際は保守性や可読性を考慮し、ファイルを分割するなどして機能を整理する必要があります。

サーバーを立ててアクセストークンを取得する

 前のコードで express をインポートしてあるので、ポート3000localhost(デフォルト)でローカルサーバーを立ち上げます。

const app = express();
const port = 3000;

// Googleからのリダイレクトを処理するエンドポイント
app.get('/callback', async (req, res) => {
  const code = req.query.code;
 
  if (!code) {
    return res.status(400).send('Authorization code not found');
  }

  try {
    // 認証コードをトークンに交換
    const { tokens } = await oAuth2Client.getToken(code);
    oAuth2Client.setCredentials(tokens);

    // トークン取得成功後、クラス名の取得
    await listCourses(); // 認証後に呼び出す

    res.send('Google Classroomへのアクセスが許可されました');
  } catch (error) {
    res.status(500).send('トークンの取得に失敗しました: ' + error.message);
  }
});

app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
  });

 アプリケーションがGoogleに対してユーザー認証をリクエストし、ユーザーはGoogleのログインページで認証します。認証が成功するとGoogleは事前に指定したリダイレクトURL(/callback)認証コードクエリパラメータ(?code=…)として付与してリダイレクトします。
 この付与されたクエリパラメータreq.querycodeを指定してオブジェクトとして取得します。

 そして、この認証コードをアクセストークンに交換するようGoogleにリクエストし、取得したトークンをクライアントに設定して以降のリクエストに使用します。
 これにより、アプリケーションはユーザーのGoogleClassroomデータにアクセスする権限を得ることができました

// トークン取得成功後、クラス名の取得
    await listCourses(); // 認証後に呼び出す

 最後にトークンの取得が成功したタイミングでこのあと設定するクラス情報を取得する関数を実行するようコードを加えておきます。

GoogleClassroomで作成したクラス情報を取得する関数

 classroom.courses.list( )メソッドによって簡単にクラスのリストと情報を取得することができます。

// Classroom APIのクライアントを作成
const classroom = google.classroom({ version: 'v1', auth: oAuth2Client });

// クラス情報の取得関数
async function listCourses() {
    try {
      const res = await classroom.courses.list();
      const courses = res.data.courses;
      if (courses && courses.length) {
        console.log('Courses:');
        courses.forEach((course) => {
          console.log(`- ${course.name}`);
        });
      } else {
        console.log('No courses found.');
      }
    } catch (error) {
      console.error('Error listing courses:', error);
    }
}

 Google Classroom APIでは、google.classroom( )を使うことで簡単にリクエストを送信することができます。これはgoogleapisライブラリの機能であり、このgoogle.classroom( )メソッドを呼び出すことで生成されるオブジェクトここではclassroom)は、Google Classroom APIの操作に使うためのメソッドを多数含んでいます。引数には設定オブジェクトを渡しますが、authには前のコードでインスタンス化したOAuth2クライアントオブジェクトを含めます。

クラス情報を新しく作成する場合はこちら ➡ GoogleClassroom

Server is running on http://localhost:3000
Courses:
- GoogleClassroom API

 クラス名を取得することができました!

 ここではひとつのクラス、それもクラス名のみを表示させていますが、もちろん取得した res.data にはクラスのidや科目、クラス情報の更新日時やクラス全体のグループメールアドレスなど、詳細なデータが取得できていますので、目的に合わせてコードを組んで下さい。

res.dataの例

{
  "courses": [
    {
      "id": "123456789012",
      "name": "GoogleClassroom API",
      "section": "JavaScript",
      "descriptionHeading": "GoogleClassroom API JavaScript",
      "courseState": "ACTIVE",
      "alternateLink": "https://classroom.google.com/c/ABC123DEF456",
      "teacherGroupEmail": "sample_classroom_teachers@classroom.google.com",
      "courseGroupEmail": "sample_classroom_students@classroom.google.com",
      "teacherFolder": { "id": "folder123", "title": "Teacher Folder" },
      "guardiansEnabled": false,
      "calendarId": "sampleclassroom@group.calendar.google.com",
      "gradebookSettings": { "gradingPeriod": "Semester 1" }
    }
  ]
}

おわりに

 ここではクラスの情報を取得するだけでしたが、それだけでもたくさんのクラスの管理データを簡単に更新できるので一元管理するには非常に有効な手段になりますよね。
 もちろんデータが大きくなれば考慮すべきことや対策すべきこともありますが、APIを使用することによる業務効率化のイメージは掴めたかと思います。

 最後までご覧頂きありがとうございました。

【SoftBank Airキャンペーン】最大35,000円キャッシュバック!
タイトルとURLをコピーしました