Javascript 如何使用谷歌表单或谷歌表单上的GAS限制基于两个ID的谷歌表单提交
我正在制作一个谷歌查询表单,收集参与者对某个问题的投票。我想根据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
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
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
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
- 从表单提交表中删除行将不起作用-它们将在下次表单提交时返回
- 将
具有正确ID的行复制到辅助工作表可以工作,但这比使用文本验证更复杂onFormSubmit
如果希望将所有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
}
亲爱的库珀,谢谢你的推荐