見出し画像

#126 課題の提出期限を変更する → 現状ではできない

以下のような感じでコメントをいただきました。

課題は最初に「期限なし」で登録した後,定期考査の日程が発表されてから,考査実施日に手動で一つ一つ変更しています。約50個の課題を変更するとマウスをクリックする指がつりそうになります。GASで一括変更は可能でしょうか。クラスの課題一覧をスプシに書き出して,期限を変更した課題だけ一括変更するといったイメージです。

いただいたコメントを抜粋・要約

要するに Google Classroom で作成した課題に、GAS で提出期限を設定できるか?ということです。

今回も記事タイトルにも書いていますが、実現できませんでした。同じことで悩む人の手助けになるように、確認できた内容については、以降にまとめておきます。 ※どのように実現できなかったのかが気になる方は、以下もご覧ください。

実現可能なのか?

①使用する API

以下 URL で公開されている API のリファレンスを確認すると…

以下の API を利用すれば、課題の提出期限である dueDate と dueTime を変更できるように見受けられました。

当該クラスの「教師」であれば、更新できるような感じ?

実際にプログラムを作成してみると、Classroom.Courses.CourseWork.patch() に対して、下図のような説明が表示されました。

当該メソッドに対する説明(1/2)

patch(resource: Classroom_v1.Classroom.V1.Schema.CourseWork, courseId: string, id: string): Classroom_v1.Classroom.V1.Schema.CourseWork
-----
Updates one or more fields of a course work. See google.classroom.v1.CourseWork for details of which fields may be updated and who may change them. This request must be made by the Developer Console project of the OAuth client ID used to create the corresponding course work item. This method returns the following error codes: * PERMISSION_DENIED if the requesting developer project did not create the corresponding course work, if the user is not permitted to make the requested modification to the student submission, or for access errors. * INVALID_ARGUMENT if the request is malformed. * FAILED_PRECONDITION if the requested course work has already been deleted. * NOT_FOUND if the requested course or course work does not exist.

当該メソッドに対する説明(1/2)

patch(resource: Classroom_v1.Classroom.V1.Schema.CourseWork, courseId: string, id: string, optionalArgs: Object): Classroom_v1.Classroom.V1.Schema.CourseWork
-----
Updates one or more fields of a course work. See google.classroom.v1.CourseWork for details of which fields may be updated and who may change them. This request must be made by the Developer Console project of the OAuth client ID used to create the corresponding course work item. This method returns the following error codes: * PERMISSION_DENIED if the requesting developer project did not create the corresponding course work, if the user is not permitted to make the requested modification to the student submission, or for access errors. * INVALID_ARGUMENT if the request is malformed. * FAILED_PRECONDITION if the requested course work has already been deleted. * NOT_FOUND if the requested course or course work does not exist.

当該メソッドに対する説明(2/2)

②引数は 3つ? 4つ?

英語での説明文は置いといて… 引数が 3つの場合と 4つの場合があるようです。

  1. resource: Classroom_v1.Classroom.V1.Schema.CourseWork
    → 更新する内容

  2. courseId: string
    → コースの識別子

  3. id: string
    → コースの課題の識別子

  4. optionalArgs: Object
    → クエリ パラメータ

しかしながら、引数が 3つで API を呼び出すと、以下のように updateMask が必要、といったエラーになってしまいます。

GoogleJsonResponseException: API call to classroom.courses.courseWork.patch failed with error: updateMask: Update mask is required
updateMask が必要、とエラーになる

ということで、作成した API の呼び出し部分が以下のような感じ。更新する dueDate と dueTime は、適切な形式で用意して setDate と setTime に設定してあります。

API の呼び出し部分

③過去の日付は設定できない?

この状態で実行すると、以下のようなエラーになってしまいました。

GoogleJsonResponseException: API call to classroom.courses.courseWork.patch failed with error: dueDate: Due date must be in the future
更新する日付は未来でなければならない、とエラーになる

