yumetodoの旅とプログラミングとかの記録

旅や登山の記録やプログラミング関連の話とかフリーソフト紹介とか

Google Apps Scriptで範囲から欠けた数を列挙する

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で無視してます。