【GAS】スプレッドシートでランダムな座席表を作成する(優先席付き)

席替えで使う座席表を自動化で作成する!

はじめに

学校をはじめ、「座席」というものは色々な場面で出てきます。

座席表を考えることって、席替えの前との被りや公平性、視力など、色々と考えていくと、意外とめんどうな場合が多いですよね!

今回は、こんな課題を解決するツールを作成いたしました!

「この生徒は一番前の席」、「この生徒は一番後ろの席」といった要望にも応えつつ、ランダムに座席を組み上げることができますので、ぜひご利用ください!!

準備

今回は次の準備をしてください。

  • 使うブラウザはGoogle Chrome
  • Google アカウントを作成
  • ネットサーフィンができるPC

スプレッドシートのダウンロード

今回、私が作成したプログラムが入っているスプレッドシートをダウンロードしていただきます!!

ボタンをクリックすると、『コピーを作成』という項目があると思いますので、そちらをクリックしてください!!

席替えシート説明

コピーしたスプレッドシートを開くと、「生徒氏名」、「フリガナ」、「優先度」の3つの要素があるかと思います。これらについて説明をしていきます。

生徒氏名

生徒の氏名を漢字などの正式な形で入力します。

フリガナ

「生徒氏名」に記載した氏名のフリガナを記入します。

優先度

座席などで一番前にしたい生徒や、後ろの方にしたい生徒をしてできます。

選択式ですので、▼から選んでください。

席替えシートの使い方

データの入力

各セルにデータを入力してください。

例として私は上画像のようなデータを入力してみます。

プログラムの承認

データの入力が完了した方は、左上の「作成」ボタンをクリックしてください。

続いて表示される「認証が必要」から「続行」ボタンを押して認証を完了してください。

ここでの認証手順についてはこちらの記事をご覧ください。

関連記事

GASを実行しようとしてこんな画面が表示されたことありませんか? 今回はこの対処法についてお伝えしたいと思います。 Googleアカウントでの認証 Googleアカウントを用いた認証を行う際にアカウントの選択を行います。 […]

プログラムの実行

プログラムの承認が完了したら、続いてプログラムの実行です。

再度、「作成」ボタンを押してください。

「座席表を作成しました。」と表示がされるまで待機し、表示されたら「OK」ボタンを押します。

画面下部に「作成日:〇〇」のようなシートが新しくできていますので、それをクリックして確認してください。

座席が優先度を考慮してランダムで作成されています。

画像では優先度を指定した箇所をマークしてあります。

PDFのダウンロード

続いて作成した座席表をPDFとしてダウンロードしてみます。

画面左上の「ファイル」をクリックしてください。

続いて、「ダウンロード」にカーソルを合わせて、「PDFドキュメント(.pdf)」をクリックしてください。

画面右側のメニューから「印刷形式」をクリックして、PDFの設定を変更します。

表示されるものの中から「水平」と「垂直」を両方とも「中央」にします。

設定が完了したら、「エクスポート」をクリックしてPDFファイルをダウンロードします。

画面左下に「PDFをダウンロードしています」と表示されれば完了です。

終わりに

今回はGASを使って完全にランダムながらも、ある程度の優先を聞かせた座席表の作成ツールを紹介しました。

日々の業務の中でも、少しずつ簡単にできるといいですね!!!

今後もこういった情報を発信していきますので、お気に入り登録お願いいたします!!

※ご質問があれば、コメントや問い合わせなどで教えていただけたらと思います。

おまけ

今回作成したプログラムを紹介します。

冗長なプログラムになっているので、あくまで参考にしてください。スパゲッティコードというやつですね(汗)

全体の流れとしては、優先度を持つ生徒から処理を行い、残っている座席から、乱数で生徒を選択することで、前に詰めた座席表の作成を行なっています。

