1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめてのアドベントカレンダーAdvent Calendar 2023

Day 7

スプレッドシートとGoogle Apps Scriptで作る簡易出席記録

Posted at

はじめに

こんにちは!
この記事では、小規模な習い事教室のためにスプレッドシートとGoogle Apps Script(GAS)で簡易な出席記録表を作ったときの方法を書きます。
より良い方法もあると思いますが、一例として参考になれば幸いです。

スプレッドシートの構成

  • 生徒一覧シート
  • メインシート
    • 生徒一覧から一人だけ選んで表示できる(データの入力規則とVLOOKUPを利用)
    • 後述するスクリプトを実行できるボタン(スクリプト割り当てた図形)を配置
  • 出席記録シート
  • あの人しばらく来ていないなシート(最後に書きます)

スクリプト

レッスンしたら出席記録シートに追加する関数

function LessonInput(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const mainst = ss.getSheetByName('メインシート');
  const countst = ss.getSheetByName('出席記録シート');
  const name = mainst.getRange('生徒氏名のセル').getValue();
  const id = mainst.getRange('生徒番号のセル').getValue();
  const dayTime = new Date();
  const data = [[id,name,dayTime]]
  const nextRow = countst.getLastRow() + 1;
  
  countst.getRange(nextRow,1,1,data[0].length).setValues(data);
}

あの人しばらく来ていないなシートとは

この出席記録表を使う習い事教室には、決まった曜日に来るコースのほかに、単発レッスンのプランもありました。
「あの人しばらく来ていないなシート」は、退会の連絡はないけど3ヶ月以上来ていないな…という方のリストをスクリプトで出力するためのシートです。
このシート自体は一行目だけに項目名を書いて、下記スクリプトでリストを出します。

function NoncountList(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const infost = ss.getSheetByName('生徒一覧シート');
  const countst = ss.getSheetByName('出席記録シート');
  const listst = ss.getSheetByName('あの人しばらく来ていないなシート');
  //関数実行時を基準に3ヶ月前の日付を取る
  const date = new Date();
  const limitdate = date.setMonth(date.getMonth()-3);

  //生徒一覧シートのB列に生徒番号、C列に氏名、P列に退会かどうか記載しているのでそこまで取っています
  let infoarray = infost.getRange(2,2,infost.getLastRow() - 1,16).getValues(); 
  //P列が空白なら未退会
  infoarray = infoarray.filter(array => array[14] == (''));

  //3ヶ月間の出席記録を取得
  let countarray = countst.getRange(2,1,infost.getLastRow() - 1,3).getValues();
  countarray = countarray.filter(array => Number(array[2]) >= limitdate);

  //未退会の配列から出席記録がある人を取り除く
  let resultarray = infoarray.filter((a) => {
    return countarray.findIndex((b) => a[0] === b[0]) === -1;
  });
  //番号、氏名のみにする
    resultarray = resultarray.map(array => [array[0],array[1]]);

  //あの人しばらく来ていないなシートの二行目以降に入力があればクリアする
  const list_last_row = listst.getLastRow();
  if(list_last_row > 1){
    listst.getRange(2,1, list_last_row -1,2).clearContent();
    }
  //シートに出力
  listst.getRange(2,1, resultarray.length,2).setValues(resultarray);

}

おわりに

読んでいただき、ありがとうございました!
疑問点や改善案などありましたら、コメントください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?