Have an idea?

Visit Sawtooth Software Feedback to share your ideas on how we can improve our products.

Not applicable question modification

Is there a way to change the 'Not Applicable' question from the question library so instead of appearing as 'not applicable' it says something like 'don't know' instead?
asked Jan 3 by kaitlan

2 Answers

0 votes
Yes, that's an easy modification.

Click on the "Not Applicable" question, then click on the "Response Options" tab. Under the "Predefined List Members", you will see the one list member displayed which reads "Not Applicable". Double click on this list item and edit the text. Then hit OK to save.

That's it.
answered Jan 3 by Paul Moon Platinum (74,305 points)
Thanks, I realized that after I submitted the question.

What if I want to add multiple 'non applicable' type answers to one question and have them be exclusive

Like
Don't remember
Not approved
None of the above

Is there a way to have multiple 'not applicable' type answers for a question and have them be exclusive?
I do have an example of the Not Applicable question working for 2 response items like DK and Refused.

I believe the script I have is an older version so you may want to use the latest that the Question Library has to offer.

Let me know if you want an example of the older version. I can send an ssi file to you.

The other option is to involve the creator of this Question Library feature (Zachary Anderson from Sawtooth Software) and we obtain the latest script updated to allow for multiple response options.
0 votes
Been a while since I looked at this code, but give this a try:

Not Applicable's footer:

<style>
#[% QuestionName() %]_div {
    display: none;
}

.error_quest_highlight2 {
    border: 1px solid red !important;
}
</style>

<script>
$(window).on('load', function(){
    // Question
    var question = $('#[% QuestionName() %]_div').prevAll('.question')[0].id.replace(/_div/, '');
    var qdiv = $('#' + question + '_div');
    
    // Move N/A field
    $(qdiv).find('.question_body').append($('#[% QuestionName() %]_div .response_row'));
    
    // N/A click event
    $('#' + question + '_div .clickable').click(function(event){
        updateNotApplicableQuestion(question, '[% QuestionName() %]');
    });
    $(document).on('customGraphicalCheckbox', function(event, graphicalObj, inputObj, bln){
        updateNotApplicableQuestion(question, '[% QuestionName() %]');
    });
    updateNotApplicableQuestion(question, '[% QuestionName() %]');
})

function updateNotApplicableQuestion(baseQuestion, naQuestion) {
    var qdiv = $('#' + baseQuestion + '_div');
    
    var bln = false;
    $('input[name="hid_list_' + naQuestion + '"]').val().split(',').forEach(function(item){
        if (SSI_GetValue(naQuestion + '_' + item)) {
            bln = true;
        }
    });
    
    var regex = new RegExp('^' + naQuestion + '_');
    
    // Disable and clear question
    if (bln) {
        // Inputs, textareas, selects
        $(qdiv).find('input[type=text]').val('').prop('disabled', true);
        $(qdiv).find('input[type=tel]').val('').prop('disabled', true);
        $(qdiv).find('textarea').val('').prop('disabled', true);
        $(qdiv).find('select').val('').prop('disabled', true);
        $(qdiv).find('input[type=radio]:visible').prop('checked', false).prop('disabled', true);
        $(qdiv).find('input[type=checkbox][id!=' + naQuestion + '_1]:visible').prop('checked', false).prop('disabled', true);
            
        // Graphical radios and checks
        $(qdiv).find('input[type=radio]').each(function(){
            SSI_RadioReset(this.name);
            SSI_DisableGraphicalInput(this.id);
        });
        $(qdiv).find('input[type=checkbox]').each(function(){
            if (!regex.test(this.id)) {
                SSI_SetSelect(this.id, false);
                SSI_DisableGraphicalInput(this.id);
            }
        });
            
        // Semantic diffs
        $(qdiv).find('.ui-slider').each(function(){
            $(this).find('input').val('');
            $(this).find('.ui-slider-handle').css('left', '50%');
            $(this).slider('disable');
        });
            
        // Drag-and-drop ranking
        $(qdiv).find('.draggable_button').each(function(){
            $(this).find('input').val('');
            $(this).find('.rank_number').text('');
        });
        $(qdiv).find('.unranked_sort_area').append($(qdiv).find('.ranked_sort_area .draggable_button'));
        $(qdiv).find('.ui-sortable').sortable('option', 'cancel', '.draggable_button');
    }
        
    // Enable question
    else {
        // Inputs, textareas, selects
        $(qdiv).find('input[type=text]').prop('disabled', false);
        $(qdiv).find('input[type=tel]').prop('disabled', false);
        $(qdiv).find('textarea').prop('disabled', false);
        $(qdiv).find('select').prop('disabled', false);
        $(qdiv).find('input[type=radio]:visible').prop('disabled', false);
        $(qdiv).find('input[type=checkbox]:visible').prop('disabled', false);

        // Graphical radios and checks
        $(qdiv).find('input[type=radio]').each(function(){
            SSI_EnableGraphicalInput(this.id);
        });
        $(qdiv).find('input[type=checkbox]').each(function(){
            if (!regex.test(this.id)) {
                SSI_EnableGraphicalInput(this.id);
            }
        });

        // Semantic diffs
        $(qdiv).find('.ui-slider').each(function(){
            $(this).slider('enable');
        });
            
        // Drag-and-drop ranking
        $(qdiv).find('.ui-sortable').sortable('option', 'cancel', '');
    }
}

