您可以在表单编辑器中创建预填写的表单URL,如Drive Forms文档中所述。您最终将获得如下所示的URL,例如:
https:
buildUrls()
在此示例中,问题1“名称”的ID为726721210
,而问题2“生日”的ID为787184751
。问题3和4为空白。
您可以通过将用户界面提供的URL修改为模板来生成预填充的URL,如下所示:
function buildUrls() {
var template = "https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=##Name##&entry.787184751=##Birthday##&entry.1381372492&entry.960923899";
var ss = SpreadsheetApp.getActive().getSheetByName("Sheet1");
var data = ss.getDataRange().getValues();
for (var i = 1; i < data.length; i++ ) {
var url = template.replace('##Name##',escape(data[i][1]))
.replace('##Birthday##',data[i][2].yyyymmdd());
Logger.log(url);
}
};
这足够有效-您可以通过电子邮件将预先填写的URL发送给每个人,他们已经填写了一些问题。
betterBuildUrls()
无需使用蛮力创建模板,我们可以通过编程将其拼凑在一起。这样的好处是我们可以重复使用代码,而无需记住更改模板。
表单中的每个问题都是一个项目。对于此示例,假设您已经描述了该表单,则假设该表单仅包含4个问题。项目[0]
是“名称”,[1]
是“生日”,依此类推。
我们可以创建一个表单响应,该表单响应不会提交-相反,我们将部分完成表单,仅获得预先填写的表单URL。由于Forms API可以理解每个项目的数据类型,因此我们可以避免操纵日期和其他类型的字符串格式,从而在某种程度上简化了代码。
(编辑:如何预填充Google表单复选框中有一个更通用的版本?)
function betterBuildUrls() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("Sheet1");
var data = ss.getDataRange().getValues();
var formUrl = ss.getFormUrl();
var form = FormApp.openByUrl(formUrl);
var items = form.getItems();
for (var i = 1; i < data.length; i++ ) {
var formResponse = form.createResponse();
var formItem = items[0].asTextItem();
var response = formItem.createResponse(data[i][1]);
formResponse.withItemResponse(response);
formItem = items[1].asDateItem();
response = formItem.createResponse(data[i][2]);
formResponse.withItemResponse(response);
var url = formResponse.toPrefilledUrl();
Logger.log(url);
}
};
yymmdd函数
预填表格URL中的任何日期项目均应采用以下格式:yyyy-mm-dd
。此辅助函数使用新方法扩展了Date对象,以处理转换。
从电子表格中读取日期时,只要数据格式可以识别为日期,您最终就会获得一个javascript Date对象。(您的示例无法识别,因此May 9th 1975
可以使用代替5/9/1975
。)
Date.prototype.yyyymmdd = function() {
var yyyy = this.getFullYear().toString();
var mm = (this.getMonth()+1).toString();
var dd = this.getDate().toString();
return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};