Q&A
プログラミング超初心者です。
最近GASを触り始めた高校生です。
情報系の部活をしています。学校では授業や課題の提出のためにgoogle classroomを使っています。部活での研究として、「google classroomで配信された課題のうち、未提出のものをGASを用いて取得し、 提出していない人にメールやLINEなどで指定時間に通知するBotを作る」という研究目標を作りました。
ここからが主な質問内容です。
GASでgoogle classroomを操作する練習のためにこちらのサイトでいろいろ試してみようと思いましたが。何をどう書いて実行させればいいのか全くわかりません。
『REST リソース: v1.courses.courseWork』の『list』というメソッドを使ってみたいです。どのようなコードを書けば実行できるのか教えて下さい。
初歩的という域を超えているほど初歩的の質問ですが、教えてくださるとありがたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答1件
7
ベストアンサー
「GASを用いて」というのが前提であるならば、素のREST APIを使おうとするよりも、Google Apps Scriptにもとから備わっている Classroom サービスを利用した方が楽です。
https://developers.google.com/apps-script/advanced/classroom
Classroom サービスの利用開始準備
GAS で Classroom サービスを利用するには、下記のようにします。
①エディタの左側のうち、「サービス」のプラス記号をクリックします。
②次に、「Google Classroom API」を選択して、右下の「追加」ボタンをクリックします。
③次に、左側に並んでいる、歯車のアイコンをクリックし「appsscript.json」マニフェスト ファイルをエディタで表示する」にチェックを入れます。
④次に、エディタに戻り、appsscript.jsonファイルを開きます。
そして、appsscript.json に、下記に記載の 「oauthScopes」以降を追加します。
json
1{ 2 "timeZone": "Asia/Tokyo", 3 "dependencies": { 4 "enabledAdvancedServices": [ 5 { 6 "userSymbol": "Classroom", 7 "version": "v1", 8 "serviceId": "classroom" 9 } 10 ] 11 }, 12 "exceptionLogging": "STACKDRIVER", 13 "runtimeVersion": "V8", 14 "webapp": { 15 "executeAs": "USER_DEPLOYING", 16 "access": "ANYONE_ANONYMOUS" 17 }, 18 "oauthScopes": [ 19 "https://www.googleapis.com/auth/classroom.courses", 20 "https://www.googleapis.com/auth/classroom.coursework.me.readonly", 21 "https://www.googleapis.com/auth/classroom.profile.emails", 22 "https://www.googleapis.com/auth/classroom.profile.photos", 23 "https://www.googleapis.com/auth/classroom.rosters", 24 "https://www.googleapis.com/auth/classroom.coursework.me", 25 "https://www.googleapis.com/auth/classroom.coursework.me.readonly", 26 "https://www.googleapis.com/auth/classroom.coursework.students", 27 "https://www.googleapis.com/auth/classroom.coursework.students.readonly" 28 ] 29}
⑤ Ctrl+S(Macの場合はCommand+S)を押してコードを保存します。
ドキュメントの調べ方について:
Classroomサービスのヘルプ には最低限のことしか記載されていません。
Classroomサービスの各関数は、APIとほぼ1対1対応していますので、
基本的に APIのヘルプを参照し、それをClassroomサービスの各関数の呼び出しに置き換えて実行していくというステップになります。
API と サービスの記述の変換方法については、このドキュメントに書かれているとおりです。
ドキュメント本文やその他ドキュメントに付属のサンプルコードに記載の内容を総合すると
- 『REST リソース: v1.aaa.bbb』の『ccc』というメソッド に対応するGAS上の関数は、 Classroom.Aaa.Bbb.ccc() という形式になる。(先頭は全部「Classroom」で始まり、各階層のオブジェクトは先頭が大文字)
- パスパラメータ(スラッシュで区切って指定するパラメータのこと)は、各関数の引数として指定する(エディタで自動的に候補表示される)。
- クエリパラメータ(「?」以降にパラメータ名を明記して指定するパラメータのこと)は、パラメータ名をプロパティ、パラメータ値を値とするオブジェクトで定義し、関数の引数に指定する。
となっています。
これを一般化すると
js
1const クエリパラメータ = {クエリパラメータ名: パラメータの値}; 2Classroom.Aaa.Bbb.ccc(パスパラメータ, クエリパラメータ); 3
という書き方になります。
実装の例
まず、自分がアクセス可能なコース名およびコースIDは、下記のようにして取得できます。
js
1function showCourses() { 2 const courses = Classroom.Courses.list().courses; 3 courses.forEach(course => { 4 console.log(`コース名:${course.name}, ID:${course.id}`) 5 }); 6}
(これは Classroom API を扱う際のベースとなるコードですが、なぜこのようなコードになるかについては説明が冗長となるため省略します。とにかくコースIDを取得できないことには始まらないので。このコードを作るまでの調べ方は、基本的には以降に書いてある手順と同じです)
それでは、質問文に記載の「『REST リソース: v1.courses.courseWork』の『list』というメソッド」を使ったコードを、下記のように調べながら実装していきましょう。
ブラウザで、APIドキュメントの左側ガイド一覧より、course.CourseWork -> listを開きます。
ドキュメントの該当部分を見ると
・パスパラメータとして、「courseId」
・クエリパラメータとして、courseWorkStates[]、orderBy、pageSize、pageToken の4つがあることが分かります。
説明のため、例として、もうすこし具体的な要件を想定してみます。
要件:
自分がアクセスできる各コースごとに、更新時刻降順にコースワークを取得し、それぞれのタイトルと説明文を表示する。
「更新時刻降順にコースワークを取得」という処理は、ドキュメントに書いてあるクエリパラメータのうち、orderBy を使用することで実現できそうですね。
(下の図は https://developers.google.com/classroom/reference/rest/v1/courses.courseWork/list#query-parameters より引用)
したがって、第一段階のGASのコードは下記のようになります。
(※下記コードのうち、「コースID」の部分は、実在するアクセス可能なコースIDに置き換えてください)
js
1function showCourseWorks() { 2 const params = {orderBy: 'updateTime desc'}; // クエリパラメータ 3 const response = Classroom.Courses.CourseWork.list('コースID', params); // 「コースID」は、パスパラメータです。実際にはアクセス可能なコースIDに置き換えてください。 4 console.log(response) 5}
これで、正常にデータが取得できていれば、ずらずらっと表示されるはずです。
どのようなデータが入っているかに関しては、ドキュメントの「レスポンス本文」の項目にも書いてあります。
先のページのこの部分によると、レスポンス本文として
json
1{ 2 "courseWork": [ 3 { 4 object (CourseWork) 5 } 6 ], 7 "nextPageToken": string 8}
という形式のデータが返ってくることがわかります。
さらに「CourseWork」オブジェクトの中身を知りたいので、「object (CourseWork)」の青色のリンクをクリックすると、このページ にジャンプします。
これを読むと、title がコースワークのタイトル、description がコースワークの説明文に該当するらしいことがわかります。
したがって先ほどのshowCourseWorks()に、showCourses()の内容と、ループ、 title / descriptionを取得する処理を合体して、完成となります。
(※簡便のため、下記のコードは nextPageTokenを使ったページ切替を実装していません。したがってコースワークの合計数によっては、一部のコースワークしか列挙されない場合が有ります)
js
1function showCourseWorks() { 2 const courses = Classroom.Courses.list().courses; 3 courses.forEach(course => { 4 console.log(`コース名:${course.name}, コースID:${course.id}`) 5 const params = { orderBy: 'updateTime desc' }; 6 const response = Classroom.Courses.CourseWork.list(course.id, params); 7 const courseWork = response.courseWork; 8 if (!courseWork || courseWork.length === 0) { 9 console.log('コースワークがないか、有効なコースIDではありません'); 10 return; 11 } 12 courseWork.forEach(work => { 13 console.log(`タイトル:${work.title}`) 14 console.log(`説明:${work.description}`) 15 }); 16 }); 17}
基本的に全部公式ドキュメントに書かれていますし、公式ドキュメント以外にも、Classroom APIに関するサンプルコードはたくさん転がっているので、
・ドキュメントをきちんと読む
・いろいろなサイトを検索して実際にコードを書いて実行してみる
の試行錯誤を繰り返しさえすれば、質問者さんのやりたいことはできると思います。
LINE関係の実装も同じです。「ドキュメントを読む/検索して見つけたコードを実際に書いて実行してみて試行錯誤する」の横断を繰り返し。
開発/運用に関するアドバイス
先生やシステム担当者によって、生徒がGASやREST API経由でアクセスできないように制限されており、コース一覧が表示できなかったり、権限がない(PERMISSION_DENIED)等のエラーが表示される場合が有ります。
そのような場合は、Google Classroomを担当している先生もしくは学校のシステム担当者に相談して、権限を付与してもらう等の対応を行ってください。
なお、いくら「課題提出状況チェックの効率化」という大義名分があるといっても、一生徒に過ぎないあなたが全生徒の課題提出状況にアクセスできてしまうのは、情報管理の観点から問題があるかもしれません。
したがって、開発中は「自分がアクセス可能な情報へのアクセス権限」だけもらい、自分がアクセス可能なデータだけを材料に開発を行う
↓
本番稼働時は(全生徒の課題情報に対してアクセス権限を持っている)先生/システム担当の方で実行してもらう、
といった運用が考えられます。
投稿2022/04/28 10:57
編集2022/04/29 13:35総合スコア8151
関連した質問
Q&A
解決済
GASのfor文で繰り返すと1回目で時間フォーマットが合わないとエラーになる
回答2
クリップ0
更新
2023/03/28
意見交換
受付中
gasを利用した予約サイトの設計について相談です
回答3
クリップ1
更新
2023/03/27
Q&A
解決済
Googleフォーム回答後のGASでの自動返信メールを、SendGrid経由で送信したい。
回答2
クリップ1
更新
2023/03/21
Q&A
解決済
gas 埋め込みスクリプトをscriptタグに移動させたい
回答1
クリップ1
更新
2023/03/26
Q&A
受付中
【GAS】フォルダ内の全ファイルに対し処理を行う際の処理順
回答1
クリップ2
更新
2023/03/28
Q&A
受付中
GASを使ってフォームの自動返信
回答1
クリップ2
更新
2023/03/29
Q&A
解決済
GASで空白文字の削除ができない
回答2
クリップ1
更新
2023/03/14
同じタグがついた質問を見る
Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/05/06 07:59