GmailApp.getMessagesForThreadsで成績管理を効率化!教育現場向けGAS活用術

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を導入して、業務改善に取り組んでみてください。