授業空き情報入りのカレンダーを作るプログラム

本教室では、授業の振替が可能です。

一年前は、授業スケジュールがスッカスカだったので振替もテキトーに対応できたのですが、何かの間違いで生徒がそこそこ集まったので、スケジュールの空きが少なくなってしまいました。

空きスケジュールを簡単に確認できる楽な方法ないかなーと思っていたら、google App scriptというgoogleのアプリケーションをプログラムでいろいろできるモノを見つけました。

そこで、カレンダーの情報を読み込んで、エクセルの授業予定表に空き情報を記入するプログラムを作ってみました。

実行動画

空き状況カレンダー自動生成プログラム

空いている時間帯が、自動的にセル内に書き込まれます。

javascriptという言語で書いています。調べながらその場のノリで書いたので、バグが残ってそうですね。

ソースコード

function class_check() {
  var input_year = Browser.inputBox("西暦を入力してください(例:2021)"); //西暦を入力させるボックスを表示
  if(input_year == "cancel"||input_year == null)
  {return;}
  var input_month = Browser.inputBox("月を入力してください(例:3)"); //月を入力させるボックスを表示
  if(input_month == "cancel"||input_month == null)
  {return;}

  var sheet = SpreadsheetApp.getActiveSheet();
  var colors = [sheet.getRange("E12").getBackground(),sheet.getRange("E13").getBackground(),sheet.getRange("E14").getBackground()]//背景の色を設定 
  sheet.getRange("E5:K10").clearContent();//もとからあるエクセルのデータを消去
  sheet.getRange("E5:K10").setBackground("white");//もとからあるエクセルの背景色を白へ


  sheet.getRange("E3").setValue(input_year+"年 "+input_month+ "月 空き状況");//カレンダーのタイトルを設定

  const CALENDAR_ID = '*************'; //カレンダーID
  const calendar = CalendarApp.getCalendarById(CALENDAR_ID);


  input_month -= 1;
  var date = new Date(input_year,input_month,1,0,0,0);
  var day = date.getDate();
  var youbi = date.getDay();
  var pos_x = 5;
  var pos_y = 5;

  var class_count = 0;
  day -= youbi;
  while(1)
  {
    date = new Date(input_year,input_month,day,0,0,0);
    if(date.getMonth() != input_month)
    {
      sheet.getRange(pos_y, pos_x).setFontColor("gray");
      sheet.getRange(pos_y, pos_x).setBackground("white");
      sheet.getRange(pos_y, pos_x).setValue(date.getMonth()+1+"/"+date.getDate());
    }
    else
    {
      sheet.getRange(pos_y, pos_x).setFontColor("black");
      sheet.getRange(pos_y, pos_x).setValue(String(date.getDate()));

      if(date.getDay() == 1 || class_count > 19)
      {sheet.getRange(pos_y, pos_x).setBackground(colors[0]);}//休み
      else if(date.getDay() == 0)
      {sheet.getRange(pos_y, pos_x).setBackground(colors[2]);}//自習
      else
      {
        sheet.getRange(pos_y, pos_x).setBackground(colors[1]);//授業あり
        const hun = [30,20,10,0];
        const zikan = [19,18,17,16];
        const maru = ["④","③","②","①"];
        for(var i=0; i<4; i++)
        {
          var check_start = new Date(date.getFullYear(),date.getMonth(),date.getDate(),zikan[i],hun[i],0);
          var check_end = new Date(date.getFullYear(),date.getMonth(),date.getDate(),zikan[i]+1,hun[i],0);
          const startTime = check_start;
          const endTime = check_end;  
          const events = calendar.getEvents(startTime,endTime);
            if(events.length == 0)
            {

              var s = sheet.getRange(pos_y, pos_x).getValue();
              s = maru[i]+String(check_start.getHours())+":"+String(check_start.getMinutes())+"~\n"+String(s);
              sheet.getRange(pos_y, pos_x).setValue(s);
            }  
        }
        class_count++;
      }
      
    } 
    pos_x ++;
    if(pos_x > 11) 
    {
      if(date.getMonth() > input_month)
      {
        break;
      }
      pos_x = 5;
      pos_y ++;  
    } 
    day ++;
  }
     
}