質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

ランダム関数を用いて、自動的にセルが入る際、同じ行に同じ値が入らないようにするにはどうしたらいいでしょうか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 265

score 48

現在、集団面接のイベントを行っているのですが、その際に参加する学生が予め入力した志望先に会わせて面接のスケジュールを組むシステムを組んでおります。
その際、第一志望に選択した企業と第二志望に選択した企業との面接時間が被る問題が生じました。

列1 列2 列3
氏名     第一志望 第二志望
山田太郎 山田証券 佐藤運輸
鈴木花子 佐藤運輸 愛知重工
佐藤次郎 アスキー商会 山田証券
井上洋子 愛知重工 アスキー商会
列1 列2
企業名
山田証券
佐藤運輸
アスキー商会
愛知重工
const ss = SpreadsheetApp.getActiveSpreadsheet();

class Company{
  constructor(name){
    this.name = name;
    this.timeTable = {
      1:"",
      2:"",
      3:"",
      4:""
    }
  }
  setTimeTable(persons){

    const rows = [];
    for(let i = 0; i < persons.length; i++){
      if(persons[i].req["1"] === this.name || persons[i].req["2"] === this.name){
        rows.push(persons[i]);
      }
    }
    const table = [1, 2, 3, 4];
    table.sort((a, b)=>{
      a = Math.floor(Math.random() * 4) + 1;
      b = Math.floor(Math.random() * 4) + 1;
      return b - a;
    });
    for(let i = 0; i < 2; i++){
      const num = table.pop();
      this.timeTable[num] = rows[i].name;
    }
  }
}

class Person {
  constructor(name, req){
    this.name = name;
    this.req = {
      1:req[0],
      2:req[1]
    }
  }
}

function myFunction() {
  const persons = compilePerson("学生リスト");
  const companies = compileCompany("企業リスト");
  for(company of companies){
    const p = persons.filter((p)=>{
      if(p.req["1"] === company.name){
        return true;
      }else if(p.req["2"] === company.name){
        return true;
      }else{
        return false;
      }
    });
    company.setTimeTable(p);
  }

  inputTimeTable("スケジュール", companies);
}

const compilePerson = (shName) =>{
  const sh = ss.getSheetByName(shName);
  const values = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).getValues();
  values.shift();
  return values.map((p)=>{return new Person(p[0], [p[1], p[2]])});
}

const compileCompany = (shName) => {
  const sh = ss.getSheetByName(shName);
  const values = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).getValues();
  values.shift();
  return values.map((c)=>{return new Company(c[0]);});
}

const inputTimeTable = (shName, companies) =>{
  const ROW = 2;
  const COL = 3;
  const sh = ss.getSheetByName(shName);

  for(let i = 0; i < companies.length; i++){
    for(let j = 0; j < 4; j++){
      const num = j + 1;
      sh.getRange(ROW + j, COL + i).setValue(companies[i]["timeTable"][num]);
    }
  }
}

しかし、これだとランダムに設定しているのであって、偶に重複することがありました。

実行した結果

列1 列2 列3 列4 列5 列6
No タイムテーブル 山田証券 佐藤運輸 アスキー商会 愛知重工
1 9:30~9:45               井上洋子     井上洋子
2 9:50~10:05                              鈴木花子
3 10:10~10:25     山田太郎     山田太郎         
4 10:30~10:45     佐藤次郎     鈴木花子     佐藤次郎

今回のデータはテスト用のためデータ数が少ないのですが、実際に使用するデータでは企業が15社前後、学生が30名前後を想定しております。
同じ行にデータが被った際、再計算する仕組みを組みたいのですが、どのようにソースを改修すればよろしいでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

-1

Personクラスにプロパティを追加して、どの時間帯に登録したのか記録するように修正しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

データを代入する場合に値をチェックして、値が重複する場合に乱数の生成からやり直すようにすればいいです

まずは、重複してるかどうかのチェックを行うメソッドを実装してはどうでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/07 21:51

    重複チェックの方法が思いつかなかったです。
    どのように手を加えたらいいでしょうか?

    キャンセル

  • 2020/09/07 22:12

    >>まずは、重複してるかどうかのチェックを行うメソッドを実装してはどうでしょうか
    ここのチェック方法が思いつかなかったので、質問したのですが、伝わっていなかったようです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • JavaScriptに関する質問
  • ランダム関数を用いて、自動的にセルが入る際、同じ行に同じ値が入らないようにするにはどうしたらいいでしょうか?