【问题标题】:Google Apps Script Form: e.namedValues logs nothingGoogle Apps 脚本表单:e.namedValues 不记录任何内容
【发布时间】:2015-04-28 03:48:10
【问题描述】:

我有一个非常基本的 Google Apps 表单,其中包含两个问题,资源(带有两个选项的单选按钮)和名称(文本字段)。我想在提交时选择表单值,所以我设置了一个触发器(在表单提交时)来调用一个函数:

function onFormSubmit(e) {
  Logger.log(e.namedValues["Resource"]);
}

知道我做错了什么吗?

【问题讨论】:

    标签: google-apps-script google-forms


    【解决方案1】:

    我想出了实现这个的方法,下面是代码:

    function onFormSubmit(e) {
      var frm = FormApp.getActiveForm().getItems();
      var rsc = e.response.getResponseForItem(frm[0]).getResponse();
      var reasonSubmitted = e.response.getResponseForItem(frm[1]).getResponse();
      var dateRequested = e.response.getResponseForItem(frm[2]).getResponse();
    
       var submitter = Session.getActiveUser().getEmail();
    
      //Logger.log(e.response);
      Logger.log("resource: " + rsc
      + " reason: " + "resource: " + reasonSubmitted);
      }
    

    这将使您可以访问每个问题的单独回答

    【讨论】:

      【解决方案2】:

      这是我们获得所有先前提交的表单(包括最后一个)的回复的方式:

      var form = FormApp.openById('1234567890abcdefghijklmnopqrstuvwxyz');
      //OR get the form by URL
      //var form = FormApp.openByUrl( 'https://docs.google.com/forms/d/Uksgii-z-EpjdsIKZE/edit' );
       var formResponses = form.getResponses();
       for (var i = 0; i < formResponses.length; i++) {
         var formResponse = formResponses[i];
         var itemResponses = formResponse.getItemResponses();
         for (var j = 0; j < itemResponses.length; j++) {
           var itemResponse = itemResponses[j];
           Logger.log('Response #%s to the question "%s" was "%s"',
               (i + 1).toString(),
               itemResponse.getItem().getTitle(),
               itemResponse.getResponse());
         }
       }
      

      这是我们仅获得最后提交表单的响应的方式:

      //change the id or URL with your form's URL
        var form = FormApp.openById('1234567890abcdefghijklmnopqrstuvwxyz');
      //OR get the form by URL
      //var form = FormApp.openByUrl( 'https://docs.google.com/forms/d/Uksgii-z-EpjdsIKZE/edit' );
      
        var formResponses = form.getResponses();
      
        //getting the last form
        var formResponsesLength = formResponses.length - 1;
        var formResponse = formResponses[formResponsesLength];
      
      
         var itemResponses = formResponse.getItemResponses();
        //iterate over each field in the last form
         for (var j = 0; j < itemResponses.length; j++) {
         var itemResponse = itemResponses[j];
      
           if (itemResponse.getItem().getTitle() == 'Field One') {//your field name (heading) in google form
           var FieldOne = itemResponse.getResponse();
           }
      
           if (itemResponse.getItem().getTitle() == 'Field Two') {//your field name (heading) in google form
           var FieldTwo = itemResponse.getResponse();
           }
         }
      Logger.log(FieldOne);
      Logger.log(FieldTwo); 
      

      【讨论】:

        【解决方案3】:

        由于脚本包含在表单本身中(如本答案中的 cmets 所述),e.namedValues 不存在,您必须改用 Form 事件方法。

        EG var responses = e.response.getItemResponses();

        在此处查看表单事件文档:

        https://developers.google.com/apps-script/guides/triggers/events#google_forms_events

        如果您在存储答案的目标电子表格中工作(其中将显示 e.namedResponses),则显示的日志与查看脚本的会话相关。

        由于 OnFormSubmit() 触发器是由外部事件触发的,因此您无法在脚本编辑器的打开副本中可靠地看到 Logger.log() 调用的结果。

        因此,触发器可能正在工作,但由于此限制,您看不到日志结果。

        【讨论】:

        • 我不同意,如果我将记录器更改为 Logger.log("foo") 并提交表单,然后返回查看我实际上拥有 "foo" 的日志
        • 这很有趣,我在过去的 Logger 工作方式上经历过一些奇怪的事情,这让我对它有了理解。您是否尝试过直接记录 e.namedValues ?此外,您的脚本是附加到目标电子表格还是附加到表单本身?我的假设是电子表格,因为您引用了 e.namedValues。如果它在表单本身中,则事件参数会有所不同,这也可能解释了 Logger 的行为。在此处查看“表单事件”与“表格事件”:developers.google.com/apps-script/guides/triggers/…
        • 脚本附在表单上。我已经尝试基于developers.google.com/apps-script/guides/triggers/… 的 Logger.log(e.response) 并且没有成功。我避免遍历整个表单,这可能是让它工作的唯一方法..
        • 您不能简单地访问给定项目的响应似乎很奇怪,但我在文档中没有看到直接的方法。我所有的直接经验都是使用电子表格事件而不是这个表单事件对象。我正在更新我的答案以反映这些 cmets 的内容。
        【解决方案4】:

        这是因为您将表单连接到脚本,为了能够使用 e.namedValues 或 e.values,您必须将脚本与存储结果的工作表连接起来。并且不要忘记“从您的工作表”/“在表单提交时”/“使用您的功能”激活触发器。

        【讨论】:

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