見出し画像

Google Classroom で生徒のストリーム投稿に対して通知(メール)を送る!

という需要があると思いまして!!👍

Google Classroom でストリームに投稿するとき、教師から行うとその通知を送る設定にしておけば、勝手に Gmail に通知が届くんですよね!

ただ、実は、生徒の投稿では通知がこないんです。

教師の投稿に対するコメントや限定公開コメントも通知は来ますが、生徒の投稿に対しては通知がこないんですよね。

そもそも、生徒による自発的な投稿は禁止をしているところが多いかもしれませんが.....。

うちの学校のクラスでは許可しています。

教科係やクラス委員からの連絡でも使えるし、そういうのはLINEでやってほしくないですし。
入ってない子もいるから。

こういったオフィシャルなことは、オフィシャルな場でやろう!!

という感じで指導しています。

ということで、今回のシステムは、

Google Classroom  で生徒のストリーム投稿に対して通知(メール)を送ることができるようになります!!!

これから、生徒の投稿を見逃すことはないですね!!!

さてさて。

使い方はこんな感じ!!

これで大事なのは、前述した通り、ストリームの一覧が記録されていくこと!

そして、リンクをつけてあるからすぐにその投稿に飛べるし。

生徒の投稿のみをメールで通知するようにしています!!!😊

今回はのクラスでは、Keisuke Ito というのが生徒として入っていて、この生徒の投稿だけを見つけ出してメールを送るようにしていて。

教師の投稿は、Google Classroom の設定で通知がくるので、このGASでは通知は送るようにしていません!!😎

いいすね👍✨

日付を入れたりしてもいいですね!!

また、一覧が残るスプシは、教師のみ閲覧権限にしておくと良いと思います!
編集権限を持っていると変更されちゃうかもしれないので🤣笑

もちろん、自分達の学校用でカスタムしたい!!!

というお話があれば、ご相談に乗りますのでご連絡ください😆

プログラムはこんな感じ!

function onOpen() {
 SpreadsheetApp
   .getActiveSpreadsheet()
   .addMenu('クラスルーム投稿', [
     {name: 'クラス一覧取得', functionName: 'classroomdata'},
     {name: '投稿記録取得', functionName: 'getCourseAnnouncement'},
     {name: '生徒一覧取得', functionName: 'getStudent'},
   ]);
}


function classroomdata(){
 var now = new Date();
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sht = ss.getSheetByName('クラスルーム一覧');
 var response = Classroom.Courses.list({});
 var courses = response.courses;
 console.log(courses);
 var course = '';
 for (i = 0; i < courses.length; i++) {
   course = courses[i];
   var folders = course.teacherFolder;
   sht.getRange(i+2, 1).setValue(course.name);
   sht.getRange(i+2, 2).setValue(course.id);
   sht.getRange(i+2, 3).setValue(course.teacherGroupEmail);
   sht.getRange(i+2, 4).setValue(course.courseGroupEmail);
   sht.getRange(i+2, 5).setValue(course.alternateLink);
   sht.getRange(i+2, 6).setValue(course.ownerId);
   sht.getRange(i+2, 7).setValue(folders.alternateLink);
   sht.getRange(i+2, 8).setValue(folders.id);
   sht.getRange(i+2, 9).setValue(folders.title);
   sht.getRange(i+2, 10).setValue(course.enrollmentCode);
   sht.getRange(i+2, 11).setValue(course.creationTime);
   sht.getRange(i+2, 12).setValue(course.calendarId);
 }
}

