Apps Scriptリファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

2025年5月1日木曜日

Google Classroom API でクラスの一覧を取得したい


自分が指導・参加しているクラスの名称とIDを取得するコードを試しました


下記 Code.gs では pageSize で 100 を設定していますが

必ず 100件 返ってくるとは限らないらしいです

ここでは nextPageToken がある限り繰り返しているので

すべてのクラスが取得できるはずです




Code.gs
function listAllCourses() {
let pageToken = null;
do {
const response = Classroom.Courses.list({
pageSize: 100,
pageToken: pageToken
});
(response.courses || []).forEach(course =>
Logger.log(`名称: ${course.name} (ID: ${course.id})`)
);
pageToken = response.nextPageToken;
} while (pageToken);
}



Reference

Method: courses.students.list

2025年4月30日水曜日

Google Classroom API で課題の割り当て先を指定したい


既存の課題を個別の生徒に割り当てるために必要な情報



下記 Code.gs の課題を個別の生徒に割り当てる場合

courseId, courseWorkId, studentIds の値を自身の環境に合わせて書き換えて

modifyCourseWorkAssignees() を実行すると

studentIds に設定した生徒にだけ課題が割り当てられます




Code.gs
function modifyCourseWorkAssigneesWithPaging() {
const courseId = '699141862609'; // 対象のクラスID
const courseWorkId = '767848967890'; // 対象の課題ID

// 1) まず全生徒の userId をページングで取得
const allIds = [];
let pageToken = null;
do {
const res = Classroom.Courses.Students.list(courseId, {
pageSize: 100, // 一度に取得する最大件数(最大 1000 まで指定可)
pageToken: pageToken
});
(res.students || []).forEach(s => allIds.push(s.userId));
pageToken = res.nextPageToken;
} while (pageToken);

// 2) ここで「割り当てたい生徒」の userId を列挙
const assignStudentIds = [
'12345678901234567890',
'09876543210987654321'
];

// 3) それ以外の userId を削除リストに
const removeIds = allIds.filter(id => !assignStudentIds.includes(id));

// 4) modifyAssignees 用リクエスト
const req = {
assigneeMode: 'INDIVIDUAL_STUDENTS',
modifyIndividualStudentsOptions: {
addStudentIds: assignStudentIds,
removeStudentIds: removeIds
}
};

// 5) 実行
try {
const updated = Classroom.Courses.CourseWork.modifyAssignees(
req,
courseId,
courseWorkId
);
Logger.log('更新成功: assigneeMode=' + updated.assigneeMode);
} catch (e) {
Logger.log('更新失敗: ' + e.message);
}
}


成功すると実行ログに assigneeMode=INDIVIDUAL_STUDENTS と出力されます



Tips 1: 全員に割り当てたい


全員に割り当てたい場合は assigneeMode: 'ALL_STUDENTS' にします

function updateCourseWorkToAllStudents() {
const courseId = '699141862609';
const courseWorkId = '767848967890';

// 全員配布に切り替えるリクエストボディ
const req = {
assigneeMode: 'ALL_STUDENTS'
};

try {
const updated = Classroom.Courses.CourseWork.modifyAssignees(
req,
courseId,
courseWorkId
);
Logger.log('更新成功: assigneeMode=' + updated.assigneeMode);
} catch (e) {
Logger.log('更新失敗: ' + e.message);
}
}




Tips 2: 課題作成時に個別に割り当てたい


function createCourseWorkForIndividualStudents() {
const courseId = '699141862609';

const studentIds = [
'12345678901234567890',
'09876543210987654321'
];

const courseWork = {
title: '個別指定テスト課題',
description: '特定の生徒にだけ配布します。',
workType: 'ASSIGNMENT',
state: 'PUBLISHED',
maxPoints: 50,
assigneeMode: 'INDIVIDUAL_STUDENTS',
individualStudentsOptions: {
studentIds: studentIds
},
dueDate: { year: 2025, month: 6, day: 1 },
dueTime: { hours: 23, minutes: 59 }
};

const created = Classroom.Courses.CourseWork.create(courseWork, courseId);
Logger.log('作成成功: ID=' + created.id);
}



Tips 3: 課題作成時に全員に割り当てたい


