【问题标题】:Google Forms onsubmitGoogle 表单提交
【发布时间】:2013-03-28 15:34:20
【问题描述】:

如何引用默认的“提交”表单按钮以将 'onsubmit' 触发器与另一操作联系起来?谢谢。

例如,使用 onsubmit,

Logger.log('do something');

【问题讨论】:

  • 你能详细说明你的问题吗?还不够清楚。您是否希望在有人提交表单时运行函数?如果是这样,那么您可以调用该函数为 onSubmit()

标签: google-apps-script google-forms


【解决方案1】:

我没有在电子表格中添加脚本以接收来自表单的响应(如 Mogsdad 的回答),而是添加了一个由表单的提交按钮触发的脚本。

第 1 步:首先创建一个 Google 表单

第2步:然后从菜单中点击工具->脚本编辑器

第 3 步:为您的函数命名,例如 onSubmit()

第 4 步:编写一些代码来发送这样的电子邮件,然后点击运行按钮进行测试

function onSubmit() {
  MailApp.sendEmail("fred@email.com,alice@email.com",
                    "Subject",
                    "A new application has been submitted.\n\n" +
                    "Here is the link to all Applications:\n" +
                    "https://docs.google.com/spreadsheets/x/1-fdasjhFAKEfdaahfkhsa/",
                    {name:"From Name"});
}

第 5 步: 在脚本编辑器的菜单中,点击 Run,或点击工具栏上的 Play 按钮来测试您的代码(例如确保您收到电子邮件)

第六步:在脚本编辑器的菜单中,点击Resources->Current project's triggers

第七步:选择设置事件 From formOn form submit

第 8 步:然后从表单编辑器的菜单中,单击工具->脚本管理器并确保您的脚本已被选中

第 9 步:尝试表单。单击表单的提交按钮后,您应该会收到一封电子邮件。

【讨论】:

  • 假设**我添加了一个由表单的提交按钮触发的脚本。** 不正确,您的答案使用与 Mogsdad 的答案相同的可安装触发器...您只需将其嵌入表单容器,但它根本没有改变。在发布第一个答案时,无法在表单中嵌入脚本。
【解决方案2】:

一个没有。表单服务不允许对产品进行任何编程控制。在此一般主题的问题跟踪器上有一个open issue。给它加星标以“投票”,并接收更新。

但是,您并没有迷路。在接收表单响应的电子表格中,您可以添加带有可安装触发器的脚本以触发“表单提交”。从那里,您可以对提交的数据做很多事情,包括根据需要记录...但对表单本身无能为力。

这些参考资料解释了触发器和事件。

【讨论】:

  • 更新 - 现在有一个表单服务可以对表单的许多元素进行编程控制。
  • 所提到的问题已修复。
【解决方案3】:

这是一个旧答案。

目前(2014 年 1 月)onSubmit 有两种方式。一个是简单地创建一个函数 onSubmit() 据称(它对我不起作用......)仅在当前提交用户的许可下允许一组有限的操作。例如,您无法访问他提交的电子邮件,或修改下一次提交的基础表单。

然后是提交触发器,您可以添加并附加到任何函数,并在您自己的权限下做任何您想做的事情。看起来与上面答案中添加的触发器的屏幕截图相同,除了它的第一列显示表单脚本中的方法,下一列显示:From-Form,在第三列中您选择:提交。

您的方法通常会收到一个事件 e ,其 e.values 与电子表格中保存的值相同。所以

函数formSubmitted(e){ ...

【讨论】:

    【解决方案4】:

    似乎有两个应用程序会触发代码:(1) 表单和 (2) 链接到表单响应的电子表格。

    (1) 正如上面的 Mogsdad 和 JohnB 所指出的,由于事件没有发送到函数,因此无法通过表单以编程方式做很多事情。例如,可以发送一封电子邮件“提交表单”或“打开打开”,但没有事件对象,甚至无法记录数量或行数,也无法记录有关文档或提交的任何内容。

    (2) 但是,如果电子表格链接到表单的响应,则可以在电子表格上设置触发器,在电子表格中可以访问事件以及行、列和其他数据。

    来自链接的响应 Google 电子表格:

    • 第 1 步:工具 > 脚本编辑器
    • 第二步:写一些代码,例如:

    代码.gs:

    function onSpreadsheetSubmit(e) {
         var row = e.range.getRow();
         MailApp.sendEmail("me@example.com",
                    "Your subject, rows: "+ row,
                    "A new application has been submitted on row: "+
                    row,
                    {name:"From your friendly spreadsheet"});
    }
    
    • 第 3 步:运行 > 运行函数 > onSpreadsheetSubmit(或 |> 图标)
      • 该事件可能没有实际行,因为测试与实际提交无关。
    • 第 4 步:系统会要求您选择用户并进行身份验证
    • 第 5 步:编辑 > 当前项目的触发器(或类似时钟的图标)
    • 第 6 步:添加新触发器
    • 第 7 步:在电子表格提交 |来自电子表格 |在表单提交时
    • 第 8 步:验证并保存(或反向)
    • 第 9 步:通过等待(或执行)真实的表单提交进行测试
    • 第 10 步:检查您的电子邮件

    欲了解更多信息:https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

    【讨论】:

    【解决方案5】:

    上面的 JohnB 的 HOWTO 非常好。更新(2017 年 11 月):

    • 第 2 步:“脚本编辑器...”位于表单右上角的垂直“...”汉堡菜单中
    • 第 6 步:在(类似时钟的图标)(上面显示的第二个图标)中找到“项目触发器”。
    • 第 7 步:点击“添加新触发器”,忽略“no myFunctions”警告。
    • 第 8 步:似乎不存在,可能没有必要,对我有用。

    上述许多步骤都需要表单所有者的验证/接受。

    【讨论】:

      【解决方案6】:

      我建议使用表单中的触发器。在您的表单中打开脚本编辑器并粘贴代码:

      function onFormSubmit(e) {  
        // for tests
        if (!e) { 
          // test object
          var form = FormApp.getActiveForm()
          var responses = form.getResponses();
          e = {"authMode":"FULL",
               "response": responses[responses.length - 1], // last response
               "source": form,
               "triggerUid":"5125265"};
        };
        // do your job here
        try {
          // paste useful code here...
          //
          //
        }
        catch (err) {
          MailApp.sendEmail("testemail@test.com",
                            "Error in the app",
                            "New error, please check.\n\n" +
                            "Here is the event object:\n" +
                            e + "\n" + 
                            JSON.stringify(e) + "\n\n" + 
                            "Here's an error:\n" + err,
                            {name:"From Name"});     
          throw err;  
        }
        return 0;   
      }
      

      将此函数设置为可安装触发器。

      参考:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多