function RadomSeatGenelator() {
  // 座席の座標
  let Coordinate =  [
                      [[3,0],[3,2],[3,4],[3,6],[3,8],[3,10]],
                      [[6,0],[6,2],[6,4],[6,6],[6,8],[6,10]],
                      [[9,0],[9,2],[9,4],[9,6],[9,8],[9,10]],
                      [[12,0],[12,2],[12,4],[12,6],[12,8],[12,10]],
                      [[15,0],[15,2],[15,4],[15,6],[15,8],[15,10]],
                      [[18,0],[18,2],[18,4],[18,6],[18,8],[18,10]],
                      [[21,0],[21,2],[21,4],[21,6],[21,8],[21,10]]
                    ];
                  
  // アクティブなスプレッドシートを取得
  let SS = SpreadsheetApp.getActiveSpreadsheet();
  // 「生徒名簿」シートを取得
  let StudentList_SH = SS.getSheetByName("生徒名簿");
  // 「生徒名簿」シートからデータを取得
  let StudentList_Data = StudentList_SH.getDataRange().getValues();

  if(StudentList_Data.length == 1){
    Browser.msgBox("名簿に情報が記載されていません。\\n処理を狩猟します。");
    return;
  }

  ////// 優先列のフィルタリング //////
  // 優先代入のobjectを宣言
  let PriorityList = {
                      Priority_1:[] ,
                      Priority_2:[] ,
                      Priority_3:[] ,
                      Priority_4:[] ,
                      Priority_5:[] ,
                      Priority_6:[] ,
                      Priority_7:[] ,
                      Priority_0:[]
                      };
  for(let i = 1 ; i < StudentList_Data.length ; i++){ // 優先度を指定するためのラベルを取得 let Priority_num =StudentList_Data[i][2].replace(/[^0-9]/g, '')*1; // 優先度の対応するオブジェクトに値をpush PriorityList["Priority_" + Priority_num].push([StudentList_Data[i][0],StudentList_Data[i][1],Priority_num]); } ////// 優先列の数エラーを検出 ////// for(let Key in PriorityList){ // 非優先者のエラー検出は行わない if(Key == "Priority_0"){ break; } // 優先者の数を確認する if(PriorityList[Key].length > 6){
      Browser.msgBox(Key.replace(/[^0-9]/g, '') + "列の優先者が"+PriorityList[Key].length + "名存在します。6名以下にしてください。\\n処理を終了します");
      return;
    }
  }
  
  ////// 座席表作成 //////
  // 「座席シート」を取得
  let Base_SeatTable_SH = SS.getSheetByName("座席シート");
  // 「座席シート」をもとにしたコピーを作成
  let Edit_SeatTable_SH = Base_SeatTable_SH.copyTo(SS).setName("作成日:" + Utilities.formatDate(new Date(),"JST","yyyy/MM/dd hh:mm:ss"));
  // 「コピー座席シート」シートからデータを取得
  let Edit_SeatTable_Data = Edit_SeatTable_SH.getDataRange().getValues();
  ////// 座席シートのセルの値を編集 //////

  //// 優先列の先行配置 ////
  for(let Key in PriorityList){
    // 非優先者の場合は処理を行わない
    if(Key == "Priority_0"){
      break;
    }
    // 優先度を数値として取得
    let Coordinate_Key = Key.replace(/[^0-9]/g, '')*1 - 1;
      for(let i = 0 ; i < PriorityList[Key].length ; i++){
        // 座席の行をランダムで取得
        let Target = Math.floor( Math.random () * Coordinate[Coordinate_Key].length);
        // 氏名を代入
        Edit_SeatTable_Data[Coordinate[Coordinate_Key][Target][0]][Coordinate[Coordinate_Key][Target][1]] = PriorityList[Key][i][0];
        // フリガナを代入
        Edit_SeatTable_Data[Coordinate[Coordinate_Key][Target][0]-1][Coordinate[Coordinate_Key][Target][1]] = PriorityList[Key][i][1];
        // 入力が完了した座標配列を削除
        Coordinate[Coordinate_Key].splice(Target, 1);
    }
  }

  //// 非優先者の配置 ////
  // 非優先者リストの置換
  let Random_StudentList = PriorityList["Priority_0"];
  for(let i = 0 ; i < Coordinate.length ; i++){
    for(let j = 0 ; j < Coordinate[i].length ; j++){
      // 名簿リストがなくなった場合は終了
      if(!Random_StudentList.length){
        break;
      }
      // 座席の行をランダムで取得
      let Target = Math.floor( Math.random () * Random_StudentList.length);
      // 氏名を代入
      Edit_SeatTable_Data[Coordinate[i][j][0]][Coordinate[i][j][1]] = Random_StudentList[Target][0];
      // フリガナを代入
      Edit_SeatTable_Data[Coordinate[i][j][0]-1][Coordinate[i][j][1]] = Random_StudentList[Target][1];
      // 入力が完了した座標配列を削除
      Random_StudentList.splice(Target, 1);
    }
  }

  // 編集した配列の代入
  Edit_SeatTable_SH.getDataRange().setValues(Edit_SeatTable_Data);
  // スプレッドシートの更新
  SpreadsheetApp.flush();
  Browser.msgBox("座席表を作成しました。\\n" + "「作成日:" + Utilities.formatDate(new Date(),"JST","yyyy/MM/dd hh:mm:ss") + "」シートを確認してください。");
}