Javascript 如何使用谷歌表单或谷歌表单上的GAS限制基于两个ID的谷歌表单提交

Javascript 如何使用谷歌表单或谷歌表单上的GAS限制基于两个ID的谷歌表单提交,javascript,google-apps-script,google-sheets,google-forms,Javascript,Google Apps Script,Google Sheets,Google Forms,我正在制作一个谷歌查询表单,收集参与者对某个问题的投票。我想根据ID号限制参与者。我想到了三种方法: 如果输入的ID不在给定列表中,则阻止表单提交。(我更喜欢这种方法,但到目前为止找不到任何有用的代码) 在表单提交后,通过onFormSubmit触发器在Google表单上使用GAS删除链接响应电子表格中的行。以下是我的代码,它不起作用: function onFormSubmit(e) { // Grab the session data again so that we can match

我正在制作一个谷歌查询表单,收集参与者对某个问题的投票。我想根据ID号限制参与者。我想到了三种方法:

  • 如果输入的ID不在给定列表中,则阻止表单提交。(我更喜欢这种方法,但到目前为止找不到任何有用的代码)

  • 在表单提交后,通过onFormSubmit触发器在Google表单上使用GAS删除链接响应电子表格中的行。以下是我的代码,它不起作用:

    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');
      }
    }
    
    函数onFormSubmit(e){
    //再次抓取会话数据,以便我们可以将其与用户的选择相匹配。
    var响应=[];
    var values=SpreadsheetApp.openById('1rT9tKAi6ZSvZzBaXNSPMJAt4RKnW-
    9LQIE9ZV').getDataRange().getValues();
    对于(变量i=1;i
  • 在表单提交后,通过onChange触发器使用Google Sheets上的GAS删除链接响应电子表格中的行。以下是我的最大努力:

    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); 
     }
     };
    
    函数onChange(e){
    变量参考值=
    SpreadsheetApp.getActive().getSheetByName('members_sheet').getDataRange().getValues();
    var sheet=SpreadsheetApp.getActive().getSheetByName('Form Responses 1');
    var values=sheet.getDataRange().getValues();
    var indiv=值[值.长度];
    var ID1=独立[2];
    var标志=0;
    对于(变量i=1;i
  • 我是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")]);
    
    }
    
    函数makeMultiForm(){
    var form=FormApp.create('Nazar Sanji')
    .setConfirmationMessage('谢谢!您的投票已被取消
    记录的"";;
    表格.setTitle(“查询”);
    var ss=电子表格应用程序openById('1rT9tKAi6ZSvZzBaXNSPMJAt4RKnW-
    9LQIE9ZV5JJK');
    变量ID1List=
    ss.getSheetByName('members_sheet').getRange('C2:C4').getValues();//Ex[123;555]
    变量ID2List=
    ss.getSheetByName('members_sheet').getRange('D2:D4').getValues();//Ex[aa;bb]
    //Ex密码:asd、123、asd123
    const condition1=ID1List.map(element=>`${element}`).连接('|')
    var-IDarray=[];
    //将项目添加到IDarray Ex[123aa;555bb]
    for(var i=0;i`${element}`)。join(“|”)
    //首先布置裸骨结构。这定义了不同的
    //节,以及每个节中的裸小部件。
    //请注意,此时无法添加任何流路由详细信息,因为
    //最有可能的目的地尚未确定
    var itemFName=form.addTextItem().setTitle('First Name').setRequired(true);
    var itemLName=form.addTextItem().setTitle('Last Name').setRequired(true);
    var itemID1=form.addTextItem().setTitle(“第一个ID”).setRequired(true);
    //为这个问题创建与我们从工作表中获得的ID1(ID Melli)匹配的有效答案
    var ID1Validation=FormApp.createTextValidation()
    .setHelpText('输入有效的第一个ID')
    .requireTextMatchesPattern(条件1)
    .build();
    itemID1.setValidation(ID1Validation);
    //var sectID2=form.addPageBreakItem().setTitle(“第二个ID”);
    var itemID2=form.addTextItem().setTitle('Second ID').setRequired(true);
    //为这个问题创建与我们从工作表中获得的ID2(ID Shenasnameh)匹配的有效答案
    var ID2Validation=FormApp.createTextValidation()
    .setHelpText('第二个ID与第一个ID不匹配')
    .requireTextMatchesPattern(条件2)
    .build();
    itemID2.setValidation(ID2Validation);
    var sectVote=form.addPageBreakItem().setTitle(“最终投票”);
    var VoteOptions=form.addmultipleechoiceitem().setTitle(“哪个竞争对手”);
    VoteOptions.setChoices([
    VoteOptions.createChoice(“选项1”),
    VoteOptions.createChoice(“选项2”)];
    }
    
    最近的问题是关于ID2validation。由于condition2是两个ID号的串联,参与者必须在Google表单的最后一个文本项中输入他/她的合并ID(密码),这是不正确的。(例如“123aa”)

    如何解决此问题?

    如果输入的ID不在给定列表中,则阻止表单提交
    • 最简单的方法是合并文本验证,您甚至不需要为此编写代码
    • 只需在构建/编辑
      ID1
      问题
      正则表达式
      时选择,
      匹配
      ,并指定允许提交表单的所有ID,使用
      作为分隔符

    进一步信息

    • 如果您觉得有动机以编程方式合并文本验证,请看一看 及
    • 如果您希望使用已有的代码来删除行,那么将脚本附加到表单或 电子表格,在这两种情况下,您可以也应该使用触发器
      onFormSubmit
      (不是
      onChange
      !)
    • 从表单提交表中删除行将不起作用-它们将在下次表单提交时返回
    • onFormSubmit
      具有正确ID的行复制到辅助工作表可以工作,但这比使用文本验证更复杂

    如果希望将所有ID保留在电子表格中,请在代码开头尝试此操作

    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
    
    }
    

    亲爱的库珀,谢谢你的推荐