学生の出席を無人でとりたい!

はじめに

前回、物品管理システムをチャットGPTと一緒に制作したので今回は出席管理システムを作ってみました。過程については前回とそこまで変わらないので省略させていただきます。前回の記事は物品管理システムをChatGPTと作ってみた。です。

仕様をつめる

以下の感じで行きたいと思います。

  • Google フォームを使って学生からの出席データを受け取り、スプレッドシートに自動的に追加・整理する。
  • 学生の出席回数を自動で集計し、スプレッドシートに表示する。
  • 出席回数の集計基準が変更された場合、自動的に出席回数を再計算する。
  • Google フォームを使って学生からの出席データを受け取り、スプレッドシートに自動的に追加・整理する。
  • ダウンロードと仕様、実装


    ダウンロード

    コードはこちら

    function countAttendance() {
      var attendanceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("出席確認");
      var lastRow = attendanceSheet.getLastRow();
      var lastColumn = attendanceSheet.getLastColumn();
      var limitTimes = attendanceSheet.getRange("D2:Z2").getValues()[0];
    
      for (var i = 4; i <= lastRow; i++) {
        var attendanceCount = 0;
        for (var j = 4; j <= lastColumn; j++) {
          var studentTime = attendanceSheet.getRange(i, j).getValue();
          if (studentTime instanceof Date) {
            var limitTime = new Date(studentTime);
            limitTime.setHours(limitTimes[j - 4].getHours());
            limitTime.setMinutes(limitTimes[j - 4].getMinutes());
            if (studentTime <= limitTime) {
              attendanceCount++;
            }
          }
        }
        attendanceSheet.getRange(i, 3).setValue(attendanceCount);
      }
    }
    
    function onEdit(e) {
      var sheet = e.source.getSheetByName("出席確認");
      var editedRange = e.range;
      var editedColumn = editedRange.getColumn();
    
      // D2:Z2 の範囲内でセルが編集された場合のみ、出席回数を再計算
      if (editedRange.getRow() === 2 && editedColumn >= 4 && editedColumn <= 26) {
        countAttendance();
      }
    }
    
    function onFormSubmit(e) {
      var formResponsesSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("出席フォーム");
      var attendanceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("出席確認");
    
      // フォームから送信されたデータを取得
      var timestamp = e.values[0];
      var email = e.values[3];
      var studentId = e.values[1];
      var date = new Date(timestamp);
    
      // 日付を "月/日" 形式に変換
      var formattedDate = Utilities.formatDate(date, "JST", "M/d");
    
      // "出席確認" シートから日付の列を探す
      var dateColumn = -1;
      var lastColumn = attendanceSheet.getLastColumn();
      for (var i = 3; i <= lastColumn; i++) {
        var cellDate = attendanceSheet.getRange(3, i).getValue();
        if (cellDate instanceof Date) {
          var cellFormattedDate = Utilities.formatDate(cellDate, "JST", "M/d");
          if (cellFormattedDate === formattedDate) {
            dateColumn = i;
            break;
          }
        }
      }
    
      // 日付の列が見つからない場合、新しい列を追加する
      if (dateColumn === -1) {
        dateColumn = lastColumn + 1;
        attendanceSheet.getRange(3, dateColumn).setValue(formattedDate);
      }
    
      // 学籍番号に対応する行を探す
      var studentIdRange = attendanceSheet.getRange("A3:A" + attendanceSheet.getLastRow());
      var studentIdValues = studentIdRange.getValues();
      var studentRow = -1;
      for (var i = 0; i < studentIdValues.length; i++) {
            if (studentIdValues[i][0] === studentId) {
          studentRow = i + 3; // 0-indexed を 1-indexed に変換
          break;
        }
      }
    
      // タイムスタンプの "時:分" を入力
      if (studentRow !== -1) {
        var formattedTime = Utilities.formatDate(date, "JST", "HH:mm");
        attendanceSheet.getRange(studentRow, dateColumn).setValue(formattedTime);
      }
    
      // フォームが送信された後、出席回数を再計算する
      countAttendance();
    }
    
    // トリガーを設定
    function setUpTriggers() {
      var sheet = SpreadsheetApp.getActiveSpreadsheet();
      
      // onEdit トリガー
      ScriptApp.newTrigger("onEdit")
        .forSpreadsheet(sheet)
        .onEdit()
        .create();
    
      // onFormSubmit トリガー
      ScriptApp.newTrigger("onFormSubmit")
        .forSpreadsheet(sheet)
        .onFormSubmit()
        .create();
    }
    
    

    埋まっている部分は消して使ってみてください。

    フォーム

    フォームの内容は以下のとおりです。

  • 学籍番号
  • 氏名
  • スペースを開けずに入力(○山田花子 ×山田 花子)
  • メールアドレス
  • セットアップ

    セットアップは以下の通りです。

  • スクリプトエディタで setUpTriggers 関数の行をクリックしてカーソルを合わせます。
  • メニューで 実行 > 関数を実行 > setUpTriggers をクリックします。これにより、onEdit トリガーと onFormSubmit トリガーが設定されます。
  • トリガーが正しく設定されたことを確認するには、スクリプトエディタで 編集 > 現在のプロジェクトのトリガー をクリックし、onEdit と onFormSubmit がリストに表示されていることを確認します。
  • 最後に

    実際に動作するか確認してみてください。
    わからないことなどは、ChatGPTにコピペでコードを貼るなどして解決してみてください。