function getCourseAnnouncement() {//課題IDの取得
 var now = new Date(); 
 var courseId = '';//ここにクラスルームのIDを入れる
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sht = ss.getSheetByName('ストリーム一覧');
 var sht2 = ss.getSheetByName('生徒一覧');
 const lastRow = sht.getLastRow();//クラスルーム一覧の最終行取得
 const lastRow2 = sht2.getLastRow();//クラスルーム一覧の最終行取得
 let array =[];
 array = String(sht.getRange(1, 2,lastRow).getValues());//課題のIDを取得する
 console.log(array);
 try {
 var response = Classroom.Courses.Announcements.list(courseId);
   console.log(response.announcements);
 const ob = response.announcements;
 for(j = 0; j < ob.length; j++){
   var data = ob[j];
   if(array.indexOf(data['id'])===-1){
     sht.insertRowBefore(2);
     sht.getRange(2, 1).setValue(data['courseId']);
     sht.getRange(2, 2).setValue(data['id']);
     sht.getRange(2, 3).setValue(data['text']);
     sht.getRange(2, 4).setValue(data['state']);
     sht.getRange(2, 5).setValue(data['alternateLink']);
     sht.getRange(2, 6).setValue(new Date(data['creationTime']));
     sht.getRange(2, 7).setValue(new Date(data['updateTime']));
     sht.getRange(2, 8).setValue(data['assigneeMode']);
     sht.getRange(2, 9).setValue(data['creatorUserId']);
     /* for(let row = 2;row<= lastRow2; row++){. //メールを有効化したければ、/*を消して下さい。
       let studentId = sht2.getRange(row,1).getValue();
       if(studentId==data['creatorUserId']){
         let name = sht2.getRange(row,2).getValue();
         let text = data['text'];
         let alternateLink = data['alternateLink'];
         let creationTime = new Date(data['creationTime']);
         mail(name,text,alternateLink,creationTime);
       }
     } *///メールを有効化したければ、*/ を消して下さい。
   }
 }
   //console.log(data['id']);
 } catch (err) {
  Logger.log('Course with id "%s" not found', courseId);
 }
}
function mail(name,text,alternateLink,creationTime){
 let To = '';
let Options = {
 //'cc':'ここ', //ここでCCを設定、学年主任や養護教諭、複数設定したい場合は半角カンマで区切る
 //'bcc':'ここ' //ここでbccを設定、学年主任や養護教諭、複数設定したい場合は半角カンマで区切る
};
// 自動返信メール件名
let Subject = 'コメントがありました';//こちらはメールの件名
// 自動返信メール本文
let Body =
name + 'さんから投稿がありました。\n\n'+text+'\n\n詳しくはリンクから確認してください。\n'+alternateLink+'\n\n更新日時:'+creationTime;
 GmailApp.sendEmail(To, Subject, Body, Options);
 }

function getStudent() {//生徒IDの取得
 var courseId = '';
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sht = ss.getSheetByName('生徒一覧');
 var profile = '';
 var name = '';
 var fullName = '';
 var givenName = '';
 var familyName = '';
 var emailAddress = '';
 try {
 var response = Classroom.Courses.Students.list(courseId);
   console.log(response);
 const ob = response.students;
 for(var j in ob){
   var data = ob[j];
   sht.getRange(j*1+2, 1).setValue(String(data['userId']));
   profile = data['profile'];
   name = profile['name'];
   emailAddress = profile['emailAddress'];
   fullName = name['fullName'];
   givenName = name['givenName'];
   familyName = name['familyName'];
   sht.getRange(j*1+2, 2).setValue(fullName);
   sht.getRange(j*1+2, 3).setValue(familyName);
   sht.getRange(j*1+2, 4).setValue(givenName);
   sht.getRange(j*1+2, 5).setValue(emailAddress);
   console.log(data['userId']);
 }
 } catch (err) {
  Logger.log('Course with id "%s" not found', courseId);
 }
}

レクチャーしやすいように作ってあるので、

いや、これこっちも配列にした方が効率いいじゃん😅
とかは、そっと置いといてください笑

コピーも貼っておきますねー。


もちろん、各学校用にカスタムもしますので!

何なりと!😎

こちらも動画にします!
少々お待ちください!!

YouTube チャンネル

動画一覧

ポートフォリオ


何かと0から1を作るのは大変だと思います。学校はどこも似たような問題課題に対応していると思います。それなのに、先生って自分だけで頑張ろうとするんですよね。ボクの資料やnoteが1になって、学校ごとの現状に合わせてカスタムしていただければと思います‼️