发送表单时,“sendform(e)”会向插件旁边的单元格添加一个唯一的代码,但我无法理解为什么不为我工作。
任何人都可以帮助我吗?
function sendform(e)
{
var s = SpreadsheetApp.getActiveSheet();
var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];
e.namedValues['CODICE'] = CodeGen("llnnnnn");
}
function CodeGen(CodeStr,ExclStr) {
........
}
答案 0 :(得分:0)
你真的没有为我提供足够的代码来查看你的代码发生了什么,但这是我从头开始编写的一个解决方案,你可以修改以满足你的需求。我评论了它的废话,所以你可以看到它是如何工作的。我还从许多来源中找到了一个随意的字母数字发生器,我觉得很舒服可以满足你的需求。
function formResponses(e) {
var formData = e.values;//obtains form data submitted
var ss = SpreadsheetApp.openById('1eVEM9vN7Hzn-pKhtyDHBXhQvoVmePJr6Su5ipTK9Shs');//opens response Spreadsheet that is linked to form, put your response sheet ID here
var sh = ss.getSheetByName('Responses');//opens response sheet to read/write, put your response sheet name here
var userEmail = formData[2];//gets user email, but does not store it, it is discarded after email is sent.
var lastCol = 4;//sets column where uniqueId will be written
var lastRow = sh.getLastRow();//row where new form entries are added
var speciesResponse = formData[1];//retrieves user's response to the form question
//the next line retrieves a list of existing IDs from the last column of the resopnse sheet
var uuIdArray = [sh.getRange(2,lastCol,sh.getLastRow(),1)];
//the next line create a new random string for this submission by calling the generation string
//with arguments a string of 8 16-bit characters
var randomId = genRandomString(8,16);
//the following for() loop compares the newly generated random string
//to the existing UniqueIds, and if there is a duplicate,
//it regenerates another randomId and resets i = 0 to compare from the first unique ID again.
//if there is not a duplicate within the list, it will finish the for loop and move on.
for (var i = 0; i < uuIdArray.length; i++){
if (randomId == uuIdArray[i]){
var randomId = genRandomString(8,16)
i = 0
}
}
sh.getRange(lastRow,lastCol,1,1).setValue(randomId);
Logger.log(randomId);
var species = speciesId(speciesResponse);
Logger.log(species);
var fromAlias = selectSenderEmailAlias();
sendSpeciesEmail(userEmail,species, randomId, fromAlias);
Logger.clear();//clears the log of identifying information, specifically user's email address.
sh.getRange(2,3,sh.getLastRow(),1).clear();
}
//SUPPLEMENTAL FUNCTIONS CALLED FROM THE FORM POST:
//This is the important part for generating the random 8 digit Unique ID
function genRandomString(len, bits){
bits = bits || 36;
var outStr = "", newStr;
while (outStr.length < len)
{
newStr = Math.random().toString(bits).slice(2);
outStr += newStr.slice(0, Math.min(newStr.length, (len - outStr.length)));
}
return outStr.toUpperCase();
}
//The rest of this is for fun to test the form and a mailer to notify the user of their species status
function speciesId(speciesResponse){
var species = speciesResponse;
switch (species){
case "Yes":
var userType = "Human";
break;
case "No":
var userType = "Other";
break;
}
return userType;
}
//selects an Alias to obscure mailing address from form author
function selectSenderEmailAlias(){
var alias = GmailApp.getAliases();
Logger.log(alias[0]);
return alias;
}
//constructs and mails the user their results.
function sendSpeciesEmail(userEmail,species,randomId,fromAlias){
var userEmail = userEmail;
var emailFrom = 'Helperbot@hyperbole.com';
var species = species;
Logger.log(species);
var fromAlias = fromAlias;
var subject = 'Species evlauation quiz. Confirmation# '+randomId;
var randomId = randomId;
switch(species){
case "Human":
var body = 'Congrats! You are a human!';
break;
case "Other":
var body = 'Uh oh. I have bad news. You may be a cat (or another sub-human species). Please contact your physician for further evaluation';
break;
}
MailApp.sendEmail(userEmail, subject, body, {from: fromAlias});
}
以下是查看文件的文件夹:https://drive.google.com/folderview?id=0B_5rNbCI5MM9ellxaGdrWlItNVE&usp=sharing该脚本位于响应电子表格中的工具&gt;管理脚本下。
这是测试它是否有效的形式(https://docs.google.com/forms/d/1Cz6U92w-vAyoofshbXcScNi6S2WWdRLw0srYfguplnU/viewform)。查看电子表格中C列中的响应,以查看生成的唯一ID。我不可能验证ID迭代器永远不会搞砸,但是通过代码的设计,我无法想象它不会起作用。但是,作为测试用例,没有办法将值放在那里,因为它会在提交表单后立即生成randomId。
我试图再次为随机字符串生成器找到我的源代码,但我不能,因为我关闭了一堆标签。我向原作者道歉。
答案 1 :(得分:0)
使用此功能生成随机字符串非常完整。
function CodeGen(CodeStr,ExclStr) {
// a = code string, b = string of characters to exclude
var i=0;
var alen = CodeStr.length;
var areturn = ""
for (i=0;i<=alen;i++)
{
areturn=areturn+RandChar(CodeStr.substring(i,i+1),ExclStr);
}
return(areturn);
}
function RandChar(a,b) {
var usestring = GenString(a,b);
var randchar = Math.floor(Math.random()*usestring.length);
return(usestring.substring(randchar,randchar+1));
}
function GenString(a,b) {
var numstring = ExcludeString('0123456789',b);
var charstring = ExcludeString('ABCDEFGHIJKLMNOPQRSTUVWXYZ',b);
var allstring = numstring+charstring;
switch (a) {
case 'a':
result = allstring;
break;
case 'n':
result = numstring;
break;
case 'l':
result = charstring;
break;
case 'v': //118 = v
case 'w': //119 = w
case 'x':
case 'y':
result = allstring.substr(0, a.charCodeAt(0)-122+allstring.length);
break;
default: result = a;
}
return(result);
}
function ExcludeString(FullText, ExcludeText) {
FullText=FullText+''
ExcludeText=ExcludeText+''
var areturn = ''
var SearchText = ''
for (i=0;i<=FullText.length;i++)
{
SearchText = FullText.substring(i,i+1)
if (ExcludeText.search(SearchText) == -1)
{
areturn=areturn+SearchText;
}
}
return(areturn);
}
示例:
CodeGen(“xa-aaaa-aaaa”)给出PN-4ZES-UN57或0T-TY1R-7NUI
CodeGen(“aa-aaaa-aaaa”,“0O1I5S”)给出PN-4ZEU-UNT7或3T-TY4R-7NUK
CodeGen(“llnnnnn”)给出了VF98029,两个字母,然后是五个数字
CodeGen(“IC-nnnn”)给出IC-7233或IC-2743,始终以IC开头
CodeGen(“nn-nnnn”)给出01-2945或65-2329
CodeGen(“nnnnnn”,“0135679”)给出884422或2428242,不包括
我觉得这个功能非常有用,因为它非常有用。我想感谢这个功能的原作者,但我不知道谁创建了一个非常好的工具(代码)。