获取用于在 Google 表单 URL 中预填充字段(项目)的条目 ID
get Entry ID which is used to pre-populate fields (Items) in a Google Form URL
注意:这个问题不是关于查找项目(表单元素)的ID,而是条目的ID。这些是不同的东西。条目 ID 是一个数字,用于以 URL.
形式预填充字段(项目)
如此处所述https://developers.google.com/apps-script/reference/forms/text-item,可以通过 getID()
方法获取 TextItem ID(实际上,任何 Item ID)。
如果您打开任何 public Google 表单 HTML 源代码,您将在 var FB_PUBLIC_LOAD_DATA
:
中看到类似这样的内容
[232495719,"Question 1",null,0,[[1492883199]]
^ ^
Item ID Entry ID
我没有看到获取 条目 ID 的方法。是否真的可以通过 Google Apps Script API 来完成?
有两种获取条目ID的方法
- 来自预填URL。
- 为此,您有两种选择:
- 从表单编辑器或
中获取预填充的 URL
- 使用 toPrefilledUrl() Google Apps 脚本方法获取预填充的 URL。
- 从表单响应视图。
- 为此,您应该查看表单的源代码。如果您的表单使用部分,这可能会很棘手,因为可能不会有任何页面显示所有条目 ID。
意识到这是一个旧线程,但我一直在做类似的事情,我需要 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;
我想扩展@devonuto 的想法
下面的代码应该 return 一个表单字段数组,其属性包括 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"
}
]
很好的回答@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;
}
}
这个对我有用。
1.Get Pre-filled link(你可以在表单编辑的更多选项中看到这个window)。
2.In新表格出现,填写所有方块然后点击“获取link”。
3.Paste新标签页中的link,会出现填写的表格。
- 检查此表单的 URL 您可以看到每个图块的条目 ID 以及您填写的回复。
或
5.Right 单击带有响应的第一个图块,然后检查。
6.Cmd+f for Mac ,or Ctrl+f for windows to search, search a response you typed you can see the element Id in the code.
注意:这个问题不是关于查找项目(表单元素)的ID,而是条目的ID。这些是不同的东西。条目 ID 是一个数字,用于以 URL.
形式预填充字段(项目)如此处所述https://developers.google.com/apps-script/reference/forms/text-item,可以通过 getID()
方法获取 TextItem ID(实际上,任何 Item ID)。
如果您打开任何 public Google 表单 HTML 源代码,您将在 var FB_PUBLIC_LOAD_DATA
:
[232495719,"Question 1",null,0,[[1492883199]]
^ ^
Item ID Entry ID
我没有看到获取 条目 ID 的方法。是否真的可以通过 Google Apps Script API 来完成?
有两种获取条目ID的方法
- 来自预填URL。
- 为此,您有两种选择:
- 从表单编辑器或 中获取预填充的 URL
- 使用 toPrefilledUrl() Google Apps 脚本方法获取预填充的 URL。
- 为此,您有两种选择:
- 从表单响应视图。
- 为此,您应该查看表单的源代码。如果您的表单使用部分,这可能会很棘手,因为可能不会有任何页面显示所有条目 ID。
意识到这是一个旧线程,但我一直在做类似的事情,我需要 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;
我想扩展@devonuto 的想法
下面的代码应该 return 一个表单字段数组,其属性包括 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" } ]
很好的回答@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;
}
}
这个对我有用。
1.Get Pre-filled link(你可以在表单编辑的更多选项中看到这个window)。
2.In新表格出现,填写所有方块然后点击“获取link”。
3.Paste新标签页中的link,会出现填写的表格。
- 检查此表单的 URL 您可以看到每个图块的条目 ID 以及您填写的回复。
或
5.Right 单击带有响应的第一个图块,然后检查。
6.Cmd+f for Mac ,or Ctrl+f for windows to search, search a response you typed you can see the element Id in the code.