如何预填Google表格复选框?

时间:2014-10-15 23:02:38

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

我查看了问题“Is it possible to 'prefill' a google form using data from a google spreadsheet?”,答案中提供的代码(感谢Mogsdad)适用于文字类型的Google表单问题。我的问题是: 是否可以预先填写复选框类型的Google表单问题?

例如,如果我有一个带有“Names”条目的现有电子表格,其中一个条目是“Fred,Barney”,那么可以通过编码将表单预填充为“Fred”复选框。 “和”Barney“在”姓名“复选框下键入Google表单问题?

谢谢, 基利

4 个答案:

答案 0 :(得分:15)

对于大多数其他类型,可以重复每个响应的基本模式。例如,这适用于多种选择:

            item = items[i].asMultipleChoiceItem();
            var respItem = item.createResponse(resp);

然而,复选框可能很棘手,因为它可能有一个项目,多个项目甚至“其他”响应。将响应记录到电子表格后,它将显示为以逗号分隔的字符串;当在表单提交事件中接收时(例如在触发器函数中),我们得到一个数组(...其中所有响应都在数组的第一项中,以逗号分隔的字符串)。 checkboxItem的createResponse()方法需要一组有效的选择......所以我们可以用一点javascript魔术来提供它:

            item = items[i].asCheckboxItem();
            // Response is a CSV string, need array
            var respArray = resp.split(/ *, */);
            var respItem = item.createResponse(respArray);

编辑: 与启用“其他”选项一起使用时,Google有CheckboxItems和MultipleChoiceItems的错误。允许使用这些“其他”选项,但在预填充的URL中无法正确呈现,因此它们不会以显示的形式显示。请查看并标记Issue 4454

以下是来自Is it possible to 'prefill' a google form using data from a google spreadsheet?的功能的更新版本,已更新为处理列表,多项选择和复选框响应。此版本更通用,它可以适应电子表格中的标题。 BONUS:如果添加标有“预填充网址”的列,则脚本会在其中编写生成的网址。

screenshot

/**
 * Use Form API to generate pre-filled form URLs
 * 
 * https://stackoverflow.com/a/26395487/1677912
 */
function evenBetterBuildUrls() {
  var ss = SpreadsheetApp.getActive();
  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);
    // 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 );
          resp.setDate(resp.getDate()+1);
          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);
    }
    // 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);
    }
  }
};

答案 1 :(得分:0)

编辑表单时,请填写要预填的值。

然后获取pre-filled URL

enter image description here

答案 2 :(得分:0)

这是我开发的最后一个脚本,它对我很有用。

google表单的更新和prefield链接。

这个脚本不会关闭,因为我们知道运行时是6分钟我已经让这个脚本与google表单提交触发器和函数中的手动触发器一起工作以获得lastrow。

注意:

  1. 您必须更改特定单元格的所有号码
  2. 特别是你必须在自己的脚本的最后一行中更改表单条目(看看图片evry输入有一个固定的唯一条目)

答案 3 :(得分:0)

作为答案提供的脚本中存在一个小问题。

var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("Form Responses 1");
var data = ss.getDataRange().getValues();  // Data for pre-fill

可变数据引用活动工作表(ss),而不是&#34;表单响应1&#34;表(表)。这可能是故意的,但我想如果其他人使用相同的表格进行预填充和回复,我应该强调它。