Classroomにおいては一部の生徒にのみお知らせを流したい, という場面が結構ある。これをGUIで行うのは結構大変なので、Google classroomで特定の生徒にのみストリーム投稿を流すコンテナバインドGASをGeminiに書かせてみました。事前にサービス[+]からClassroom APIを追加しておく必要があるので注意。
function postAnnouncementToSpecificStudents() {
// ==========================================
// ▼ 設定エリア
// ==========================================
// 1. 対象のコースID (ClassroomのURL末尾の数字)
// 対象のURL
var url = "URLを入力";
// 1-1. URLの不要な部分を削除
// replaceを使って指定の文字列を空文字に置換します
var encodedString = url.replace("https://classroom.google.com/c/", "");
// 1-2. GAS専用の機能でBase64をデコードする
// Utilities.base64Decode を使い、バイト配列を文字列に変換します
var decodedBytes = Utilities.base64Decode(encodedString);
var COURSE_ID = Utilities.newBlob(decodedBytes).getDataAsString();
// 2. 投稿するメッセージ
const MESSAGE_TEXT = '対象の生徒のみなさんへのお知らせです。';
// ==========================================
// ▲ 処理実行
// ==========================================
try {
// 1. アクティブなスプレッドシートから対象者(E列が〇)のメールアドレスを取得
// ※シートのURL指定は不要になりました
const targetEmails = getTargetEmailsFromSheet_();
if (targetEmails.length === 0) {
console.log('E列に「〇」がついている対象者が見つかりませんでした。処理を終了します。');
return;
}
console.log(`スプレッドシート上の対象者数: ${targetEmails.length}名`);
// 2. メールアドレスからClassroom上の生徒ID(userId)を検索・取得
const targetStudentIds = getStudentIdsByEmails_(COURSE_ID, targetEmails);
if (targetStudentIds.length === 0) {
console.log('Classroom内で対象の生徒IDを特定できませんでした。');
return;
}
// 3. 投稿データを作成
const announcementResource = {
text: MESSAGE_TEXT,
state: 'PUBLISHED',
assigneeMode: 'INDIVIDUAL_STUDENTS', // 個別指定モード
individualStudentsOptions: {
studentIds: targetStudentIds
}
};
// 4. API経由で投稿
const response = Classroom.Courses.Announcements.create(announcementResource, COURSE_ID);
console.log('投稿が完了しました。');
console.log(`投稿ID: ${response.id}`);
console.log(`対象人数: ${targetStudentIds.length}名`);
} catch (e) {
console.error(`エラーが発生しました: ${e.message}`);
if (e.message.includes('not found')) {
console.error('ヒント: コースIDが正しいか確認してください。');
}
}
}
/**
* アクティブなスプレッドシートの1枚目のシートを読み込み、
* E列が'〇'の行のA列(メールアドレス)を返す関数
*/
function getTargetEmailsFromSheet_() {
// コンテナバインドされている現在のスプレッドシートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 一番左のシートを取得(必要に応じて getSheetByName('シート名') に変更してください)
const sheet = ss.getSheets()[0];
// データ範囲を取得
const data = sheet.getDataRange().getValues();
const emails = [];
// 1行目はヘッダーと仮定し、2行目(index 1)からループ
for (let i = 1; i < data.length; i++) {
const row = data[i];
const email = row[0]; // A列 (index 0)
const mark = row[4]; // E列 (index 4)
// E列が '〇' かつ メールアドレスがある場合
if (mark === '〇' && email) {
emails.push(email.toString().trim());
}
}
return emails;
}
/**
* コース内の全生徒を取得し、指定されたメールアドレスに一致する生徒のIDリストを返す関数
* (この関数は前回のまま変更ありません)
*/
function getStudentIdsByEmails_(courseId, targetEmails) {
let studentIds = [];
let pageToken = null;
const targetEmailSet = new Set(targetEmails.map(e => e.toLowerCase()));
do {
const response = Classroom.Courses.Students.list(courseId, {
pageToken: pageToken,
pageSize: 100
});
const students = response.students;
if (students && students.length > 0) {
students.forEach(student => {
const email = student.profile.emailAddress.toLowerCase();
if (targetEmailSet.has(email)) {
studentIds.push(student.userId);
}
});
}
pageToken = response.nextPageToken;
} while (pageToken);
return studentIds;
}
スキーに行ってきました。宿泊してのスキーは初めてだったのですが、満喫できましたけど、スネが痛くなりました。多分歩き方が良くないんだと思います。
今回はNASPAニューオータニに泊まりました。ホテル直結でスキーできるし、そんなに混んでないし、飯もうまい(ニューオータニのケーキも食べられる)ので大満足でした。
宿代は2人で49800円ほど。リフト券・夕朝食込なので、コスパもかなり良かった。
帰ってきました。というわけで振り返り。初の海外出張でした。フィリピンの先生が本当に良くしてくれたし、一緒に行った先生に本当に助けていただきました。
・ホテル
5泊しました。学校から近かったのがとにかく良かったです。シャワーのお湯が出なかったのは痛いが、気温は20度以上あったので我慢しました。飯は旨かった。なぜか1日目だけライブキッチンでオムレツがあったのですが、2日目以降はなくなってしまい食べられず仕舞いでした。
・通信
学校とホテルではWifiがありました。それ以外のところではKlookのeSIMを利用しましたポケットWifiよりも圧倒的に安くて便利でした。7日間で5GB(876円)で契約していましたが、1.5GB程度しか使いませんでした。
ただ、フィリピンは通信環境が少し不安定な感じは受けました。学校付近やタガイタイではほとんど電波が入らない箇所がありました。現地の通信手段をもっていてもどうにもならない場面には注意が必要ですね。
・英語
旅行で困ることはないだろうけど、雑談とか会議とかがこなせるレベルではなかったですね。。。もちろんいままでの3ヶ月での学習内容はA2~B1レベルですから、それはしょうがない。それ以上の内容は聞き取りはある程度できますが、咄嗟に表現は口から出てこないです。あと300時間ぐらいは勉強しないと次のレベルには達しないのではないかと思います。
↓これが本当にStarbucks??(Starbucks Reserve Hiraya, Tagaitay)
↓15日の夕飯!ドデカ肉!
UBE ココナッツドリンク、うまい
フィリピンに来ています。
もう一人の引率の先生にかなり頼ってしますが、普通に楽しいです。ただし、ホテルのシャワーはお湯が出ない。
手前はカレカレ。ピーナッツを使った甘目の煮込み料理。
奥正面がアドボ(mix)。普通のアドボはポークやチキンみたいですが、レバーと豚、チキンがまぜこぜに入っていておいしかった。
奥の右の半分写っているのが、名前忘れたけど、ココナッツが入りながらスパイシーでタイカレーに似た味でした。旨い。
ハロハロ
濃い紫色のものがUBEという芋なのですが、甘くておいしかった。
明日からフィリピンに出張してきます。生徒の国際協働研究の引率です。
英語はとにかく毎日継続することは守りました。90日で, 106時間勉強しました。
しかしながら十分ではないのは間違いないです。具体的には、B1レベルは半分ぐらいしかこなせなかったのですが、まぁ旅行英語ぐらいは大丈夫かな、ぐらいのレベルです。かといって、仕事以外の時間は(仕事の時間も)大半は英会話の勉強に費やしたので、後悔はないです。
ガンボ!
新鮮だったけど、期待したほど美味しくはなかった。
あけましておめでとうございます。
今年の目標
正直何も決まっていません。2026年度末に移転がありますが、それに向けて慌ただしくなっていくのでしょうか?
今年は教育実習が忙しくないといいのですが。。。
1月だけで2回も遠方に行く予定があります。
乗りつぶしも少しずつしていきたい。
目標は今年もアベレージ170+年間150ゲームとしておきたいと思います。