Как заставить PageNavigationType работать через цикл - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь собрать информацию из диапазона в Google Sheet и создать форму, используя Google Script.В зависимости от ввода пользователя в форме, пользователь должен ориентироваться на определенную страницу в форме.Страницы создаются с помощью цикла, и мне нужна помощь, чтобы поместить правильный навигационный тип в элемент createChoice внутри сгенерированного множественного выбора.

В диапазоне листов, скажем, в диапазоне листов 1: A1: D10, данные в первой строке (A1: D1) содержит заголовки с множественным выбором.Ряды A2: D10 варианты.Если параметр равен диапазону / значению в первой строке, то, если пользователь выберет этот параметр, он сможет перейти на эту страницу в форме.Единственное правило состоит в том, что каждый параметр в каждом столбце должен указывать на следующие столбцы, а не раньше, поэтому выбор в столбце B не должен указывать на столбец A и может указывать только на столбцы C или D.

Вы можете найтиGoogle Sheet здесь

Приведенный ниже код уже создает эту функцию, однако застревает на setGoToPages для всех страниц.Любые входные данные о том, что я не делаю правильно?

function TheForm() {
  var SS = SpreadsheetApp.getActiveSpreadsheet();
  var Sheet = SS.getSheetByName('Sheet1');
  var data = Sheet.getRange('A1:D10').getValues();

  //  Creating the form
  var form = FormApp.create('Input')
  .setDescription('Some description')
  .setConfirmationMessage('Have a fruity day:)')
  .setAllowResponseEdits(true)
  .setAcceptingResponses(true);

  //  adding the Fruits column in first page
  var itemPage1 = form.addListItem()
                  .setTitle('Fruits')
                  .setRequired(true);

  var PageNamesValues = [];
  for (var x=data[0].length-1; x>0; x--) {
      var choices = [];
      var choicesPage1 = []
      if (data[0][x] !== '') {
        // Create all other pages
        // My problem is how to set the page names so that I can refer to later!      
        var PageName = form.addPageBreakItem()
        .setTitle(data[0][x]);
        PageNamesValues.push(PageName.getTitle());
        Logger.log(PageName.getTitle());
        Logger.log(PageNamesValues);

        PageName.setGoToPage(FormApp.PageNavigationType.SUBMIT);

        var item = form.addMultipleChoiceItem()
        .setTitle(data[0][x])
        .showOtherOption(false)
        .setRequired(true);

        Logger.log('PageName is "'+PageName+'"');
        for (var z=1; z<data.length; z++) {  
          if (data[z][x] !== '') {
            Logger.log('data[z][x] = '+data[z][x]+' and asking to CONTINUE');
            choices.push(item.createChoice(data[z][x]));
            for (var zz=0; zz<PageNamesValues.length; zz++) {
              // if a choice equals a Page name then go to that Page 
              if (data[z][x] == PageNamesValues[zz]){
                // I have problems converting the PageNames[x] variable to the correct PageNavigationType
                Logger.log('We found option "'+data[z][x]+'" matching Page Name "'+PageNamesValues[zz]+'"');
                item.createChoice(data[z][x], PageName);
              }
            }
          }
        }
        Logger.log('Set all choices to: '+choices);
        item.setChoices(choices);
      }
    } 
        for (var z=1; z<data.length; z++) {  
          if (data[z][x] !== '') {
            Logger.log('data[z][x] = '+data[z][x]+' and asking to CONTINUE');
            choicesPage1.push(itemPage1.createChoice(data[z][x]));
            for (var zz=0; zz<PageNamesValues.length; zz++) {
              // if a choice equals a Page name then go to that Page 
              if (data[z][x] == PageNamesValues[zz]){
                // I have problems converting the PageNames[x] variable to the correct PageNavigationType
                Logger.log('We found option "'+data[z][x]+'" matching Page Name "'+PageNamesValues[zz]+'"');
                itemPage1.createChoice(data[z][x], PageName);
            }
          }
        }
        Logger.log('Set all choicesPage1 to: '+choicesPage1);
        itemPage1.setChoices(choicesPage1);
  }
}

Лог для вышеуказанного кода:

Зима

[Зима]

PageName - "PageBreakItem"

data [z] [x] = Кататься на лыжах и просить ПРОДОЛЖИТЬ

data [z] [x] = Сноубординг и просить ПРОДОЛЖИТЬ

