获取条目ID,用于预填充Google表单URL中的字段(Items)

问题描述 投票:2回答:3

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

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

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

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

我没有看到获取条目ID的方法。实际上是否可以通过Google Apps Script API完成?

google-apps-script google-apps google-form
3个回答
2
投票

有两种方法可以获取条目ID

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

4
投票

我想扩展@devonuto的想法

下面的代码应该返回一个Form字段数组,其属性包括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"
  }
]

2
投票

意识到这是一个旧线程,但我一直在做类似的事情,我需要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;
© www.soinside.com 2019 - 2024. All rights reserved.