抽選する際に、getvalueを使って配列に格納し、当選者をリストアップして比較したかったですが、上手く格納できなくて失敗しました。
こちらで対応してみました。
javascript
1function myFunction() {
2 function Roll() {
3 var sheet = SpreadsheetApp.openById("リンク先").getSheetByName("test2");
4 var lastRow = sheet.getLastRow();
5 var l = [];
6 for (var j = 0; j < 20;j++) { //当選者数を設定
7 var row = Math.ceil(Math.random() * (lastRow-1)) + 1;
8 while(l.indexOf(row) >= 0) {
9 row = Math.ceil(Math.random() * (lastRow-1)) + 1;
10 }
11 l.push(row);
12 var tag = sheet.getRange(row, 1).setBackground("yellow");
13 }
14 }
15 Roll();
16}
本題とはズレますが、「Math.ceil(Math.random() * (lastRow-1)) + 1;」lastRow-1やランダム値に+1すると微妙に範囲がズレますが、意図している挙動なのでしょうか??
行番号自体は重複していないのですが、アンケートなどを回答した者が重複してアンケートに参加した場合、異なる行の番号に同じ者の名前が重複してしまいます。
追記を受けて回答を変更しました。
また、元のコードを活かすとかなり冗長になったため書き直しております。
わからない部分もあるかもしれませんが、コメントもつけてますし、よく読めばそんなに難しい事はありません。
javascript
1function myFunction2() {
2 // 重複を除去したい値が入っている列数を指定(B列だったら2)
3 var key_column_number = 2;
4
5 // 色を塗りたい数
6 var n = 5;
7
8 function Roll() {
9 var sheet = SpreadsheetApp.openById("xxxx").getSheetByName("test2");
10 var lastRow = sheet.getLastRow();
11
12 // 対象の値を全て取得
13 var values = sheet.getRange(1,1,lastRow, key_column_number).getValues();
14
15 // 指定した列の値が重複した行は除く
16 var unique_values = values.reduce(function(x, y, index) {
17 if (x.names.indexOf(y[1]) < 0) {
18 x.row_nubers.push(index + 1);
19 x.names.push(y[1]);
20 }
21 return x;
22 }, {row_nubers: [], names: []});
23 var row_numbers = unique_values.row_nubers;
24
25 // 行番号をランダムで並び替え
26 row_numbers.sort(function() {return Math.random() - .5});
27
28 // 先頭から色を塗りたい行数分だけ行番号を取得
29 var target_row_numbers = row_numbers.slice(0,n);
30
31 // 色塗り
32 target_row_numbers.forEach(function(v) {
33 sheet.getRange(v, 1).setBackground("yellow");
34 });
35 }
36 Roll();
37}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/29 01:23
2019/08/29 01:38
2019/08/29 01:57
2019/08/30 01:10
2019/08/30 10:04