This can be done with some advanced scripting.
To start, remove the fourth column from your grid question. Create a second grid question on the same page as your first grid question. The second grid question should be set to open-ends, not be set to require a response, have the same list of rows, and a column list with only one item in it: "Why?"
Now add this to the footer of your first grid question:
<script>
var GLOBAL_SAWTOOTH_SECONDGRIDQUESTION = 'GridQ2';
document.addEventListener('DOMContentLoaded', function(){
document.querySelector('#' + GLOBAL_SAWTOOTH_SECONDGRIDQUESTION + '_div').style.display = 'none';
combineGridQuestions();
updateOpenEndVisibility();
});
function SSI_CustomGraphicalRadiobox() {
updateOpenEndVisibility();
}
function combineGridQuestions() {
var trs = document.querySelectorAll('#[% QuestionName() %]_div .inner_table > tbody > tr').length;
for (var tr = 1; tr <= trs; tr++) {
var selected = document.querySelector('#' + GLOBAL_SAWTOOTH_SECONDGRIDQUESTION + '_div .inner_table > tbody > tr:nth-child(' + tr + ') > td:nth-child(2)');
document.querySelector('#[% QuestionName() %]_div .inner_table > tbody > tr:nth-child(' + tr + ')').appendChild(selected);
}
}
function updateOpenEndVisibility() {
var rows = document.querySelectorAll('#[% QuestionName() %]_div .inner_table > tbody > tr').length - 1;
for (var row = 1; row <= rows; row++) {
if (SSI_GetValue('[% QuestionName() %]_r' + row) == 3) {
document.querySelector('#' + GLOBAL_SAWTOOTH_SECONDGRIDQUESTION + '_r' + row + '_c1').disabled = false;
}
else {
document.querySelector('#' + GLOBAL_SAWTOOTH_SECONDGRIDQUESTION + '_r' + row + '_c1').disabled = true;
document.querySelector('#' + GLOBAL_SAWTOOTH_SECONDGRIDQUESTION + '_r' + row + '_c1').value = '';
}
}
}
</script>
Finally, add this to the first grid question's custom JavaScript verification:
var rows = document.querySelectorAll('#[% QuestionName() %]_div .inner_table > tbody > tr').length - 1;
for (var row = 1; row <= rows; row++) {
if (SSI_GetValue('[% QuestionName() %]_r' + row) == 3 && !SSI_GetValue(GLOBAL_SAWTOOTH_SECONDGRIDQUESTION + '_r' + row + '_c1')) {
strErrorMessage = 'Response is required.';
}
}