Создание формы Google из электронной таблицы Google
Я создал таблицу Google для автоматического преобразования в форму Google, поэтому мне не нужно вручную вводить все вопросы в форму Google.
Я пишу скрипт приложения для Google, и мне удалось получить все вопросы. Я пытаюсь разделить форму на разделы в зависимости от первого столбца листа. Поэтому, если в первом столбце указано "1", соответствующие ему вопросы должны быть в первом разделе, а в случае "2" - создать еще один раздел. И так далее.
Как я могу это сделать? какой будет код? Я приложил Google лист, как здесь Google таблицы
function myFunction()
{
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var range = ss.getDataRange();
var data = range.getValues();
var numberRows = range.getNumRows();
var numberColumns = range.getNumColumns();
var firstRow = 1;
var form = FormApp.openById('1hIQCLT_JGLcvjz44vXTvP5ziia6NnwCqWBxYT4h2uCk');
var items = form.getItems();
var ilength = items.length;
for (var i=0; i<items.length; i++)
{
form.deleteItem(0);
}
for(var i=0;i<numberRows;i++)
{
Logger.log(data);
var questionType = data[i][0];
if (questionType=='')
{
continue;
}
//choose the type of question from the first column of the spreadsheet
else if(questionType=='1')
{
var rowLength = data[i].length;
var currentRow = firstRow+i;
var currentRangeValues = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange(currentRow,1,1,rowLength).getValues();
var getSheetRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getDataRange();
var numberOfColumnsSheet = getSheetRange.getNumColumns();
var numberOfOptionsInCurrentRow = numberOfColumnsSheet;
var lastColumnInRange = String.fromCharCode(64 + (numberOfOptionsInCurrentRow));
var range_string = 'C' + currentRow + ":" + lastColumnInRange + currentRow;
var optionsArray = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange(range_string).getValues();
var choicesForQuestion =[];
for (var j=0;j<optionsArray[0].length;j++)
{
choicesForQuestion.push(optionsArray[0][j]);
}
form.addMultipleChoiceItem().setTitle(data[i][1]).setHelpText("").setChoiceValues(choicesForQuestion).setRequired(true);
}
else
{
continue;
}
}
form.addParagraphTextItem()
.setTitle('Please specify and attach relevant documents'); // add the text question at the last
form.addPageBreakItem().setTitle('Identity - Asset Management').setHelpText("")();
}
2 ответа
Если вы хотите использовать тот же точный формат для следующего раздела, вы можете использовать простой счетчик. Я написал успешный вариант сценария, но это зависит от того, что вы действительно хотите.
Некоторые изменения я бы сделал
for (i = 0; i < items.length; i++) {
form.deleteItem(items[i])
}
вместо текущего form.deleteItem(0);
, В противном случае я вижу, что вы захватываете все данные, однако вы не используете их. Вызов приложения электронной таблицы каждый раз, когда вам нужны параметры, заставляет его работать намного медленнее. Подробнее об этом for
цикл: переместить Logger.log(data);
вне петли. Нет никакой причины продолжать регистрировать полный диапазон данных каждый раз, когда вы переходите к следующей строке данных. Или измените его на Logger.log(data[i]);
что будет иметь больше смысла.
Вы уже делаете
if (questionType=='') {
continue;
}
чтобы пропустить пустые строки, так что не совсем уверен, что это в прошлом else
предназначен для. Цикл в любом случае провалится к следующей опции.
Теперь ваши настройки будут работать так, что ваши вопросы в электронной таблице должны быть в порядке. То есть ты не можешь иметь
- Секция 1
- Раздел 2
- Секция 1
так как это создаст 3 раздела вместо 2. Однако давайте перейдем к предположению, что электронная таблица будет настроена только таким образом, чтобы у вас была только последовательность, подобная
- Секция 1
- Секция 1
- Раздел 2
В этом случае вы должны использовать свой data
а также questionType
добавив счетчик var sectionCount = 0
где-то до петли. Тогда внутри вашего for
цикл вы делаете простой
else if (questionType != sectionCount) {
form.addSectionHeaderItem().setTitle('Section ' + questionType)
sectionCount++
}
это создаст раздел (при условии, что числа всегда увеличиваются на 1 в столбце A). Тогда в том же for
петля вам больше не нужна if
заявления и можно просто использовать
items = data[i].slice(2, data[i].length + 1)
items = items.filter(chkEmpty)
form.addMultipleChoiceItem().setTitle(data[i][1]).setChoiceValues(items)
где
function chkEmpty(val){
return val != ''
}
function myFunction()
{
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var ss2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2');
var range = ss.getDataRange();
var data = range.getValues();
var numberRows = range.getNumRows();
var numberColumns = range.getNumColumns();
var firstRow = 1;
var form = FormApp.openById('1xlXDZB5jhbUWpWHxxJwY-ut5oYkh4OfIQSTGsnwGTW4');
var sectionCount = 0
// deletes the previous changes
var items = form.getItems();
var ilength = items.length;
for (i = 0; i < items.length; i++)
{
form.deleteItem(items[i])
}
for(var i=0;i<numberRows;i++)
{
var questionType = data[i][0];
if (questionType=='')
{
continue;
}
else if (questionType != sectionCount )
{
if (sectionCount != 0 )
{
// form.addParagraphTextItem()
// .setTitle('Please specify and attach relevant documents'); // add the text question at the last
// write the description here using SectionCount
}
sectionCount++ // add new section to the form
form.addSectionHeaderItem().setTitle('Section ' + questionType).setHelpText(""); // add section header and title
}
items = data[i].slice(2, data[i].length + 1)
items = items.filter(chkEmpty)
form.addMultipleChoiceItem().setTitle(data[i]
[1]).setChoiceValues(items).setRequired(true);
if ( i == (numberRows-1)){
// form.addParagraphTextItem()
// .setTitle('Please specify and attach relevant documents');
}
}
function chkEmpty(val)
{
return val != ''
}
Logger.log(data);
}