冒頭の寄せられたコメントの内容からも、何となく既に過ぎている過去の日付を設定しようとしたのですが、API の仕様上、設定できるのは未来の日付でなければならないようです。

  • Google Classroom の UI では、過去の日付でも設定できるのですが、API で設定する場合には、未来の日時(現在よりも後)でなければ設定できないようです。

④未来の日付でも設定できない?

前述のように、設定する日付に不備があるとエラーになっていたので、未来の日付を指定したところ、違うエラーが発生しました。

GoogleJsonResponseException: API call to classroom.courses.courseWork.patch failed with error: @ProjectPermissionDenied The Developer Console project is not permitted to make this request.
権限が不足しているようでエラーになってしまう

GoogleJsonResponseException: classroom.courses.courseWork.patch への API コールに失敗しました: ProjectPermissionDenied Developer Console プロジェクトは、このリクエストを許可されていません。

エラーメッセージを日本語に翻訳

エラーメッセージを翻訳すると、上記のような感じで、この API のリクエストが許可されていないような感じのメッセージとなっています。
前項③で過去の日付で API を呼び出したときには「与えられた日付が悪い」と返していたのに、適切な日付を渡したら「リクエストが許可されていません」とは…😖

この ProjectPermissionDenied というエラーメッセージを、Classroom API のリファレンスで確認すると、

ProjectPermissionDenied の説明

と説明されている。

⑤API Explorer でも駄目

リファレンスページから利用できる API Explorer で同じ動作を試してみたけれど、下図のように Googleスプレッドシートにバインドされた GAS のプログラムから実行したときと同様に結果になります。

API Explorer でも結果は同じ

下部中央に表示されているように、

This error may be due to using an insufficient credential type. Try using OAuth 2.0.

下部中央に表示されているエラーメッセージ

メッセージでは「OAuth 2.0 を使ってみて」と説明されているけれど、API Explorer は下図のように OAuth 2.0 での認証は行っているはずで…

OAuth 2.0 を使用して、API Explorer を実行しているのに…

画面右下に表示されているエラーメッセージは、以下のような感じで GAS で表示されていたものと同様の内容です。やはり、Developer Console project 経由で利用しないといけないみたい…

HTTP/1.1 403 
cache-control: private
content-encoding: gzip
content-length: 163
content-type: application/json; charset=UTF-8
date: Wed, 16 Oct 2024 14:09:42 GMT
server: ESF
vary: Origin, X-Origin, Referer

{
  "error": {
    "code": 403,
    "message": "@ProjectPermissionDenied The Developer Console project is not permitted to make this request.",
    "status": "PERMISSION_DENIED"
  }
}

試行錯誤してみたけれど… GCP

前項の ① ~ ⑤ のような感じで、API の呼び出し方法は間違っていないような感じなのですが、Googleスプレッドシートにバインドされた GAS のプログラムから、単純に呼び出しても利用できないような感じです。

前述の ④ で ProjectPermissionDenied の説明のところで、下図のように「OAuth クライアント ID」の部分にリンクが設定されており、

前出の説明中のリンクをクリックすると…

このリンクをクリックすると以下のページに遷移します。 ※この記事を書いている時点では、日本語でのページは用意されていないようです。

ページのタイトルに説明されているように、この先は GCP(Google Cloud Platform)が利用できる環境でなければ利用できないもののようです。

GCP を利用したプログラムにもチャレンジしてみたいとは思うものの、GCP が利用できる環境でなければ利用できないプログラムになってしまうと、手軽に共有・実行できなくなってしまうので、ここで断念することにしました。

Classroom API は、リファレンスページ内の ↓ で説明されているように、プレビュープログラムが行われていたりもするので、今後の更新によっては前述の事象が変わってくるのかもしれません。その辺りに期待して、この記事は一旦ペンディングとします…


いいなと思ったら応援しよう!