Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 从谷歌电子表格填充谷歌表单响应_Google Apps Script_Google Sheets_Google Forms - Fatal编程技术网

Google apps script 从谷歌电子表格填充谷歌表单响应

Google apps script 从谷歌电子表格填充谷歌表单响应,google-apps-script,google-sheets,google-forms,Google Apps Script,Google Sheets,Google Forms,我正在尝试(目前还没有成功)从谷歌电子表格中填充一个谷歌表单,使用我从这个网站上获取的项目和Mogsdad提供的这个非常有用的答案 理想情况下,我正在寻找: Logger.log(URL)记录电子表格中存储的所有数据的URL,是否可以只记录最后一个条目并使用它生成URL 那么,一旦填充了数据,预填充的URL是否可以自动提交?我发现了这篇有用的文章,它表明这是可以做到的 存储在Google电子表格中的数据是从另一个Google表单捕获的数据。这是因为需要使用Excel(缺少Internet连接)和

我正在尝试(目前还没有成功)从谷歌电子表格中填充一个谷歌表单,使用我从这个网站上获取的项目和Mogsdad提供的这个非常有用的答案

理想情况下,我正在寻找:

  • Logger.log(URL)记录电子表格中存储的所有数据的URL,是否可以只记录最后一个条目并使用它生成URL

  • 那么,一旦填充了数据,预填充的URL是否可以自动提交?我发现了这篇有用的文章,它表明这是可以做到的

  • 存储在Google电子表格中的数据是从另一个Google表单捕获的数据。这是因为需要使用Excel(缺少Internet连接)和连接公式将所有包含数据的单元格合并为一个单元格。然后在另一个谷歌表单上提交,该表单有脚本,可以按列将数据分割出来,以便回答问题。这是否会影响提交时自动提交所需的触发器

  • 请允许我补充一点,我对这一点的理解相当有限,因此,如果这似乎很容易做到,请轻松一点

    是否可以只记录最后一个条目并使用它生成URL

    我不确定我在这里是否理解您的意思-在另一个答案中,
    Logger.log()
    语句只是为了证明您可以生成正确的URL,如果您想分发它的话。您只需使用变量
    url
    的内容,而不是记录它

    但让我们继续,因为我认为这有点偏离你的方向

    那么,一旦填充了数据,预填充的URL是否可以自动提交

    有一个更好的起点。我们可以通过编程将电子表格中的信息提交到google表单中吗?当然看见这是一种比你在“URL技巧”帖子中看到的更可靠的方法

    在“自动提交”或模拟表单提交的情况下,您根本不需要担心预填充的URL。这是讨厌的人类的捷径。您想要的是将
    有效负载
    放在一起,用于
    POST
    请求,让计算机完全绕过表单UI

    关于Excel的一些信息。。。这是否会影响提交时自动提交所需的触发器

    (听起来像…)您使用Form1将数据输入电子表格1,然后期望在将数据与Form1分离后,让机器提交Form2,从而对Form1的(人类?)提交做出反应

    是的,在您尝试阅读信息以提交Form2之前,您需要注意列拆分已经完成

    我建议您最好使用Spreadsheet1的表单提交触发函数,该函数将从Form1收到的字符串拆分,然后立即将帖子发送到Form2。然后,我将使用来自的技术记录此操作已经发生的事实

  • 那么,一旦填充了数据,预填充的URL是否可以自动提交?我发现了这篇有用的文章,它表明这是可以做到的
  • 正如莫格斯达德所说

    有一个更好的起点。我们可以通过编程将电子表格中的信息提交到google表单中吗?当然

    根据对的编辑,payload/post方法现在已经过时。另一种选择是使用表单应用程序服务。下面是我对EverbetterBuilrls所做的一个修改,提交响应,而不是创建预先填充的URL,并在独立的Google脚本项目文件中使用

    已更改的原始代码行将被注释掉。我还插入了一些特征线,以避免出现水平滚动条

    /**
     * Use Form API to populate form
     * 
     * Addapted from https://stackoverflow.com/a/26395487/1677912
     */
    function populateFormResponses() {
      //var ss = SpreadsheetApp.getActive();
      var id = '11KDxp1C6jAZaTMNlGHke8zEzQ7aZrFSFGABdwUHEV80';
      var ss = SpreadsheetApp.openById(id);
      var sheet = ss.getSheetByName("Form Responses 1");
      var data = ss.getDataRange().getValues();  // Data for pre-fill
      var headers = data[0];                     // Sheet headers == form titles (questions)
    
      var formUrl = ss.getFormUrl();             // Use form attached to sheet
      var form = FormApp.openByUrl(formUrl);
      var items = form.getItems();
      //var urlCol = headers.indexOf("Prefilled URL");   // If there is a column labeled this
                                                         // way, we'll update it
    
      // Skip headers, then build URLs for each row in Sheet1.
      for (var row = 1; row < data.length; row++ ) {
        //Logger.log("Generating pre-filled URL from spreadsheet for row="+row);
        Logger.log("Generating response from spreadsheet for row="+row);
        // build a response from spreadsheet info.
        var response = form.createResponse();
        for (var i=0; i<items.length; i++) {
          var ques = items[i].getTitle();           // Get text of question for item
          var quesCol = headers.indexOf(ques);      // Get col index that contains this 
                                                    // question
          var resp = ques ? data[row][quesCol] : "";
          var type = items[i].getType().toString();
          Logger.log("Question='"+ques+"', resp='"+resp+"' type:"+type);
          // Need to treat every type of answer as its specific type.
          switch (items[i].getType()) {
            case FormApp.ItemType.TEXT:
              var item = items[i].asTextItem();
              break;
            case FormApp.ItemType.PARAGRAPH_TEXT: 
              item = items[i].asParagraphTextItem();
              break;
            case FormApp.ItemType.LIST:
              item = items[i].asListItem();
              break;
            case FormApp.ItemType.MULTIPLE_CHOICE:
              item = items[i].asMultipleChoiceItem();
              break;
            case FormApp.ItemType.CHECKBOX:
              item = items[i].asCheckboxItem();
              // In a form submission event, resp is an array, containing CSV strings. Join 
              // into 1 string.
              // In spreadsheet, just CSV string. Convert to array of separate choices, ready 
              // for createResponse().
              if (typeof resp !== 'string')
                resp = resp.join(',');      // Convert array to CSV
              resp = resp.split(/ *, */);   // Convert CSV to array
              break;
            case FormApp.ItemType.DATE:
              item = items[i].asDateItem();
              resp = new Date( resp );
              break;
            case FormApp.ItemType.DATETIME:
              item = items[i].asDateTimeItem();
              resp = new Date( resp );
              break;
            default:
              item = null;  // Not handling DURATION, GRID, IMAGE, PAGE_BREAK, SCALE, 
                            // SECTION_HEADER, TIME
              break;
          }
          // Add this answer to our pre-filled URL
          if (item) {
            var respItem = item.createResponse(resp);
            response.withItemResponse(respItem);
          }
          // else if we have any other type of response, we'll skip it
          else Logger.log("Skipping i="+i+", question="+ques+" type:"+type);
        }
    
        // Submit response
        response.submit();
    
        // Generate the pre-filled URL for this row
        //var editResponseUrl = response.toPrefilledUrl();
    
        // If there is a "Prefilled URL" column, update it
        //if (urlCol >= 0) {
        //  var urlRange = sheet.getRange(row+1,urlCol+1).setValue(editResponseUrl);
        //}
      }
    };
    
    /**
    *使用表单API填充表单
    * 
    *加入https://stackoverflow.com/a/26395487/1677912
    */
    函数populateFormResponses(){
    //var ss=SpreadsheetApp.getActive();
    变量id='11KDxp1C6jAZaTMNlGHke8zEzQ7aZrFSFGABdwUHEV80';
    var ss=电子表格应用程序openById(id);
    var sheet=ss.getSheetByName(“表单响应1”);
    var data=ss.getDataRange().getValues();//预填充的数据
    var headers=data[0];//工作表headers==表单标题(问题)
    var formUrl=ss.getFormUrl();//使用附在工作表上的表单
    var form=FormApp.openByUrl(formUrl);
    var items=form.getItems();
    //var urlCol=headers.indexOf(“预填充URL”);//如果有一列标记为this
    //好的,我们会更新的
    //跳过标题,然后为Sheet1中的每一行构建URL。
    对于(变量行=1;行对于(var i=0;iThanks Mogsdad-这确实有助于回答这个问题,并且通过您的建议,我已经能够使这个问题生效了!谢谢。第二个问题的答案现在已经过时了。谢谢!这对我想要批量上传的9/10列有效。在剩余的1/10列中,应用程序脚本不喜欢用户在提交时提交的文本字符串在复选框中使用了“Other”。我必须手动从工作表中删除该数据,然后在脚本完成后将其粘贴回结果中。
    var data=ss.getDataRange().getValues();
    应该是
    var data=sheet.getDataRange().getValues()
    @masofund请参阅。只有当表单响应表不是第一张时,才需要您建议的代码。我发现该选项更好,可以防止错误。但我理解,谢谢。感谢您的代码,它工作得很好(只需稍加修改即可处理空白的多项选择题响应)。