見出し画像

Googleフォームを活用した欠席・遅刻・早退連絡システムを作成する(GAS使用)

Googleフォームを活用した欠席・遅刻・早退連絡について紹介します。
この記事のとおりにやってもらえれば作成できます!
※一番下に作成手順の動画もあります!

※2024.10.3
 ・アップデート等の影響だと思われますが、フォームを開けるプログラムが動かない現象が発生しているためコード修正しました。修正箇所は集計用スプレッドシートのスクリプトコード88行目です(以下参照)。

//修正前コード
//items[0].setTitle('欠席・遅刻・早退する日:' + form_targetDay);

//修正コード
items[0].asSectionHeaderItem().setTitle('欠席・遅刻・早退する日:' + form_targetDay);

※2024.1.8
 ・Google Workspace for EducationでGmailが使えない制限下でもクラスルーム等への通知ができるようにコード修正しました。
 ・Googleフォームのコピーができるようになったのでコピーリンクを追加しました。
※2022.7.22
 ・土日祝日の登校日など特殊日程に対応した新バージョンをアップしました。
 ・年度更新作業の手順を追加掲載しました。


■ 特徴

GAS(Google Apps Script)を使用しているので、以下の特徴があります。
・Googleフォーム送信時に送信者(保護者)へ確認メールを送る。
・集計結果のスプレッドシートを見やすくする。
・Googleフォームへ入力できない時間帯を設定する。
・毎日定時に集計結果のスプレッドシートURLを職員へ通知(メール or Googleチャット or Googleクラスルーム)する。

■ 作成ファイルについて

次の3つのファイルを作成します。
1 Googleフォーム ※2024.1.8 コピーリンクを追加しました
2 Googleフォームの回答と連携しているスプレッドシート
3 集計用スプレッドシート(コピー作成します)

1 Googleフォームを作成する


コピーした場合は(5)トリガー設定へすすんでください

(1)質問を作成する

質問は全く同じに作成してください(コピペ推奨)。回答については同じでなくてもかまいません。自由に設定してください。

【タイトルと説明を追加】対象日を表示する欄を作成
・1番上へ挿入する
※タイトルは何もいじらず、デフォルトでOKです。毎日自動実行する、フォームへ入力できるようにするプログラムのなかに、「欠席・遅刻・早退する日:○月○日」と設定されるプログラムが書いてありますので、これで設定します。

①タイトルと説明を追加

【1問目】氏名を設定
・質問の右側の[ラジオボタン ▼]をクリックして[記述式]を選択。
・質問の回答を必須にする → 質問欄右下の「必須」を[オン]
・質問(コピペ) → 氏名(お子さんのフルネーム)

氏名(お子さんのフルネーム)
画像2

【2問目】学年を設定
・質問の右側は[ラジオボタン ▼]のまま。
・質問の回答を必須にする → 質問欄右下の「必須」を[オン]
・質問(コピペ) → お子さんの学年

お子さんの学年
画像3

【3問目】組を設定
・質問の右側は[ラジオボタン ▼]のまま。
・質問の回答を必須にする → 質問欄右下の「必須」を[オン]
・質問(コピペ) → お子さんのクラス

お子さんのクラス
画像4

【4問目】連絡の種類を設定
・質問の右側は[ラジオボタン ▼]のまま。
・質問の回答を必須にする → 質問欄右下の「必須」を[オン]
・質問(コピペ) → 連絡の種類

連絡の種類
画像5

【5問目】主な理由を設定
・質問の右側は[ラジオボタン ▼]のまま。
・質問の回答を必須にする → 質問欄右下の「必須」を[オン]
・質問(コピペ) → 欠席・遅刻・早退の主な理由

欠席・遅刻・早退の主な理由
画像6

【6問目】体温欄を設定
・質問の右側の[ラジオボタン ▼]をクリックして[記述式]を選択。
・質問(コピペ) → 体温(発熱している場合)

体温(発熱している場合)
画像7

【7問目】受診欄を設定
・質問の右側は[ラジオボタン ▼]のまま。
・質問(コピペ) → 受診の有無

受診の有無
画像8

【8問目】備考欄を設定
・質問の右側の[ラジオボタン ▼]をクリックして[記述式]を選択。
・質問(コピペ) → 連絡事項(補足、遅刻・早退の場合の登下校予定時刻など)

連絡事項(補足、遅刻・早退の場合の登下校予定時刻など)
画像9

(2)メールアドレスを収集する設定をする