function SSI_CustomGraphicalCheckbox(graphicalObj, inputObj, bln) {
    $(document).trigger('customGraphicalCheckbox', [graphicalObj, inputObj, bln]);
}
</script>


(cont.)
answered Jan 7 by Zachary Platinum Sawtooth Software, Inc. (121,100 points)
Not Applicable's custom JS verification:

// Grid parameters (must be updated if using grid)
var gridInfo = {
    orientation: 'r', // 'r' for row-oriented grid, 'c' for col-oriented grid
    constantSumOrRanking: [] // must be filled with any rows / columns that are constant sum or ranking
}
var minimumChecks = 0; // minimum number of selected checkboxes if "Not Applicable" is not selected

var question = $('#[% QuestionName() %]_div').prevAll('.question')[0].id.replace(/_div/, '');
var qdiv = $('#' + question + '_div');
var err;

var bln = false;
$('input[name="hid_list_[% QuestionName() %]"]').val().split(',').forEach(function(item){
    if (SSI_GetValue('[% QuestionName() %]_' + item)) {
        bln = true;
    }
});

if (!bln) {
    // Select
    if ($(qdiv).hasClass('select')) {
        var checkboxInputs = $(qdiv).find('input[type=checkbox][id^=' + question + '_]');
        if (!$(checkboxInputs).length) {
            err = !SSI_GetValue(question);
        }
        else {
            var checks = 0;
            $(checkboxInputs).each(function(){
                checks += SSI_GetValue(this.id);
            });
            err = checks < minimumChecks;
        }
    }
    
    if ($(qdiv).hasClass('select') && $(qdiv).find('input[type=checkbox]').length == 1) {
        err = !SSI_GetValue(question);
    }
    
    // Numeric, open end
    else if ($(qdiv).hasClass('numeric') || $(qdiv).hasClass('openend')) {
        err = !$('#' + question).val().length;
    }
    
    // Non-tel ranking
    else if ($(qdiv).hasClass('ranking') && ($(qdiv).find('select').length || $(qdiv).find('.ui-sortable').length)) {
        var list = $('input[name=hid_list_' + question + ']').val().split(',').map(Number);
        err = true;
        for (var i = 0; i < list.length; i++) {
            if (SSI_GetValue(question + '_' + list[i])) {
                err = false;
                break;
            }
        }
    }
    
    // Sem diff
    else if ($(qdiv).hasClass('semanticdiff')) {
        var list = $('input[name=hid_list_' + question + ']').val().split(',').map(Number);
        err = false;
        for (var i = 0; i < list.length; i++) {
            if (!SSI_GetValue(question + '_' + list[i])) {
                err = true;
                break;
            }
        }
    }
    
    // Constant sum, tel ranking
    else if ($(qdiv).hasClass('constantsum') || $(qdiv).hasClass('ranking')) {
        var list = $('input[name=hid_list_' + question + ']').val().split(',').map(Number);
        err = true;
        for (var i = 0; i < list.length; i++) {
            if ($('#' + question + '_' + list[i]).val().length) {
                err = false;
                break;
            }
        }
    }
    
    // Grid
    else if ($(qdiv).hasClass('grid')) {
        var rows = $('input[name=hid_row_list_' + question + ']').val().split(',').map(Number);
        var cols = $('input[name=hid_col_list_' + question + ']').val().split(',').map(Number);
        
        // Row-oriented
        if (gridInfo.orientation == 'r') {
            var firstCol = cols[0];
            for (var r = 0; r < rows.length && !err; r++) {
                var row = rows[r];

                // Radio
                if ($('#' + question + '_r' + row + '_' + firstCol + '[type=radio]').length) {
                    err = !SSI_GetValue(question + '_r' + row);
                }

                // Check
                else if ($('#' + question + '_r' + row + '_c' + firstCol + '[type=checkbox]').length) {
                    var checks = 0;
                    $(qdiv).find('input[type=checkbox][id^=' + question + '_r' + row + '_]').each(function(){
                        checks += SSI_GetValue(this.id);
                    });
                    err = checks < minimumChecks;
                }

                // Combo
                else if ($('select#' + question + '_r' + row + '_c' + firstCol).length && gridInfo.constantSumOrRanking.indexOf(row) == -1) {
                    for (var c = 0; c < cols.length && !err; c++) {
                        var col = cols[c];
                        err = !SSI_GetValue(question + '_r' + row + '_c' + col);
                    }
                }

                // Open end, numeric
                else if (gridInfo.constantSumOrRanking.indexOf(row) == -1) {
                    for (var c = 0; c < cols.length && !err; c++) {
                        var col = cols[c];
                        err = !$('#' + question + '_r' + row + '_c' + col).val().length;
                    }
                }

                // Combo ranking
                else if ($('select#' + question + '_r' + row + '_c' + firstCol).length) {
                    err = true;
                    for (var c = 0; c < cols.length && err; c++) {
                        var col = cols[c];
                        err = !SSI_GetValue(question + '_r' + row + '_c' + col);
                    }
                }

                // Constant sum, tel ranking
                else {
                    err = true;
                    for (var c = 0; c < cols.length && err; c++) {
                        var col = cols[c];
                        err = !$('#' + question + '_r' + row + '_c' + col).val().length;
                    }
                }
            }
        }
        
        // Col-oriented
        else {
            var firstRow = rows[0];
            for (var c = 0; c < cols.length && !err; c++) {
                var col = cols[c];

                // Radio
                if ($('#' + question + '_c' + col + '_' + firstRow + '[type=radio]').length) {
                    err = !SSI_GetValue(question + '_c' + col);
                }

                // Check
                else if ($('#' + question + '_r' + firstRow + '_c' + col + '[type=checkbox]').length) {
                    var checks = 0;
                    $(qdiv).find('input[type=checkbox][id^=' + question + '_][id$=_c' + col + ']').each(function(){
                        checks += SSI_GetValue(this.id);
                    });
                    err = checks < minimumChecks;
                }

                // Combo
                else if ($('select#' + question + '_r' + firstRow + '_c' + col).length && gridInfo.constantSumOrRanking.indexOf(col) == -1) {
                    for (var r = 0; r < rows.length && !err; r++) {
                        var row = rows[r];
                        err = !SSI_GetValue(question + '_r' + row + '_c' + col);
                    }
                }

                // Open end, numeric
                else if (gridInfo.constantSumOrRanking.indexOf(col) == -1) {
                    for (var r = 0; r < rows.length && !err; r++) {
                        var row = rows[r];
                        err = !$('#' + question + '_r' + row + '_c' + col).val().length;
                    }
                }

                // Combo ranking
                else if ($('select#' + question + '_r' + firstRow + '_c' + col).length) {
                    err = true;
                    for (var r = 0; r < rows.length && err; r++) {
                        var row = rows[r];
                        err = !SSI_GetValue(question + '_r' + row + '_c' + col);
                    }
                }

                // Constant sum, tel ranking
                else {
                    err = true;
                    for (var r = 0; r < rows.length && err; r++) {
                        var row = rows[r];
                        err = !$('#' + question + '_r' + row + '_c' + col).val().length;
                    }
                }
            }
        }
    }

    // Free format
    else if ($(qdiv).hasClass('freeformat')) {
        // Radio, combo
        var selects = $(qdiv).find('input[type=radio], select');
        for (var i = 0; i < selects.length && !err; i++) {
            err = err || !SSI_GetValue(selects[i].name);
        }
        
        // Checkbox
        var checks = [];
        $(qdiv).find('input[type=checkbox][id^=' + question + '_]').each(function(){
            var checkGroup = this.id.replace(/_[0-9]+$/, '');
            if (checks[checkGroup] === undefined) {
                checks[checkGroup] = 0;
            }
            if (SSI_GetValue(this.id)) {
                checks[checkGroup]++;
            }
        });
        Object.keys(checks).forEach(function(key){
            err = err || checks[key] < minimumChecks;
        });

        // Numeric, text, textarea
        var inputs = $(qdiv).find('input[type=tel], input[type=text], textarea');
        for (var i = 0; i < inputs.length && !err; i++) {
            err = err || !$(inputs[i]).val().length;
        }
    }
}

// Error
$(qdiv).removeClass('error_quest_highlight2');
$('#' + question + '_err2').remove();

if (err) {
    strErrorMessage = 'Question must be answered or "Not Applicable" must be selected.';

    $(qdiv).removeClass('error_quest_highlight');
    $('#' + question + '_err').remove();
    $(qdiv).addClass('error_quest_highlight2');
    $(qdiv).prepend('<div id="' + question + '_err2" class="question_error_box error_messages"></div>');
    $('#' + question + '_err2').append('<div class="question_errors">' + strErrorMessage + '</div>');
}


Exclusivity can be handled by Lighthouse Studio like normal.
...