Another option to add to Bryan's would be to record the design data while the survey is running. This would be beneficial if you want to do something with the design data while the survey is going on (e.g., skips). Fortunately, this shouldn't be too tricky.
I would start by creating a free format question on the same page as the first CBC task. It should be given hidden variables with names like "_concept1level1," "_concept2level3," etc., reflecting the number of concepts and attributes of your CBC. Now place this script in the free format HTML:
[% Begin Unverified Perl
# Parameters
my $concepts = 4;
my $levels = 4;
# Run
my $output = '';
for (my $i = 1; $i <= $concepts; $i++) {
for (my $j = 1; $j <= $levels; $j++) {
my $variable = QUESTIONNAME() . '_concept' . $i . 'level' . $j;
$output .= '<input name="' . $variable . '" id="' . $variable . '" type="hidden" value=""/>';
}
}
return $output;
End Unverified %]
and this script in the CBC:
<script>
$(document).ready(function(){
[% Begin Unverified Perl
# Parameters
my $concepts = 4;
my $levels = 4;
# Run
my @conceptDesigns = ();
for (my $i = 1; $i <= $concepts; $i++) {
my @levels = ();
for (my $j = 1; $j <= $levels; $j++) {
push(@levels, CBCDESIGNLEVELVALUE(QUESTIONNAME(), $i , $j));
}
push(@conceptDesigns, '[' . join(',', @levels) . ']');
}
return 'var design = [' . join(',', @conceptDesigns) . '];';
End Unverified %]
var ff = $('#[% QuestionName() %]_div').nextAll('.freeformat').get(0).id.replace(/_div$/, '');
for (var i = 1; i <= design.length; i++) {
for (var j = 1; j <= design[i - 1].length; j++) {
$('#' + ff + '_concept' + i + 'level' + j).val(design[i - 1][j - 1]);
}
}
})
</script>
The code should automatically do everything for you, but be sure to look for "# Parameters" in both scripts and update the lines beneath them with your number of concepts and number of attributes.