function createCourseWorkForAllStudents() {
const courseId = '699141862609';

const courseWork = {
title: '全員配布テスト課題',
description: 'この課題はクラス全員に配布されます。',
workType: 'ASSIGNMENT',
state: 'PUBLISHED',
maxPoints: 100,
assigneeMode: 'ALL_STUDENTS',
dueDate: { year: 2025, month: 6, day: 1 },
dueTime: { hours: 23, minutes: 59 }
};

const created = Classroom.Courses.CourseWork.create(courseWork, courseId);
Logger.log('作成成功: 課題ID=' + created.id);
}


Reference

Method: courses.courseWork.modifyAssignees 


ModifyIndividualStudentsOptions


Google Classroom API でクラスの参加者の一覧(fullName, userId)を取得したい


指定したクラスに参加している生徒と教師の名前とIDの取得を試したコードです

デフォルトでは 30 人まで取得できるようです

Query parameters


それより多い場合は nextPageToken がある限り繰り返し取得するコードを以下に書きました



courseId を自身の環境に合わせて書き換えて

listAllParticipantsPaged() を実行すると

courseId で指定したクラスに参加している生徒と教師の一覧を出力できます


Code.gs
function listAllParticipantsPaged() {
const courseId = '699141862609';// 対象のクラスのcourseId
const opts = { pageSize: 30 }; // デフォルトの 30 件ずつ取得する

// 生徒
let token = null;
do {
const res = Classroom.Courses.Students.list(courseId, { ...opts, pageToken: token });
(res.students || []).forEach(s =>
Logger.log(`生徒: ${s.profile.name.fullName} ${s.userId}`)
);
token = res.nextPageToken;
} while (token);

// 先生
token = null;
do {
const res = Classroom.Courses.Teachers.list(courseId, { ...opts, pageToken: token });
(res.teachers || []).forEach(t =>
Logger.log(`先生: ${t.profile.name.fullName} ${t.userId}`)
);
token = res.nextPageToken;
} while (token);
}




Tips

生徒や教師の数がそれぞれ30人以下ならば以下のコードの方がシンプルに取得できる


Code.gs
function listAllParticipants() {
const courseId = '699141862609';
// Students
Classroom.Courses.Students.list(courseId).students?.forEach(s =>
Logger.log(`生徒: ${s.profile.name.fullName}, ID: ${s.userId}`)
);
// Teachers
Classroom.Courses.Teachers.list(courseId).teachers?.forEach(t =>
Logger.log(`先生: ${t.profile.name.fullName}, ID: ${t.userId}`)
);
}



Reference


Query parameters

Google Classroom APIの実行環境が課題の提出物を変更できるか確認したい


Classroom API で提出物に変更を加えることができるのは

その課題を作成したときと同じ OAuthクライアント(Developer Console Project)のみのようです

そのため

提出物に変更を加えるコードを記述した OAuthクライアントと

その提出物に紐づく課題を作成した OAuthクライアントが

同じかどうか確認する方法を知りたくて試しました


基本的には同じ Apps Script のプロジェクトで

課題の作成と提出物の読み書きを行えばよさそう




courseId, courseWorkId を自身の環境に合わせて書き換えて

checkDeveloperAssociation() を実行すると

ture か false が返ってくるはずですが

手元の環境では true か undefined が返ってきました


Code.gs
function checkDeveloperAssociation() {
const courseId = '699141862609';
const courseWorkId = '767848967890';

// Advanced Service で取得
const cw = Classroom.Courses.CourseWork.get(courseId, courseWorkId);

// associatedWithDeveloper が true なら「同じクライアント」で作成された課題
Logger.log('associatedWithDeveloper: ' + cw.associatedWithDeveloper);
}


true が返ってきたら同じOAuthクライアントということらしい


別の Apps Script プロジェクトで同じコードを実行すると 
undefined が返ってきたので OAuthクライアントが異なると考えられる



Tips

提出物を返却する場合は上記のコードを実行して associatedWithDeveloper が true でも
404 エラーが出ました

この場合は
UrlFetch で REST API に直接リクエストを送ることでエラーを回避できました
Google Classroom APIで提出物の返却を試してみる



Reference

生徒の回答を管理する
https://developers.google.com/workspace/classroom/guides/manage-coursework?hl=ja#manage_student_responses


関連記事



Google Classroom APIで提出物の返却を試してみる


Classroom API 経由で提出物の返却を試してみました

提出物を返却する際はコメントもつけると思いますが