data [z] [x] = Снег и просит ПРОДОЛЖИТЬ

data [z] [x] = Дождь и просит ПРОДОЛЖИТЬ

data [z] [x] = Снеговик и спрашиватьПРОДОЛЖИТЬ

Установить все варианты: Выбор, Выбор, Выбор, Выбор, Выбор

Банан

[Зима, Банан]

PageName is "PageBreakItem"

data [z] [x] = Желтый и просит ПРОДОЛЖИТЬ

data [z] [x] = Лето и просит ПРОДОЛЖИТЬ

data [z] [x] = Витамин C и просьба ПРОДОЛЖИТЬ

data [z] [x] = Жир свободен и просит ПРОДОЛЖИТЬ

Установить все варианты: Выбор, Выбор, Выбор, Выбор

Apple

[Зима, Банан, Яблоко]

PageName - "PageBreakItem"

data [z] [x] = витамин C и просьба ПРОДОЛЖИТЬ

data [z] [x] = дерево и просьба ПРОДОЛЖИТЬ

data [z] [x] = красный ипросим ПРОДОЛЖИТЬ

data [z] [x] = Зеленый и просим ПРОДОЛЖИТЬ

data [z] [x] = Зима и просим ПРОДОЛЖИТЬ

Мы нашли вариант«Зима» соответствует названию страницы «Зима»

Установите все варианты: Выбор, Выбор, Выбор, Выбор, Выбор

data [z] [x] = Apple и запрос ПРОДОЛЖИТЬ

Мы нашли опцию «Apple», соответствующую названию страницы «Apple»

Установите для всех choicePage1 значение: Choice

data [z] [x] = Banana и запрос ПРОДОЛЖИТЬ

Мы нашли вариант «Банан», соответствующий названию страницы «Банан»

Установите для всех вариантов выбораPage1 значение: Выбор, Выбор

Данные [z] [x] = Оранжевый и запрос ПРОДОЛЖИТЬ

Установите для всех параметров ChoicePage1: Выбор, Выбор, Выбор

data [z] [x] = Абрикос и просьба ПРОДОЛЖИТЬ

Установите для всех вариантов выбораPage1 значение: Выбор, Выбор, Выбор,Выбор

data [z] [x] = Черная смородина ис просьбой ПРОДОЛЖИТЬ

Установить все варианты выбораPage1: Выбор, Выбор, Выбор, Выбор, Выбор

data [z] [x] = Черника и запрос ПРОДОЛЖИТЬ

Установить всеchoicesPage1 to: Choice, Choice, Choice, Choice, Choice, Choice

data [z] [x] = Вишня и просьба ПРОДОЛЖИТЬ

Установить все choicePage1 в: Choice, Choice, Choice,Выбор, выбор, выбор, выбор

Установить все варианты выбораPage1: выбор, выбор, выбор, выбор, выбор, выбор, выбор

установить все варианты выбораPage1: выбор, выбор, выбор, выбор,Выбор, Выбор, Выбор

1 Ответ

0 голосов
/ 25 января 2019

Навигация по страницам , как упомянуто в документации, не может иметь смешанный тип навигации, то есть вы не можете определить определенные варианты для перехода на определенную страницу и оставить оставшиеся пустыми. Даже если вы явно настроили их для отправки ранее в коде, вы устанавливаете их снова для каждого варианта, для которого вы не можете найти соответствие. Вот так:

for (var z=1; z<data.length; z++) {  
        if (data[z][x] !== '') {
          Logger.log('data[z][x] = '+data[z][x]);        
          var notFound = 1                              //whether page with name was found?
          for (var zz=0; zz<PageNames.length; zz++) {
            if (data[z][x] == PageNamesValues[zz]){     //When the page is found, since both arrays have the same index
              choices.push(item.createChoice(data[z][x], PageNames[zz]));  //you use same index to find set navigation
              notFound = 0
              Logger.log('We found option "'+data[z][x]+'" matching Page Name "'+PageNamesValues[zz]+'"');
              Logger.log('Choice navigation '+ choices[choices.length -1].getGotoPage().getTitle())
            } 
          }
          if (notFound == 1){
            // You cannot have certain choice navigate to a page and remaining not,
            // you will have to explicitly define that they submit if those choices are selected
           choices.push(item.createChoice(data[z][x],FormApp.PageNavigationType.SUBMIT));
          }
        }
      }

