Как ограничить отправку форм Google на основе двух идентификаторов, используя GAS в Google Form или Google Sheets - PullRequest
1 голос
/ 20 апреля 2020

Я работаю над формой запроса Google, которая собирает голоса участников по определенному вопросу. Я хочу ограничить участников на основе идентификационного номера. Я думал о трех подходах:

  1. Запретить отправку формы, если введенный идентификатор отсутствует в данном списке. (Я предпочитаю такой подход, но пока не смог найти для него никакого полезного кода)

  2. Удалите строки в электронной таблице связанных ответов после отправки формы, используя GAS в Google Form через триггер onFormSubmit. Вот мой код, который не работает:

    function onFormSubmit(e) {
     // Grab the session data again so that we can match it to the user's choices.
    var response = [];
    var values = SpreadsheetApp.openById('1rT9tKAi6ZSvZzBaXNSPMJAt4RKnW- 
     9lqiE9zvZV').getDataRange().getValues();
    
    for (var i = 1; i < values.length; i++) {
      var indiv = values[I];
      var Fname = indiv[0];
      var Lname = indiv[1];
      var ID1 = indiv[2];
      var ID2 = indiv[3];
    
      // For every selection in the response, find the matching ID1 and title
      // in the spreadsheet and add the session data to the response array.
      if (e.namedValues[ID1] == ID1) {
        response.push(indiv);
      } else {
      Browser.msgBox('Your ID number does not matches the list');
      }
    }
    
  3. Удалите строки в электронной таблице связанных ответов после отправки формы, используя GAS на Google Sheets через триггер onChange. Вот мои лучшие усилия:

    function onChange(e) {  
     var refvalues = 
     SpreadsheetApp.getActive().getSheetByName('members_sheet').getDataRange().getValues();
     var  sheet = SpreadsheetApp.getActive().getSheetByName('Form Responses 1');
     var  values = sheet.getDataRange().getValues();
    
     var indiv = values[values.length];
     var ID1 = indiv[2];
     var flag = 0;
      for (var i = 1; i < refvalues.length; i++) {
          var refindiv = refvalues[i];
          var refID1 = refindiv[2];
        if (ID1 == refID1) {
          flag = 1;
        }
     } 
    
     if (flag == 0) {
       sheet.deleteRow(values.length); 
     }
     };
    

Я совершенно новичок в Javascript кодировании, поэтому любая помощь будет оценена.

// ---- -------------------------------------------------- ----------------------- //

Благодаря ответу ziganotschka я обновляю свой код так:

function makeMultiForm() {
  var form = FormApp.create('Nazar Sanji')
                .setConfirmationMessage('Thank you! Your Vote have been 
    recorded');
  form.setTitle("Query");

  var ss = SpreadsheetApp.openById('1rT9tKAi6ZSvZzBaXNSPMJAt4RKnW- 
   9lqiE9zvZV5JJk');
  var ID1List = 
    ss.getSheetByName('members_sheet').getRange('C2:C4').getValues();//Ex [123 ; 555]
  var ID2List = 
    ss.getSheetByName('members_sheet').getRange('D2:D4').getValues();//Ex [aa ; bb]

  // Ex passwords: asd, 123, asd123
  const condition1 = ID1List.map(element => `${element}`).join('|')

  var IDarray =[];
  //Add items to IDarray Ex [123aa ; 555bb]
    for(var i=0; i<ID1List.length; i++){
        IDarray[i] = [ID1List[i][0]+ID2List[i][0]];
    }
  const condition2 = IDarray.map(element => `${element}`).join('|')

  // Start by laying out the bare-bones structure.  This defines the different
  // sections, and the bare widgets in each section.
  // Note that you can't add any flow-routing details at this point, because
  // the destinations most likely haven't been defined yet

  var itemFName = form.addTextItem().setTitle('First Name').setRequired(true);
  var itemLName = form.addTextItem().setTitle('Last Name').setRequired(true);
  var itemID1   = form.addTextItem().setTitle('First ID').setRequired(true);

  // Create valid ation for this question matching the ID1(ID Melli) that we got from the sheet
  var ID1Validation = FormApp.createTextValidation()
.setHelpText('Enter a Valid First ID')
.requireTextMatchesPattern(condition1)
.build();
  itemID1.setValidation(ID1Validation);

  //var sectID2 = form.addPageBreakItem().setTitle("Second ID");
  var itemID2 = form.addTextItem().setTitle('Second ID').setRequired(true);

  // Create valid ation for this question matching the ID2(ID Shenasnameh) that we got from the sheet
  var ID2Validation = FormApp.createTextValidation()
.setHelpText('Second ID does not match the First ID')
.requireTextMatchesPattern(condition2)
.build();
  itemID2.setValidation(ID2Validation);


  var sectVote = form.addPageBreakItem().setTitle("Final Vote");
  var VoteOptions = form.addMultipleChoiceItem().setTitle("Which Competition");
  VoteOptions.setChoices([
  VoteOptions.createChoice("Option 1"),
  VoteOptions.createChoice("Option 2")]);

}

Последняя проблема связана с проверкой ID2. Поскольку условие2 является объединением двух идентификационных номеров, участник должен ввести свои объединенные идентификаторы (пароли) в последний текстовый элемент в форме Google, что является неверным. (Например, «123aa»)

Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Запретить отправку формы, если введенный идентификатор отсутствует в данном списке

  • Самый простой способ - включить проверку текста, вам даже не нужно кодировать его
  • Просто выберите при построении / редактировании ID1 вопрос Regular expression, matches и укажите все идентификаторы, которым разрешено отправлять форму, используя | в качестве разделителя

enter image description here

Дополнительная информация

  • Если вы заинтересованы в программной проверке текста, посмотрите здесь здесь и здесь
  • Если вы предпочитаете работать с уже существующим кодом для удаления строк - не имеет значения, присоединяете ли вы скрипт к форме или к электронной таблице, в обоих случаях вы можете и должен использовать триггер onFormSubmit (не onChange!)
  • Удаление строк из листа отправки формы не будет работать - они возвращаются при следующей отправке формы
  • Копирование onFormSubmit строки с правильным идентификатором в секунду Любой лист может работать, но это сложнее, чем использование проверки текста
0 голосов
/ 20 апреля 2020

Если вы предпочитаете хранить все идентификаторы в электронной таблице, попробуйте это в начале кода.

function onFormSubmit(e) {
  const ss=SpreadsheetApp.openById('your id');
  const idsh=ss.getSheetByName('id sheet');
  const idrg=ss.getRange(2,1,idsh.getLastRow()-1,1);
  const idA=idrg.getValues().map(function(r){return r[0];});
  if (idA.indexOf(e.namedValues['ID1'])==-1) {
    Browser.msgBox('Your ID number does not match the list');
    return;
  }
  //rest of your code here

}
...