Google Apps Scriptで範囲から欠けた数を列挙する
今回もまたみらい研究室実行委員会の3/19に行ったイベントのアンケート解析をしています。
で、委員みんなでアンケートの内容を私が作ったGoogleFormに打ち込んでデータ化して、それを私がいい感じにまとめて「解析は任せた」の投げつけるお仕事をしているわけです
GoogleFormで打ち込むためにアンケートに通し番号を付けてそれを入力してもらうんですが、順番ばらばらでみんな打ち込むので、どれが欠けてるかわかりにくくて仕方ないです。
というわけで、欠けた数をカンマ区切りの文字列で返すlist_missing_num関数を作りました。
function list_missing_num(numbers) {
if(
"undefined" !== typeof(numbers) && Array.isArray(numbers)
&& "object" === typeof(numbers[0]) && Array.isArray(numbers[0]) && "number" === typeof(numbers[0][0])
){
var arr = [];
var i;
for(i = 0; i < numbers.length; ++i) arr.push(numbers[i][0]);//convert
arr.sort(function(a, b){ return a - b; });//sort
arr = arr.filter(function (x, i, self) { return self.indexOf(x) === i; });//unique
var re = [];
var push_back = function(min, max){
for(var i = min; i <= max; ++i) re.push(i);
}
var j;
for(i = 1, j = arr[0]; i < arr.length; j = arr[i], ++i){
if(1 !== arr[i] - j){
push_back(j + 1, arr[i] - 1);//push missing nums
}
}
return (re.length === 0) ? "nothing" : re.join();
}
else{
throw new TypeError("unexpected input. numbers:" + typeof(numbers) + " min:" + typeof(min) + " max:" + typeof(max));
}
}
まあ特に説明することは無いですね。重複はfilterで無視してます。