Во-вторых, представьте, что pageBreakItem - это еще один элемент формы, представленный в начале каждого раздела. Они направляют поток форм из одного раздела в другой, их можно настроить для направления потока в другой раздел с помощью функции setGoToPage()

// Set to navigate from the first page to the last pageBreakItem    
      if (x==0) {
         // Incorrect Line: PageNames[data[0].length-1].setGoToPage(PageNames[x])
         PageNames[PageNames.length-1].setGoToPage(PageNames[x])
      }

Но в то же время может выступать в качестве адреса пересылки при использовании аргумента в функциях choices(pageBreakItem) или setGoToPage(pageBreakItem), например:

choices.push(item.createChoice(data[z][x], PageNames[zz]));

Способ, которым программа решает, когда пересылать или когда действовать в качестве адреса, основан на том, поступила ли навигация на страницу через "нормальное линейное прохождение через форму" , Или был направлен на это явно через функцию. Надежда проясняет, как использовать элемент разрыва страницы для направления навигации по странице

Вот окончательный код:

function fruitForm() {
  var SS = SpreadsheetApp.getActiveSpreadsheet();
  var Sheet = SS.getSheetByName('Sheet1');
  var data = Sheet.getDataRange().getValues();
  var form = FormApp.openById('FormID')
  .setDescription('Some description')
  .setConfirmationMessage('Have a fruity day:)')
  .setAllowResponseEdits(true)
  .setAcceptingResponses(true);
  Logger.log(form.getId())
  // Reset Multiple choice naviagtion , to enable forms to delete it. 
  var mulChoiceItems = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE)
  for (var i=0; i<mulChoiceItems.length; i++) {
    //Input dummy values to remove page navigation
    var item = mulChoiceItems[i].asMultipleChoiceItem().setChoiceValues(["a","b"])
  } 

  //Delete Previous Form values
  var items = form.getItems();
  for (var i=0; i<items.length; i++) {
      form.deleteItem(0);
  }

  //  asking user for name on the first page
  var text = form.addTextItem().setTitle('What is your name?').isRequired()
  var PageNames = [];
  var PageNamesValues = [];


  var temp =0;
  for (var x=data[0].length-1; x>=0; x--) {
    var choices = [];
    if (data[0][x] !== '') {
      temp = temp+1;     
      //Store pageBreakItem and their titles in the arrays
      //Note the arrays are filled in the same order for both pageBreakItem and their names
     //Thus preseving the relative index positions
      PageNames[x] = form.addPageBreakItem()
      .setTitle(data[0][x]);
      PageNamesValues[x] = PageNames[x].getTitle();
      Logger.log(PageNames);
      Logger.log(PageNamesValues);
      // I set all pages to SUBMIT except of the temp=1 (1st page)
      if (temp !== 1){
        PageNames[x].setGoToPage(FormApp.PageNavigationType.SUBMIT);
      }
      // Set to navigate from the first page to the last pageBreakItem    
      if (x==0) {
         // Incorrect Line: PageNames[data[0].length-1].setGoToPage(PageNames[x])
         PageNames[PageNames.length-1].setGoToPage(PageNames[x])
      }

      var item = form.addMultipleChoiceItem()
      .setTitle(data[0][x])
      .showOtherOption(false)
      .setRequired(true);

      Logger.log(PageNames[x]);
      for (var z=1; z<data.length; z++) {  
        if (data[z][x] !== '') {
          Logger.log('data[z][x] = '+data[z][x]);        
          var notFound = 1                              //whether page with name was found?
          for (var zz=0; zz<PageNames.length; zz++) {
            if (data[z][x] == PageNamesValues[zz]){     //When the page is found, since both arrays have the same index
              choices.push(item.createChoice(data[z][x], PageNames[zz]));  //you use same index to find set navigation
              notFound = 0
              Logger.log('We found option "'+data[z][x]+'" matching Page Name "'+PageNamesValues[zz]+'"');
              Logger.log('Choice navigation '+ choices[choices.length -1].getGotoPage().getTitle())
            } 
          }
          if (notFound == 1){
            // Not you cannot have certain choice navigate to a page and remaining not,
            // you have to explicit define that they submit if those choices are selected
           choices.push(item.createChoice(data[z][x],FormApp.PageNavigationType.SUBMIT));
          }
        }
      }
      item.setChoices(choices);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...