需要使用 Google Apps 脚本的随机唯一代码

问题描述 投票:0回答:2

我创建了一个 Google 表单来收集用户数据。在此表单中,我将询问网站名称并希望将其替换为唯一代码。

https://docs.google.com/forms/d/1JTStfAZGFBAFjVxgH0aZlMUroVsBijC0sfOvuXvqce8/viewform?usp=send_form#start=invite

我用谷歌应用程序脚本编写了代码,如下所示,但每次它都会生成新的唯一代码并替换以前的代码。

function SendConfirmationMail(e) {
  try {
    var ss, bcc, sendername, subject, columns, username;
    var message, value, textbody, usermail, track, code;

    // This is your email address and you will be in the BCC
    bcc = Session.getActiveUser().getEmail();

    // This will show up as the sender's name
    sendername = "Support Team";

    // This is the submitter's Name
    username = e.values[1];

    // This is the submitter's email address
    usermail = e.values[2];

    // Custom subject for Google Docs emails
    subject = "Support Ticket";

    // Random Code for Google Docs emails
    ss = SpreadsheetApp.getActiveSheet();
    track = new Array();
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var string_length = 10;
    var lastRow = ss.getLastRow()-1;
    var randomstring = '';
    for (var i=0; i<string_length; i++) {
      var rnum = Math.floor(Math.random() * chars.length);
      randomstring += chars.substring(rnum, rnum+1);
    }
    track.push(randomstring);

    code = ss.getRange(2, 5, lastRow, 1).setValue(track);

    // This is the body of the auto-reply
    message = "Hi <b>" +username+ " !!!</b> <br><br> Your message has been successfully received.<br>";


    GmailApp.sendEmail(usermail, subject, messag, 
                       {bcc: bcc, name: sendername, htmlBody: message});

    } catch (e) {
        Logger.log(e.toString());
    }

}

但我想为每次提交生成唯一的代码。请更新我。

google-apps-script google-sheets google-forms
2个回答
1
投票

我以前曾遇到过这类事情,其复杂性取决于它所需的安全性(据我所知,这都是内部的,所以不多)。

我不确定我是否理解为什么您要将唯一的代码作为可编辑文本框(我假设网站名称只是一个保留,您最终要么将其设为不可编辑

div
,要么不显示它根本)。

无论哪种方式,一种方法是在 properties 中保留所有以前的唯一代码的数组,尽管如果经常使用它,那么可能会太多(看看 quotasWolfram Alpha 说)保守的大约500字)。

因此,也许您可以将一些 scriptDB(甚至是电子表格,尽管速度较慢)组合起来以获得所有先前代码的最终数组。您的

randomstring
算法可能没问题(只要您检查以确保它不存在于总体 scriptDB 数组中)。

查看在 JavaScript 中生成随机字符串/字符了解其他随机字符串想法,但只需确保(再次,如果这变得非常流行)有足够的新可能性。

在寻找新代码时,您不希望这个挂起,所以我还会添加一个计数器,并在需要超过 100 次迭代时执行其他操作(如果这都是内部的,那么拥有一个计数器可能不是一个坏主意5-10 个字符的代码只是为了降低无法快速找到新字符串的可能性)。


0
投票

多年来,我为此使用了各种方法,例如脚本和函数。在某些时候它总是会遇到问题。像 Sequence 这样的函数似乎是最精简、最快的,但如果您偶然最终删除了一行或多行,则会造成严重破坏。如果几个人最终同时提交响应,脚本往往会崩溃或滞后。我能找到的最好方法是使用以下函数

={"UniqueID";arrayformula(datevalue(间接("A2:A"&Countifs(A:A,"<>")))&Right(TIMEVALUE(间接("A2:A"&Countifs(A:A,") <>"))),len(TIMEVALUE(间接("A2:A"&Countifs(A:A,"<>"))))-2))}

只需将上述函数复制粘贴到响应表中您选择的列中即可。这里 A 列包含时间戳。如果您已在时间戳左侧添加了列,只需将列引用更改为包含时间戳的列即可。

该公式通过将日期和时间值合并为每行的数字来生成唯一的 id。没有顺序,并且由于时间戳始终是唯一的(除非您将数据粘贴到响应表的 A 列中),所以每行的 ID 始终保持唯一且恒定。无论您每分钟收到多少条目,甚至删除行。

© www.soinside.com 2019 - 2024. All rights reserved.