提出物にプライベートコメントをつける API は用意されていないようです(2025-04-30現在)


そのためここでは API で提出物の返却のみを行う実験をしました


提出物を返却するために必要な情報



Apps Script の Serviceに Classroom API を追加する Advanced Service 経由では 404 で失敗しましたが

UrlFetch で Classroom API にリクエストを送ると成功しました

※ UrlFetch の方でも課題を作成したときと同じ Apps Script のプロジェクトで実行しないと OAuthクライアントが異なるため失敗します


UrlFetch で Classroom API にリクエストを送って成功したコード


Code.gs
function returnSubmissionUrlFetch() {
const courseId = "699141862609"; // クラスID
const courseWorkId = "776715772295"; // 課題ID
const submissionId = "Cg4I0Nr04LoWEIfD-L7NFg"; // 提出物ID
const accessToken = ScriptApp.getOAuthToken();

const url = [
'https://classroom.googleapis.com/v1',
`courses/${courseId}`,
`courseWork/${courseWorkId}`,
`studentSubmissions/${submissionId}:return`
].join('/');

const options = {
method: "post",
contentType: "application/json",
headers: {
Authorization: `Bearer ${accessToken}`
},
payload: JSON.stringify({}),
muteHttpExceptions: true
};

try {
const response = UrlFetchApp.fetch(url, options);
const responseCode = response.getResponseCode(); // ← ここでステータスコード取得!
if (responseCode === 200) {
Logger.log(`返却成功!ステータスコード: ${responseCode}`);
} else {
Logger.log(`返却失敗!ステータスコード: ${responseCode}`);
Logger.log(response.getContentText()); // エラー内容も出す
}
} catch (e) {
Logger.log('返却失敗: ' + e.message);
}
}



実行すると対象の提出物の返却が成功して 200 が返ってきました



Tips: Advanced Service 経由では 失敗した

Apps Script のサービスに Google Classroom API を追加するのが Advanced Service だと理解していますが


これを使って提出物を返却しようとして失敗したコードも共有します


Code.gs: これは404で失敗する
function returnSubmission() {
const courseId = '699141862609';
const courseWorkId = '776715772295';
const submissionId = 'Cg4I0Nr04LoWEIfD-L7NFg';

try {
const response = Classroom.Courses.CourseWork.StudentSubmissions.return(
courseId,
courseWorkId,
submissionId,
{} // 必須の空オブジェクト
);
Logger.log('返却成功!');
Logger.log(response);
} catch (e) {
Logger.log('返却エラー: ' + e.message);
}
}



実行するとエラーが発生して 404 が返ってきました


課題を作成したときと同じ Apps Script のプロジェクトで実行していても失敗しました

ちなみに
ここでは特にプロジェクトの変更はしておらず
デフォルトの GCP プロジェクトを使っています

デフォルトプロジェクトと標準プロジェクトについて

もしかしたら標準の GCP プロジェクトに切り替えると 404 が返らずに成功するのかもしれません(これは試していないので未確認)


高度な Google サービス




関連記事


Google Classroom API で特定の課題の提出物一覧を取得したい



Classroom の画面上で確認できる一覧画面は

授業 > 対象の課題をクリック > 手順を表示 > 生徒の提出物


これを API で取得してみます


提出物一覧を取得するために必要な情報



下記 Code.gs の courseId, courseWorkId を自身の環境に合わせて書き換えて

listStudentSubmissions() を実行すると

Logger.log(submission) に内部的に持っている様々な情報が出力されて

その中から「提出物ID」や「学生ID」などを抽出できます


Code.gs
function listStudentSubmissions() {
const courseId = "699141862609"; // あなたのクラスID
const courseWorkId = "767848967890"; // あなたの課題ID

try {
const submissions = Classroom.Courses.CourseWork.StudentSubmissions.list(courseId, courseWorkId);
const submissionsList = submissions.studentSubmissions;

if (!submissionsList || submissionsList.length === 0) {
Logger.log('提出物が見つかりません。');
return;
}

submissionsList.forEach(submission => {
Logger.log(submission);
Logger.log(`提出物ID: ${submission.id}`);
Logger.log(`学生ID: ${submission.userId}`);
Logger.log(`- 状態: ${submission.state}`); // NEW / TURNED_IN / RETURNED など
Logger.log(`- 提出日時: ${submission.updateTime}`);
Logger.log(`- スコア: ${submission.assignedGrade !== undefined ? submission.assignedGrade : '未採点'}`);
Logger.log('-----------------------------');
});

} catch (e) {
Logger.log('生徒提出物取得失敗: ' + e.message);
}
}