フォーム送信時に確認メールを送信するので、メールアドレスを収集します。
①設定 → ②回答 → ③「メールアドレスを収集する」→ ④「回答者からの入力」を選択。

(3)確認メッセージを編集する

・「確認メッセージ:」 → 連絡ありがとうございました。入力されたメールアドレスへ送信内容を送りましたので確認をお願いいたします。​

(4)GASを書く

Googleフォームで記述するGASはフォーム送信時に送信者(保護者)へ確認メールを送るのと、3で作成する集計用スプレッドシートへ記録するスクリプトです。

まずはスクリプトエディタを開きます。

画像31
ここへコードをコピペしてください。 ※あらかじめ記載してあるmyFunctionの部分は全て消してOKです

以下のコードをコピペしてください。
※コードの7行目にある「const ss_id」へは、3で作成する集計用スプレッドシートのIDをコピペしてください。集計用スプレッドシートのIDについては3で説明します。

//フォーム送信時実行
function submitForm(e){
 let itemResponses = e.response.getItemResponses(); //回答のオブジェクトを取得
 let name = '', nen = '', kumi = '', kind = '', reason = '', temperature = '', consultation = '', message = '';

 //*******スプレッドシートのIDを指定*******************************
 const ss_id = 'ここへスプレッドシートIDを入力してください';
 //***********************************************************

 const sh_name = '集計シート'; //スプレッドシートのシート名を指定
 const sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name);
 let last_row = sh.getLastRow();

 let targetday = sh.getRange(1,14).getValue();
 targetday = Utilities.formatDate(targetday, 'JST', 'yyyy/MM/dd');//今日の日付
 //回答内容を取得
 for (let i = 0; i < itemResponses.length; i++) {
   let itemResponse = itemResponses[i];
   let question = itemResponse.getItem().getTitle();
   let answer = itemResponse.getResponse();
   
   // String形式で取得できる質問
   if (question == '氏名(お子さんのフルネーム)'){
     name = answer;
   }
   if (question == 'お子さんの学年'){
     nen = answer;
   }
   if (question == 'お子さんのクラス'){
     kumi = answer;
   }
   if (question == '連絡の種類'){
     kind = answer;
   }
   if (question == '欠席・遅刻・早退の主な理由'){
     reason = answer;
   }
   if (question == '体温(発熱している場合)'){
     temperature = answer;
   }
   if (question == '受診の有無'){
     consultation = answer;
   }
   if (question == '連絡事項(補足、遅刻・早退の場合の登下校予定時刻など)'){
     message = answer;
   }
 }

 let date = new Date(); //現在日時のDateオブジェクトを作る
 let timeStamp = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd HH:mm:ss');//今日の日付
 let email = e.response.getRespondentEmail();
 
 // 自動返信メール件名
 const subject = '欠席・遅刻・早退の連絡への送信を受け付けました';
     
 // 自動返信メール本文
 const body = name + ' 保護者 様\n' +
   '\n' +
   '以下の内容で受け付けましたので\n' +
   '確認をよろしくお願いします。\n' +
   '連絡や状況把握のため、保護者様に\n' +
   '連絡を入れる場合がありますので\n' +
   'ご了承ください。\n' + 
   '\n' +
   '─────────────────────────\n' +
   'ご送信内容の確認\n' +
   '─────────────────────────\n' +
   '\n' +
   '【メールアドレス】\n' +
   email + '\n' + 
   '\n' +
   '【欠席・遅刻・早退をする日】\n' +
   targetday + '\n' + 
   '\n' +
   '【氏名(お子さんのフルネーム)】\n' +
   name + '\n' + 
   '\n' +
   '【お子さんの学年】\n' +
   nen + '\n' + 
   '\n' +
   '【お子さんのクラス】\n' +
   kumi + '\n' + 
   '\n' +
   '【連絡の種類】\n' +
   kind + '\n' + 
   '\n' +
   '【欠席・遅刻・早退の主な理由】\n' +
   reason + '\n' + 
   '\n' +
   '【体温(発熱している場合)】\n' +
   temperature + '\n' + 
   '\n' +
   '【受診の有無】\n' +
   consultation + '\n' + 
   '\n' +
   '【連絡事項(補足、遅刻・早退の場合の登下校予定時刻など)】\n' +
   message;
 
 // メール送信は最後に実行

 let msg = "";
 //ドキュメントロックを使用する(同時受信回避のため)
 let lock = LockService.getDocumentLock();
 //30秒間のロックを取得
 try {
 //ロックを実施する
 lock.waitLock(30000);
 //メインルーチン

 sh.getRange(last_row + 1, 1).setValue(targetday);
 sh.getRange(last_row + 1, 1).setNumberFormat('M/d')
 sh.getRange(last_row + 1, 2).setValue(nen);
 sh.getRange(last_row + 1, 3).setValue(kumi);
 sh.getRange(last_row + 1, 4).setValue(name);
 sh.getRange(last_row + 1, 5).setValue(kind);
 sh.getRange(last_row + 1, 6).setValue(reason);
 sh.getRange(last_row + 1, 7).setValue(temperature);
 sh.getRange(last_row + 1, 8).setValue(consultation);
 sh.getRange(last_row + 1, 9).setValue(message);
 sh.getRange(last_row + 1, 10).setValue(email);
 sh.getRange(last_row + 1, 11).setValue(timeStamp);//タイムスタンプ

 //背景色
 const color = "#FFFF00";
 
 let range = sh.getRange(last_row + 1,1,1,11);
 range.setFontWeight("bold"); //文字を太くする
 range.setBackground(color); //背景

 //日付>年>組の順に並び替え
 sh.getRange(2, 1, last_row, 11).sort(3);
 sh.getRange(2, 1, last_row, 11).sort(2);
 sh.getRange(2, 1, last_row, 11).sort({column: 1, ascending: false});
 //メッセージを格納
 msg = "無事に処理完了";
 } catch (e) {
 //ロック取得できなかった時の処理等を記述する
 var checkword = "ロックのタイムアウト: 別のプロセスがロックを保持している時間が長すぎました。";
 //通常のエラーとロックエラーを区別する
 if(e.message == checkword){
 //ロックエラーの場合
 msg = "別の処理が終わらずロックタイムアウトになってしまいました。";
 }else{
 //ソレ以外のエラーの場合
 msg = e.message;
 }    
 } finally {
 //ロックを開放する
 lock.releaseLock();
 //メッセージを表示する
 Logger.log(msg);
 }

  // メール送信
 MailApp.sendEmail({
   to: email,
   subject: subject,
   body: body
 });
}

