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

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

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

  2. 那么预填充的 URL 是否可以在填充数据后自动提交?我发现这篇有用的文章 这里 这表明可以做到这一点?

  3. 存储在 Google 电子表格中的数据是从另一个 Google 表单捕获的数据。这是因为需要使用 Excel(缺乏互联网连接)和连接公式将所有带有数据的单元格合并为一个。然后将其提交到另一个 Google 表单上,该表单已 用于按列拆分数据的脚本,准备好回答问题。这会影响提交时自动提交所需的触发器吗?

我想补充一点,我对此的理解相当有限,所以如果这看起来很容易做到,请放轻松!

有帮助吗?

解决方案

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

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

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

那么预填充的 URL 是否可以在填充数据后自动提交?

有一个更好的起点。 我们可以以编程方式将电子表格中的信息提交到谷歌表单中吗? 当然!看 使用应用程序脚本打开表单并进行选择. 。这是比您在“URL 技巧”帖子中看到的更可靠的完成工作的方法。

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

关于Excel的一些事...这会影响提交时自动提交所需的触发器吗?

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

是的,您需要小心,在尝试读取信息以提交 Form2 之前,列拆分已完成。

我建议您最好使用 Spreadsheet1 的表单提交触发函数,该函数拆分从 Form1 接收到的字符串,然后立即将 POST 发送到 Form2。然后我会使用来自的技术记录这个动作已经发生的事实 电子表格电子邮件触发器.

其他提示

  1. 然后是预先填充的URL可以填充数据填写的URL一次?我找到了这个有用的文章这里这表明这可以做到这一点?

作为mogsdad说

有一个更好的起点。我们可以以电子表格方式向谷歌表格中向电子表格提交信息吗?当然!

根据编辑到使用App Scripts打开表单并进行选择,现在已过时的有效载荷/后方法。替代方案是使用表单应用程序服务。以下是一种适应,即我对偶数Builurls 1 要提交响应而不是创建预先填充的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);
    //}
  }
};
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top