填充Google电子表格中的Google表单回复

时间:2014-01-09 08:40:27

标签: google-apps-script google-sheets google-form

我正在尝试(目前没有成功)使用我从本网站上获取的项目从Google电子表格填充Google表格,以及Mogsdad here提供的这个非常有用的答案。

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

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

  2. 一旦填充了数据,预填充的URL是否可以自动提交?我发现这篇有用的文章here表明可以做到这一点吗?

  3. 存储在Google电子表格中的数据是从其他Google表单中捕获的数据。这是因为需要使用Excel(缺少Internet连接)和连接公式将所有单元格与数据合并为一个。然后在另一个具有this脚本的Google表单上提交,以便按列分割数据,以便回答问题。这会影响提交提交时自动提交所需的触发器吗?

  4. 我可以补充说,我对此有一个相当有限的理解,所以如果这看起来相当容易,请放轻松!

2 个答案:

答案 0 :(得分:2)

  

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

我不确定我是否在这里关注您 - 在其他答案中,Logger.log()声明只是为了证明您可以生成正确的URL,如果您想要分发它。您只需使用变量url

的内容,而不是记录它

但让我们继续前进,因为我认为这有点偏离你的道路。

  

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

有一个更好的起点。 我们可以通过编程方式将电子表格中的信息提交到Google表单吗?当然可以!见Use App Scripts to open form and make a selection。与你在“URL诀窍”帖子中看到的相比,这是一种更可靠的工作方式。

在“自动提交”或模拟表单提交的情况下,您根本不必担心预填充的URL。这是讨厌人类的捷径。您想要的是将payload替换为POST请求,并让计算机完全绕过表单UI。

  

有关Excel的内容......这会影响提交时自动提交所需的触发器吗?

(听起来像......)您正在使用Form1将数据导入Spreadsheet1,然后期望通过让机器在从Form1中分离数据后提交Form2来对Form1的(人类?)提交做出反应。

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

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

答案 1 :(得分:1)

  
      
  1. 一旦填充了数据,预填充的URL是否可以自动提交?我发现这篇有用的文章here表明可以做到这一点吗?
  2.   

正如Mogsdad所说

  

有一个更好的起点。我们能否以编程方式将电子表格中的信息提交到Google表单中?当然!

根据对Use App Scripts to open form and make a selection的编辑,有效载荷/后期方法现已过时。另一种方法是使用Form App服务。以下是我通过1对evenBetterBuilURLs Mogsdad 进行的修改,以提交回复,而不是创建预先填充的网址,并在独立的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);
    //}
  }
};