回答編集履歴

1

追記への回答

2019/08/30 02:30

投稿

yamap55
yamap55

スコア1376

test CHANGED
@@ -45,3 +45,99 @@
45
45
 
46
46
 
47
47
  本題とはズレますが、「Math.ceil(Math.random() * (lastRow-1)) + 1;」lastRow-1やランダム値に+1すると微妙に範囲がズレますが、意図している挙動なのでしょうか??
48
+
49
+
50
+
51
+ ----
52
+
53
+
54
+
55
+ > 行番号自体は重複していないのですが、アンケートなどを回答した者が重複してアンケートに参加した場合、異なる行の番号に同じ者の名前が重複してしまいます。
56
+
57
+
58
+
59
+ 追記を受けて回答を変更しました。
60
+
61
+ また、元のコードを活かすとかなり冗長になったため書き直しております。
62
+
63
+ わからない部分もあるかもしれませんが、コメントもつけてますし、よく読めばそんなに難しい事はありません。
64
+
65
+
66
+
67
+ ```javascript
68
+
69
+ function myFunction2() {
70
+
71
+ // 重複を除去したい値が入っている列数を指定(B列だったら2)
72
+
73
+ var key_column_number = 2;
74
+
75
+
76
+
77
+ // 色を塗りたい数
78
+
79
+ var n = 5;
80
+
81
+
82
+
83
+ function Roll() {
84
+
85
+ var sheet = SpreadsheetApp.openById("xxxx").getSheetByName("test2");
86
+
87
+ var lastRow = sheet.getLastRow();
88
+
89
+
90
+
91
+ // 対象の値を全て取得
92
+
93
+ var values = sheet.getRange(1,1,lastRow, key_column_number).getValues();
94
+
95
+
96
+
97
+ // 指定した列の値が重複した行は除く
98
+
99
+ var unique_values = values.reduce(function(x, y, index) {
100
+
101
+ if (x.names.indexOf(y[1]) < 0) {
102
+
103
+ x.row_nubers.push(index + 1);
104
+
105
+ x.names.push(y[1]);
106
+
107
+ }
108
+
109
+ return x;
110
+
111
+ }, {row_nubers: [], names: []});
112
+
113
+ var row_numbers = unique_values.row_nubers;
114
+
115
+
116
+
117
+ // 行番号をランダムで並び替え
118
+
119
+ row_numbers.sort(function() {return Math.random() - .5});
120
+
121
+
122
+
123
+ // 先頭から色を塗りたい行数分だけ行番号を取得
124
+
125
+ var target_row_numbers = row_numbers.slice(0,n);
126
+
127
+
128
+
129
+ // 色塗り
130
+
131
+ target_row_numbers.forEach(function(v) {
132
+
133
+ sheet.getRange(v, 1).setBackground("yellow");
134
+
135
+ });
136
+
137
+ }
138
+
139
+ Roll();
140
+
141
+ }
142
+
143
+ ```