はじめに
前回、物品管理システムをチャットGPTと一緒に制作したので今回は出席管理システムを作ってみました。過程については前回とそこまで変わらないので省略させていただきます。前回の記事は物品管理システムをChatGPTと作ってみた。です。
仕様をつめる
以下の感じで行きたいと思います。
ダウンロードと仕様、実装
コードはこちら
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(); }
埋まっている部分は消して使ってみてください。
フォーム
フォームの内容は以下のとおりです。
セットアップ
セットアップは以下の通りです。
最後に
実際に動作するか確認してみてください。
わからないことなどは、ChatGPTにコピペでコードを貼るなどして解決してみてください。