質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

2840閲覧

GAS コード書き方

haru_

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2022/04/28 08:35

プログラミング超初心者です。

最近GASを触り始めた高校生です。
情報系の部活をしています。学校では授業や課題の提出のためにgoogle classroomを使っています。部活での研究として、「google classroomで配信された課題のうち、未提出のものをGASを用いて取得し、 提出していない人にメールやLINEなどで指定時間に通知するBotを作る」という研究目標を作りました。

ここからが主な質問内容です。
GASでgoogle classroomを操作する練習のためにこちらのサイトでいろいろ試してみようと思いましたが。何をどう書いて実行させればいいのか全くわかりません。
『REST リソース: v1.courses.courseWork』の『list』というメソッドを使ってみたいです。どのようなコードを書けば実行できるのか教えて下さい。

初歩的という域を超えているほど初歩的の質問ですが、教えてくださるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「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
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haru_

2022/05/06 07:59

返信が遅れてしまったことお詫び申し上げます。 丁寧に説明していただきありがとうございます。qnoirさんの回答を参考にコードを書いてみたらしっかり実行することができました。 ー『REST リソース: v1.aaa.bbb』の『ccc』というメソッド に対応するGAS上の関数は、 Classroom.Aaa.Bbb.ccc() という形式になる。(先頭は全部「Classroom」で始まり、各階層のオブジェクトは先頭が大文字)ー この部分が特に参考になりました。これで今後使いたいメソッドがあっても実行ができます。 画像とサイトを交えた説明とてもわかり易かったです。改めて感謝申し上げます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問