【问题标题】:get Entry ID which is used to pre-populate fields (Items) in a Google Form URL获取条目 ID,用于在 Google 表单 URL 中预填充字段(项目)
【发布时间】:2017-09-02 18:55:48
【问题描述】:

注意:这个问题不是关于查找项目(表单元素)的 ID,而是关于条目的 ID。这些是不同的东西。条目 ID 是一个数字,用于在表单 URL 中预填充字段(项目)。

正如这里https://developers.google.com/apps-script/reference/forms/text-item 所述,可以通过getID() 方法获取TextItem ID(实际上是任何项目ID)。

如果您打开任何公开的 Google 表单 HTML 源代码,您将在 var FB_PUBLIC_LOAD_DATA 中看到类似的内容:

[232495719,"Question 1",null,0,[[1492883199]]
 ^                               ^
 Item ID                         Entry ID

我没有看到获取条目 ID 的方法。真的可以通过 Google Apps Script API 来实现吗?

【问题讨论】:

  • 请阅读说明。我指的是条目 ID,而不是项目 ID。

标签: google-apps-script google-apps google-forms


【解决方案1】:

我想扩展@devonuto 的想法

下面的代码应该返回一个表单字段数组,其属性包括entry

function getPreFillEntriesMap_(id){
  var form = FormApp.openById(id);
  var items = form.getItems();
  var newFormResponse = form.createResponse();
  var itms = [];
  for(var i = 0; i < items.length; i++){
    var response = getDefaultItemResponse_(items[i]);
    if(response){
      newFormResponse.withItemResponse(response);
      itms.push({
        id: items[i].getId(),
        entry: null,
        titile: items[i].getTitle(),
        type: "" + items[i].getType()
      });
    }
  }

  var ens = newFormResponse.toPrefilledUrl().split("&entry.").map(function(s){
    return s.split("=")[0];
  });
  ens.shift();

  return itms.map(function(r, i){
    r.entry = this[i];
    return r;
  }, ens);
}

function getDefaultItemResponse_(item){
  switch(item.getType()){
    case FormApp.ItemType.TEXT:
      return item.asTextItem().createResponse("1");
      break;
    case FormApp.ItemType.MULTIPLE_CHOICE:
      return item.asMultipleChoiceItem()
        .createResponse(item.asMultipleChoiceItem().getChoices()[0].getValue());
      break;
    default:
      return undefined; 
  } 
}

您必须自己扩展getDefaultItemResponse_() 以支持更多类型的项目。

这对我来说很好用

function run(){
  Logger.log(JSON.stringify(
    getPreFillEntriesMap_("1X9MBJDZYwrij8m_c7V4HbrT1cOyBu2OLRvDsnqS4Vdw"),
    null,
    "  "
  ));
}
[18-07-07 17:22:46:288 MSK] [
  {
    "id": 1144844846,
    "entry": "1854759972",
    "titile": "Q1",
    "type": "TEXT"
  },
  {
    "id": 1458564606,
    "entry": "1109661125",
    "titile": "Q2",
    "type": "TEXT"
  },
  {
    "id": 216942465,
    "entry": "1829112829",
    "titile": "Q3",
    "type": "MULTIPLE_CHOICE"
  }
]

The snippet get_pre_fill_entries_map

【讨论】:

    【解决方案2】:

    有两种获取条目ID的方法

    1. 来自预先填写的 URL。
      • 为此,您有两种选择:
        1. 从表单编辑器中获取预填充的 URL 或
        2. 使用toPrefilledUrl() Google Apps 脚本方法获取预填充的网址。
    2. 来自表单响应视图。
      • 为此,您应该转到表单的源代码。如果您的表单使用部分,这可能会很棘手,因为可能不会有任何页面显示所有条目 ID。

    【讨论】:

    • 这是否意味着没有官方方法可以获取条目 ID,我应该从 URL 中提取它?方法 2 可能不起作用,因为 1)它需要报废,并且随着时间的推移可能不稳定 2)某些形式如您提到的多页、私有等。
    • @igorpavlov:Google Apps 脚本参考不包含“条目”类(我没有在表单服务上下文中找到任何提及“条目”一词)所以我们可以说那里没有官方明确的方式来获取条目 ID。
    【解决方案3】:

    意识到这是一个旧线程,但我一直在做类似的事情,我需要这些 ID 在 C# 应用程序中创建预填充超链接。

    您可以创建响应来执行此操作,无需提交即可获取信息。

    var form = FormApp.create("TEST FORM");
    var fieldCount = 0;
    var fields = [];
    var fieldIds = [];
    var field1 = form.addTextItem();
    var title = "Field 1";
    fields[fieldCount++] = title;
    field1.setTitle(title);
    var field2 = form.addTextItem();
    title = "Field 2";
    fields[fieldCount++] = title;
    field2.setTitle(title);
    var response = form.createResponse();
    response.withItemResponse(field1.createResponse("TEST FIELD 1"));
    response.withItemResponse(field2.createResponse("TEST FIELD 2"));
    var url = response.toPrefilledUrl();
    var split = url.split("entry.");
    for (var x = 1; x < split.length; x++) {
        var split2 = split[x].split("=");
        fieldIds[x - 1] = split2[0];
    }
    for (var y = 0; y < fieldIds.length; y++) {
        Logger.Log("Field Name: " + fields[y] + "Field ID: " + fieldIds[y]);
    }
    delete response;
    

    【讨论】:

      【解决方案4】:

      这个对我有用。

      1.获取预填充链接(可以在表单编辑窗口的更多选项中看到)。

      2.在出现的新表格中,填写所有图块,然后点击“获取链接”。

      3.将链接粘贴到新标签页,填写好的表格就会出现。

      1. 查看此表单的 URL,您可以看到每个图块的条目 ID 以及您填写的响应。

      5.右键单击第一个带有响应的图块,然后进行检查。

      6.Cmd+f 用于 Mac 或 Ctrl+f 用于 windows 搜索,搜索您键入的响应您可以在代码中看到元素 Id。

      【讨论】:

        【解决方案5】:

        很好的答案@contributorpw ...效果很好。

        你只添加了几个表单类型,所以我添加了其余的大部分。在写这篇文章的时候,我在文档中没有看到 .asFileItem() 的选项,所以我没有添加那个......以及其他一些不太常见的选项(例如 PAGE_BREAK、SECTION_HEADER 等)。 )

        欢迎有人添加它们;-)

        function getDefaultItemResponse_(item){
          switch(item.getType()){
            case FormApp.ItemType.TEXT:
              return item.asTextItem().createResponse("1");
              break;
            case FormApp.ItemType.MULTIPLE_CHOICE:
              return item.asMultipleChoiceItem()
                .createResponse(item.asMultipleChoiceItem().getChoices()[0].getValue());
              break;
            case FormApp.ItemType.CHECKBOX:
              return item.asCheckboxItem()
                .createResponse(item.asCheckboxItem().getChoices()[0].getValue());
              break;
            case FormApp.ItemType.DATETIME:
              return item.asDateTimeItem()
                .createResponse(new Date());
              break;
            case FormApp.ItemType.DATE:
              return item.asDateItem()
                .createResponse(new Date());
              break;
            case FormApp.ItemType.LIST:
              return item.asListItem()
                .createResponse(item.asListItem().getChoices()[0].getValue());
              break;
            case FormApp.ItemType.PARAGRAPH_TEXT:
              return item.asParagraphTextItem()
                .createResponse(item.asParagraphTextItem().createResponse("some paragraph"));
              break;
            case FormApp.ItemType.CHECKBOX_GRID:
              return item.asCheckboxGridItem()
                .createResponse(item.asCheckboxGridItem().createResponse([item.asGridItem().getColumns[0], item.asGridItem().getRows[0]]));
              break;
            case FormApp.ItemType.DURATION:
              return item.asDurationItem()
                .createResponse(item.asDurationItem().createResponse(2, 20, 20));
              break;
            case FormApp.ItemType.GRID:
              return item.asGridItem()
                .createResponse(item.asGridItem().createResponse([item.asGridItem().getColumns[0], item.asGridItem().getRows[0]]));
              break;
           case FormApp.ItemType.SCALE:
              return item.asScaleItem()
                .createResponse(item.asScaleItem().createResponse(1));
              break;
           case FormApp.ItemType.TIME:
              return item.asTimeItem()
                .createResponse(item.asTimeItem().createResponse(1, 1));
              break;
            default:
              return undefined; 
          } 
        }
        

        【讨论】:

          猜你喜欢
          • 2022-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-19
          • 2019-12-24
          • 2013-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多