コピペ後はこんな感じです↓

コードをコピペ

(5)トリガーを設定する

画像の手順に従って設定してください。

Googleフォームの作成は以上となります。

2 Googleフォームの回答と連携しているスプレッドシートを作成する

画像の手順に従ってスプレッドシートを作成してください。

①回答をクリック
Googleフォームと紐づいたスプレッドシートが作成されます

3 集計用スプレッドシートをコピーする

2022.7.22 特殊日程(土日祝日の登校日など)に対応した新バージョンをアップしました。

新バージョン 2022.7.22


スプレッドシートコピーボタン
旧バージョン

(1)シートは「集計シート」と「通知名簿」の2つ

【集計シート】Googleフォームから送信された連絡を集計するシート。職員が連絡を確認するシートです。

名称未設定のデザイン

【通知名簿】メールで通知する名簿、長期休業中(夏休み・冬休み・年度末の停止期間)の設定、管理者の設定をするシートです。
※「土日祝日の登校日」や「振替日(平日のお休み)」などの特殊日程の設定欄を追加しました(2022.7.22)。

(2)GASへ必要事項を入力する

コピーした集計用スプレッドシートにはすでにGASが記述されていますので、必要事項について入力をしてください。

まずはスクリプトエディタを開きます。

①拡張機能をクリック
1~54行目までの グローバル変数を 設定する

1カ所目(必須)
→ 5行目のurl_myformへGoogleフォームの編集用URLを入力する

編集用のフォームへアクセスする

2カ所目(必須)
→ 33行目あたりのurl_fmSSへフォーム回答用スプレッドシートのURLを入力する

url_fmSS ※editまでのURLをコピペしてください

3カ所目
→ 50行目あたりのclassIDへGoogle classroom IDを入力する(クラスルームへ通知しない場合は空欄のままにする)
※クラスルームへ通知しない場合は読み飛ばしてください。

Google Classroom APIを使用できるようにします。

ライブラリからGoogle Classroom APIを 追加してください

次に、クラスルームIDを調べるスクリプトを実行して通知したいクラスルームのIDを取得してください。

画像26

(3)トリガーを3つ設定する

①トリガーをクリック