Reference

Method: courses.courseWork.studentSubmissions.list



Google Classroom API でcourseWorkの一覧(title, id)を取得したい


Classroom API で課題の読み書きをする際には courseWorkId が必要なため

その一覧を取得するコードを書きました


ここでいう「CourseWork」 は クラス > 授業 です




下記 Code.gs の courseId を自身の環境に合わせて書き換えて

listCourseWork() を実行すると

指定したクラス(courseId) で公開されている 授業(courseWork) の一覧を取得できます


Code.gs
function listCourseWork() {
const courseId = '699141862609'; // クラスIDを指定

const courseWorkList = Classroom.Courses.CourseWork.list(courseId);

if (!courseWorkList.courseWork || courseWorkList.courseWork.length === 0) {
Logger.log('このクラスには課題がありません。');
return;
}

courseWorkList.courseWork.forEach(work => {
Logger.log(`タイトル: ${work.title}, ID: ${work.id}`);
});
}



Reference

Method: courses.courseWork.list

2025年4月29日火曜日

Googleカレンダーのタイムゾーンを変更したい


ではデフォルトのカレンダーのタイムゾーンを取得しました

今回はタイムゾーンを更新するコードを試しました


Code.gs の setCalendarTimeZone() を実行すると

カレンダーの設定 > 全般 > タイムゾーン が更新されます

協定世界時が「UTC」



Code.gs
function setCalendarTimeZone() {
const calendar = CalendarApp.getDefaultCalendar();// デフォルトのカレンダー
calendar.setTimeZone('UTC');
Logger.log(CalendarApp.getTimeZone());
}


Tips


の Tips に書いたように Calendar API をサービスに追加して

下記 updatePrimaryCalendarTimeZone() を実行してもタイムゾーンを更新できます


Code.gs
function updatePrimaryCalendarTimeZone() {
try {
// primaryカレンダーの情報を取得
const calendar = Calendar.Calendars.get('primary');

// タイムゾーンを更新
calendar.timeZone = 'UTC';

// 更新リクエストを送信
const updatedCalendar = Calendar.Calendars.update(calendar, calendar.id);

Logger.log('タイムゾーン更新成功!新しいタイムゾーン: ' + updatedCalendar.timeZone);
} catch (e) {
Logger.log('タイムゾーン更新失敗: ' + e.message);
}
}



Reference

setTimeZone(timeZone) 

GoogleカレンダーのタイムゾーンはCalendarApp.getTimeZone()で取得できる


Googleカレンダー上で現在設定されているタイムゾーンを確認するには

歯車アイコン > 全般 > タイムゾーン


今回はそれを Apps Script で取得するコードです



下記 Code.gs をスクリプトエディタに書いて

getPrimaryCalendarTimeZone() を実行すると

実行ログに現在のタイムゾーンが出力されます


Code.gs
function getPrimaryCalendarTimeZone() {
try {
// primaryカレンダーの情報を取得
const timeZone = CalendarApp.getTimeZone();

Logger.log('現在のタイムゾーン: ' + timeZone);
} catch (e) {
Logger.log('タイムゾーン取得失敗: ' + e.message);
}
}





Tips

Calendar API でも以下のように取得できました

サービス > Google Calendar API を追加します


Calendar が追加されます


以下の getPrimaryCalendarTimeZone() を実行すると

上記の CalendarApp と同様にタイムゾーンがログに出力されます

Code.gs
function getPrimaryCalendarTimeZone() {
try {
// primaryカレンダーの情報を取得
const calendar = Calendar.Calendars.get('primary');
const timeZone = calendar.timeZone;

Logger.log('現在のタイムゾーン: ' + timeZone);
} catch (e) {
Logger.log('タイムゾーン取得失敗: ' + e.message);
}
}




Reference

getTimeZone() 

Latest post

Google Classroom API でクラスの一覧を取得したい

自分が指導・参加しているクラスの名称とIDを取得するコードを試しました 下記 Code.gs では pageSize で 100 を設定していますが 必ず 100件 返ってくるとは限らないらしいです https://developers.google.com/workspace/...