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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1187閲覧

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

zigutabi

総合スコア57

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/09/07 12:01

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

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

GAS

1const ss = SpreadsheetApp.getActiveSpreadsheet(); 2 3class Company{ 4 constructor(name){ 5 this.name = name; 6 this.timeTable = { 7 1:"", 8 2:"", 9 3:"", 10 4:"" 11 } 12 } 13 setTimeTable(persons){ 14 15 const rows = []; 16 for(let i = 0; i < persons.length; i++){ 17 if(persons[i].req["1"] === this.name || persons[i].req["2"] === this.name){ 18 rows.push(persons[i]); 19 } 20 } 21 const table = [1, 2, 3, 4]; 22 table.sort((a, b)=>{ 23 a = Math.floor(Math.random() * 4) + 1; 24 b = Math.floor(Math.random() * 4) + 1; 25 return b - a; 26 }); 27 for(let i = 0; i < 2; i++){ 28 const num = table.pop(); 29 this.timeTable[num] = rows[i].name; 30 } 31 } 32} 33 34class Person { 35 constructor(name, req){ 36 this.name = name; 37 this.req = { 38 1:req[0], 39 2:req[1] 40 } 41 } 42} 43 44function myFunction() { 45 const persons = compilePerson("学生リスト"); 46 const companies = compileCompany("企業リスト"); 47 for(company of companies){ 48 const p = persons.filter((p)=>{ 49 if(p.req["1"] === company.name){ 50 return true; 51 }else if(p.req["2"] === company.name){ 52 return true; 53 }else{ 54 return false; 55 } 56 }); 57 company.setTimeTable(p); 58 } 59 60 inputTimeTable("スケジュール", companies); 61} 62 63const compilePerson = (shName) =>{ 64 const sh = ss.getSheetByName(shName); 65 const values = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).getValues(); 66 values.shift(); 67 return values.map((p)=>{return new Person(p[0], [p[1], p[2]])}); 68} 69 70const compileCompany = (shName) => { 71 const sh = ss.getSheetByName(shName); 72 const values = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).getValues(); 73 values.shift(); 74 return values.map((c)=>{return new Company(c[0]);}); 75} 76 77const inputTimeTable = (shName, companies) =>{ 78 const ROW = 2; 79 const COL = 3; 80 const sh = ss.getSheetByName(shName); 81 82 for(let i = 0; i < companies.length; i++){ 83 for(let j = 0; j < 4; j++){ 84 const num = j + 1; 85 sh.getRange(ROW + j, COL + i).setValue(companies[i]["timeTable"][num]); 86 } 87 } 88}

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

実行した結果

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

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

投稿2020/09/07 13:17

zigutabi

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2020/09/07 12:48

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zigutabi

2020/09/07 12:51

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

2020/09/07 13:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問