GmailApp.getMessagesForThreadsで成績管理を効率化!教育現場向けGAS活用術
教育現場では、学生の成績管理、出欠確認、課題の配布など、多くの業務をメールで行っています。GmailApp.getMessagesForThreadsを使えば、これらの情報をGmailから効率的に抽出し、スプレッドシートに整理することで、大幅な業務効率化が可能です。この記事では、教育現場でGmailApp.getMessagesForThreadsを活用し、成績管理を効率化するためのGAS(Google Apps Script)の実践的な方法を解説します。
GmailApp.getMessagesForThreadsとは?
GmailApp.getMessagesForThreads(threads)
は、GmailAppクラスのメソッドの一つで、指定されたスレッド(threads)内のすべてのメッセージを取得するために使用されます。threads引数には、Gmailのスレッドオブジェクトの配列を渡します。この関数は、スレッド内の各メッセージを表すGmailMessageオブジェクトの配列を返します。
基本的な使い方:
function getMessagesFromThreads(threads) {
const messages = GmailApp.getMessagesForThreads(threads);
return messages;
}
教育現場でのGmailApp.getMessagesForThreads活用例
成績管理:課題提出メールからの自動採点
学生からの課題提出メールをGmailで管理している場合、GmailApp.getMessagesForThreadsを使って、提出された課題の情報を一括で取得し、スプレッドシートに自動で記録できます。例えば、課題の提出状況、提出日時、添付ファイルなどを抽出して、成績管理に役立てることができます。
実装例:
// 特定のラベル(例:課題提出)が付いたスレッドから課題情報を抽出
function collectAssignments() {
const label = GmailApp.getUserLabelByName("課題提出");
const threads = label.getThreads();
const messagesPerThread = GmailApp.getMessagesForThreads(threads);
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("課題提出一覧");
// ヘッダー行を作成
sheet.appendRow(["学生ID", "課題名", "提出日時", "添付ファイル名"]);
for (let i = 0; i < messagesPerThread.length; i++) {
const messages = messagesPerThread[i];
for (let j = 0; j < messages.length; j++) {
const message = messages[j];
const studentId = extractStudentId(message.getSubject()); // 学生IDを件名から抽出する関数(別途実装)
const assignmentName = extractAssignmentName(message.getSubject()); // 課題名を件名から抽出する関数(別途実装)
const submissionDate = message.getDate();
const attachments = message.getAttachments();
let attachmentNames = "";
if (attachments.length > 0) {
attachmentNames = attachments.map(attachment => attachment.getName()).join(", ");
}
sheet.appendRow([studentId, assignmentName, submissionDate, attachmentNames]);
}
}
}
// 学生IDを件名から抽出する関数(例:件名が「[学生ID:12345] 課題A提出」の場合)
function extractStudentId(subject) {
const match = subject.match(/学生ID:(\d+)/);
if (match && match.length > 1) {
return match[1];
} else {
return "不明";
}
}
// 課題名を件名から抽出する関数(例:件名が「[学生ID:12345] 課題A提出」の場合)
function extractAssignmentName(subject) {
const match = subject.match(/] (.*)提出/);
if (match && match.length > 1) {
return match[1];
} else {
return "不明";
}
}
出欠管理:授業への参加確認メールの集計
授業への参加確認をメールで行っている場合、GmailApp.getMessagesForThreadsを使って、参加確認メールの情報を集計し、出席状況を自動的に記録できます。例えば、特定のキーワード(例:「参加します」)が含まれるメールを抽出し、出席者リストを作成することができます。
実装例:
// 特定のラベル(例:授業参加確認)が付いたスレッドから参加情報を抽出
function collectAttendance() {
const label = GmailApp.getUserLabelByName("授業参加確認");
const threads = label.getThreads();
const messagesPerThread = GmailApp.getMessagesForThreads(threads);
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("出席一覧");
// ヘッダー行を作成
sheet.appendRow(["学生ID", "氏名", "参加状況", "参加日時"]);
for (let i = 0; i < messagesPerThread.length; i++) {
const messages = messagesPerThread[i];
for (let j = 0; j < messages.length; j++) {
const message = messages[j];
const studentId = extractStudentId(message.getSubject()); // 学生IDを件名から抽出する関数(別途実装)
const studentName = extractStudentName(message.getBody()); // 氏名をメール本文から抽出する関数(別途実装)
const participationStatus = message.getBody().includes("参加します") ? "参加" : "欠席";
const participationDate = message.getDate();
sheet.appendRow([studentId, studentName, participationStatus, participationDate]);
}
}
}
// 学生IDを件名から抽出する関数(例:件名が「[学生ID:12345] 授業参加確認」の場合)
function extractStudentId(subject) {
const match = subject.match(/学生ID:(\d+)/);
if (match && match.length > 1) {
return match[1];
} else {
return "不明";
}
}
// 氏名をメール本文から抽出する関数(例:本文に「氏名:山田太郎」と記載されている場合)
function extractStudentName(body) {
const match = body.match(/氏名:(.*)/);
if (match && match.length > 1) {
return match[1];
} else {
return "不明";
}
}
課題配布:学生への課題配布メールの管理
学生への課題配布メールをGmailで管理している場合、GmailApp.getMessagesForThreadsを使って、配布した課題の情報を一括で取得し、スプレッドシートに記録できます。例えば、課題名、配布日時、添付ファイルなどを抽出して、課題の進捗管理に役立てることができます。
実装例:
// 特定のラベル(例:課題配布)が付いたスレッドから課題情報を抽出
function trackAssignmentDistribution() {
const label = GmailApp.getUserLabelByName("課題配布");
const threads = label.getThreads();
const messagesPerThread = GmailApp.getMessagesForThreads(threads);
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("課題配布一覧");
// ヘッダー行を作成
sheet.appendRow(["課題名", "配布日時", "添付ファイル名", "宛先メールアドレス"]);
for (let i = 0; i < messagesPerThread.length; i++) {
const messages = messagesPerThread[i];
for (let j = 0; j < messages.length; j++) {
const message = messages[j];
const assignmentName = extractAssignmentName(message.getSubject()); // 課題名を件名から抽出する関数(別途実装)
const distributionDate = message.getDate();
const attachments = message.getAttachments();
let attachmentNames = "";
if (attachments.length > 0) {
attachmentNames = attachments.map(attachment => attachment.getName()).join(", ");
}
const recipients = message.getTo();
sheet.appendRow([assignmentName, distributionDate, attachmentNames, recipients]);
}
}
}
// 課題名を件名から抽出する関数(例:件名が「[課題] 課題A」の場合)
function extractAssignmentName(subject) {
const match = subject.match(/\[課題\] (.*)/);
if (match && match.length > 1) {
return match[1];
} else {
return "不明";
}
}
よくある問題とトラブルシューティング
- スレッドが見つからない:ラベル名が正しいか、スレッドがアーカイブされていないか確認してください。
- 必要な情報が抽出できない:メールの件名や本文の形式が想定と異なっている可能性があります。抽出関数(
extractStudentId
など)を修正してください。 - 実行時間が長い:大量のメールを処理する場合、実行時間が長くなることがあります。処理対象の期間を絞る、または処理を分割するなどの対策を検討してください。
カスタマイズ方法と応用例
- 抽出条件の追加:特定のキーワードを含むメールのみを抽出するなどの条件を追加できます。
- データのエクスポート:抽出したデータをCSV形式でエクスポートしたり、他のアプリケーションと連携したりできます。
- 自動化:時間トリガーを設定して、定期的に自動でデータ収集を行うことができます。
まとめ
GmailApp.getMessagesForThreadsを活用することで、教育現場における成績管理、出欠管理、課題配布などの業務を大幅に効率化できます。この記事で紹介したコード例を参考に、ぜひGASを導入して、業務改善に取り組んでみてください。