【发布时间】:2020-04-20 14:09:44
【问题描述】:
我正在处理一个查询 Google 表单,该表单收集参与者对某个问题的投票。我想根据 ID 号限制参与者。我在考虑三种方法:
如果输入的 ID 不在给定列表中,则阻止提交表单。 (我更喜欢这种方法,但到目前为止找不到任何有用的代码)
-
在表单提交后,通过 onFormSubmit 触发器使用 GAS on Google Form 删除链接响应电子表格中的行。这是我的代码不起作用:
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'); } } -
使用 Google 表格上的 GAS 通过 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")]);
}
最近的问题是关于 ID2validation。由于 condition2 是两个 ID 号的串联,因此参与者必须在 Google 表单的最后一个文本项中输入他/她的合并 ID(密码),这是不正确的。 (例如“123aa”)
我该如何解决这个问题?
【问题讨论】:
标签: javascript google-apps-script google-sheets google-forms