【1つ目】setCloseTrigger:「欠席・遅刻・早退連絡フォーム」への投稿を締め切るプログラム(closeFormAcceptance)が指定の時刻(デフォルトでは8:00)に実行されるようにセットするプログラムです。
※このトリガーはopenFormAcceptance実行時刻(デフォルトでは16:00)よりも後、closeFormAcceptance実行時刻(デフォルトでは8:00)よりも前に設定してください。画像だと午前3時~4時で設定しています。

画像29

【2つ目】setOpenTrigger:「欠席・遅刻・早退連絡フォーム」へ投稿できるようにするプログラム(openFormAcceptance)が指定の時刻(デフォルトでは16:00)に実行されるようにセットするプログラムです。
※このトリガーはcloseFormAcceptance実行時刻(デフォルトでは8:00)よりも後、openFormAcceptance実行時刻(デフォルトでは16:00)よりも前に設定してください。画像だと午後2時~3時(14:00~15:00)で設定しています。
※setOpenTriggerのプログラムの中に集計シートの背景をリセットするプログラムがあるため、できるだけopenFormAcceptance実行時刻の直前にトリガー設定してください。

名称未設定のデザイン

【3つ目】setScheduledTrigger:本日の連絡を確認用に、集計用スプレッドシートのURLを定時に職員へ通知するプログラム(scheduledAggregation)がcloseFormAcceptance実行時刻(デフォルトでは8:00)の5分後に実行されるようにセットするプログラムです。
※scheduledAggregationには年度末に集計用スプレッドシートの通知名簿更新のお知らせメールを送るプログラム、Googleフォームと紐付いたスプレッドシート(欠席・遅刻・早退の連絡(回答))へ登録された情報と照合する機能もプログラムされています。

画像30


(4)集計用スプレッドシートのIDについて

「1 Googleフォームを作成する」→「(4)GASを書く」の「const ss_id」へコピペしてください。

スプレッドシートID

【運用開始時の注意事項】

「1 Googleフォームを作成する→(1)質問を作成する」で最初に作成した対象日の欄へ「欠席・遅刻・早退する日:○月○日」という値をセットする必要があります。トリガー設定したsetOpenTriggerの中でセットされるopenFormAcceptanceが実行されることで「欠席・遅刻・早退する日:○月○日」という値が設定されます。デフォルトだとopenFormAcceptanceの実行時刻は前日16:00なので、運用開始日の前日16:00以降にGoogleフォームへアクセスして日付がセットされているか確認してください。
※Googleカレンダーへ一度もアクセスしたことが無い場合は一度アクセスしてください。Googleカレンダーへ一度もアクセスしたことが無い場合、setOpenTrigger実行時にエラーになってしまいます。

【年度更新について(2022.7.22追記)】

更新作業は大きく分けて次の4点です
(1)旧年度の「Googleフォームの回答と連携しているスプレッドシートとGoogleフォーム」のリンクを解除し、すべての回答を削除する
(2)新年度用に「Googleフォームの回答と連携しているスプレッドシート」を新規作成する
(3)集計用スプレッドシートのGASプログラム33行目あたりのurl_fmSSを更新する
(4)集計用スプレッドシートの「通知名簿」シートの情報更新

(1)旧年度の「Googleフォームの回答と連携しているスプレッドシート」とGoogleフォームのリンクを解除し、すべての回答を削除する

※リンクを解除した旧年度情報が入ったスプレッドシートは別の場所へ保存することをお勧めします。次の(2)で作成する新年度のスプレッドシートと同じ場所にあるとわかりにくくなるため。

(2)新年度用に「Googleフォームの回答と連携しているスプレッドシート」を新規作成する

(3)集計用スプレッドシートのGASプログラム33行目あたりのurl_fmSSを(2)で作成したフォーム回答用スプレッドシートのURL情報へ更新する

この記事の「3 集計用スプレッドシートをコピーする」→「(2)GASへ必要事項を入力する」→「2カ所目(必須)」参照

(4)集計用スプレッドシートの「通知名簿」シートの情報更新

新年度のメンバー登録や長期休業期間、特殊日程などの設定を更新してください。

以上でGoogleフォームを活用した欠席・遅刻・早退連絡システム作成の説明を終わります、お疲れ様でした。
朝の欠席の電話連絡が減ることで先生たちの負担感を少しでも減らせられれば幸いです。

保護者あて通知のひな形も掲載しておきます(googleドキュメント)

ドキュメントコピーボタン


※2022.1.3 実際の作成手順を動画にしました。是非ためしてください!



いいなと思ったら応援しよう!