【问题标题】:How to limit Google Form submissions based on total number of answers not number of responses如何根据答案总数而不是响应数限制 Google 表单提交
【发布时间】:2018-02-20 13:32:59
【问题描述】:

我创建了一个简单的注册表单,只要求:

  1. 电子邮件地址(必填)
  2. 姓名(必填)
  3. 加一个人的姓名(不需要 - 如果有的话)

我可以根据回复的数量限制 Google 表单:

function closeForm() {
    // get active form
    var form = FormApp.getActiveForm();

    // retrieve number of responses thusfar
    var responses = form.getResponses();

    // set close message
    var msg = "We're sorry, the event is full.";

    // do the math
    if(responses.length >= 100) {
        form.setAcceptingResponses(false).setCustomClosedFormMessage(msg);
    }
}

但我不知道如何将限制设置为 1 和 2 的总和。(即剧院中的座位总数)

有人可以帮帮我吗?

【问题讨论】:

  • 我认为您可以查询响应/响应表,然后计算已填满的座位数,然后您可以将其用作条件。
  • 确实,我可以查询工作表并获取输入的姓名总数,但我不确定如何将该数字返回到表单的脚本编辑器。
  • 哦,好的。我已经用示例代码发布了答案

标签: google-apps-script limit google-forms


【解决方案1】:

使用onFormSubmit Event 在表单上在每次提交表单时运行脚本。然后,您可以在 plusOne 列上循环,检查空值,以获取参加者的总数。

function onEdit(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Form Responses"); //change to match your sheet.
  var currentGuests = sheet.getRange("GuestCountCell with A1Notation").getValue(); //get current count from cell on spreadsheet defined above.

  //Do other stuff
}

【讨论】:

  • 谢谢克里斯。我可以通过将工作表查询到另一个工作表,然后在第 101 行的单元格中添加一个带有 COUNTIF 公式和一个 SUM 的列来获取名称的总数。问题是我不知道如何在提交时将此值恢复为原始脚本。
  • @elbatron 哦,你之前没提过。更新了我的答案。我必须跑。几个小时后回来。
  • 再次感谢。如果我在表单脚本编辑器中使用上面的 sn-p,似乎没有定义 SpreadsheetApp。
  • 如果我在工作表的编辑器中使用 sn-p,表单怎么能看到 currentGuests 的值?
【解决方案2】:

试试这个代码。您需要在 form submit trigger 上运行它

function calculateTodayReservedSeats() {
    var ss = SpreadsheetApp.openById(SPREADSHEET_ID);
    var sheet = ss.getSheetByName(SHEET_NAME);
    var lastRow = sheet.getLastRow();
    var person1 = sheet.getRange(2, PERSON1_COLUMN_INDEX, lastRow - 1, 1).getValues();
    var person2 = sheet.getRange(2, PERSON2_COLUMN_INDEX, lastRow - 1, 1).getValues();
    var i, count;
    for (i = 0; i < person1.length; i++) {
        count += person1[i][0];
        count += person2[i][0];
    }

    if (count > LIMIT) {
        //Do your stuff
        //You can disable your form
    }
}

您需要定义以下常量:

  • SPREADSHEET_ID
  • SHEET_NAME
  • PERSON1_COLUMN_INDEX
  • PERSON2_COLUMN_INDEX
  • 限制

这是未经测试的代码,如果这不起作用,请告诉我,我们可以调试。如果它有效,那么您可以接受解决方案/upvote。

【讨论】:

  • 感谢 Umair。我知道如何在表单提交触发器上运行此代码。帮助说这是一个可安装的触发器。这是否意味着我必须在工作表/表单编辑器之外运行此代码?这是我第一次与 Google 应用打交道。
  • 我想,不。您可以简单地配置以在表单提交时触发您的功能。我认为它在基于电子表格的触发器 > 提交表单 - 事件
  • 我得到:运行脚本时无法将 NAME 转换为(类)错误。 NAME 是 PERSON1_COLUMN_INDEX 的名字。
  • 谢谢。现在代码运行没有错误,但是即使计数大于限制,表单也会接受响应。 script on pastebin
  • 首先试试这个pastebin.com/wrc8A9SL 然后检查日志和表单是否被禁用。您正在以用户身份 [incognito mode] 测试表单,对吗?也许编辑器没有禁用表单?
【解决方案3】:

感谢@Chris W@Umair 的不懈帮助,我终于能够创建一个符合我最初想要的表单。

以下脚本放置在表单的脚本编辑器中,并在表单提交时触发:

function FormDisabling() {

    var form = FormApp.getActiveForm();
    var msg = 'Sorry, the event is full.';
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Total');
    var range = sheet.getRange('d21’);
    var data = range.getValue();

    if (data <= 40) {
      form.setAcceptingResponses(false).setCustomClosedFormMessage(msg);
   }

}

仅当附加的表单和电子表格设置如下时才有效: 第二个工作表(总计)从原始(响应)工作表中填充,并添加了一个额外的 (D) 列。 D2-D20 有一个 countif 公式 (=COUNTIF(A2:B2;"&lt;&gt;")),而单元格 D21 汇总这些值。如果其值大于脚本中设置的数字,则表单禁用并显示自定义消息。

我确信原始问题有一种不那么老套的方法。对于愚蠢的问题和cmets,我很抱歉,这是我第一次涉足Apps Script(以及一段时间的逻辑思考)。

【讨论】:

    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 2017-09-02
    • 2014-04-28
    • 2011-12-31
    • 2017-09-19
    • 1970-01-01
    • 2020-11-23
    • 2020-05-18
    相关资源
    最近更新 更多