Создание формы 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("")();

}

googleSheet

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);

}

Другие вопросы по тегам