我有一个带有谷歌电子表格的谷歌表单来存储响应。在我的电子表格中,我有4列:姓名、电子邮件、收入,还有第四列Id,用于识别特定的收件人。
我试图实现的是为每个受访者生成一个唯一的URL,这样他们就可以对表单做出响应,并且以后可以使用相同的URL编辑表单。
我已经研究了getEditUrl()
(谷歌应用程序脚本)方法,该方法在提交响应后为响应者创建一个唯一的URL——代码如下:
function myFunction() {
assignEditUrls();
}
function assignEditUrls() {
var form = FormApp.openById('1vsqvwomoqSXwF6TlNkmmktAAk2av2r-2LRrBYJdv3VQ');
//enter form ID here
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses');
//Change the sheet name as appropriate
var data = sheet.getDataRange().getValues();
var urlCol = 5; // column number where URL's should be populated; A = 1, B = 2 etc
var responses = form.getResponses();
var timestamps = [], urls = [], resultUrls = [];
for (var i = 0; i < responses.length; i++) {
var resp = responses[i];
timestamps.push(responses[i].getTimestamp().setMilliseconds(0));
urls.push(shortenUrl(responses[i].getEditResponseUrl()));
withItemResponse(responses[i])
}
for (var j = 1; j < data.length; j++) {
var dop = data[j][0]
resultUrls.push([data[j][0]?urls[timestamps.indexOf(data[j][0].setMilliseconds(0))]: '']);
}
sheet.getRange(2, urlCol, resultUrls.length).setValues(resultUrls);
}
function shortenUrl(longUrl) {
// google url shortener api key
var key = "AIzaSyBVG4Q5i1mNI0YAO0XVGZ3suZU8etTvK34";
var serviceUrl="https://www.googleapis.com/urlshortener/v1/url?key="+key;
var options={
muteHttpExceptions:true,
method:"post",
contentType: "application/json",
payload : JSON.stringify({'longUrl': longUrl })
};
var response=UrlFetchApp.fetch(serviceUrl, options);
if(response.getResponseCode() == 200) {
var content = JSON.parse(response.getContentText());
if ( (content != null) && (content["id"] != null) )
return content["id"];
}
return longUrl;
}
然而,我想用另一种方式来做,即首先生成唯一的URL,然后发送给受访者,这样他们就可以提交和编辑他们的回复,而无需向他们发送另一个URL(例如editurlresponse
)。
这样做可能吗?
最初发布到https://webapps.stackexchange.com/a/86399/88163
是的,这是可能的,但方法略有不同:
为每个受访者提交一个答案,以便每个人获得一个编辑URL,然后将相应的URL发送给每个受访者。
下面是一个代码片段,它通过两行代码以编程方式提交响应并记录一些响应属性,包括编辑响应url,第一行有问题,第二行是解决方法。请注意,这些行使用的是getEditResponseUrl()
,而不是toPrefilledUrl()
。
它将作为一个单独的脚本或一个有边界的脚本工作。
/*
This code shows how to get the edit response url of a
programmatically submitted response to a Google Form
*/
// Replace the form ID by your own form
var formID = '1234567890abcdefghijklmnopqrstuvwxyz';
function myFunction() {
var form = FormApp.openById(formID);
var response = form.createResponse();
var items = form.getItems();
var item = items[0];
if (item.getType() == 'TEXT') {
var textItem = item.asTextItem();
var itemResponse = textItem.createResponse('my text');
response.withItemResponse(itemResponse);
}
// Submit response
var submittedResponse = response.submit();
// Get submitted response attributes
var values = {
ID : submittedResponse.getId(),
TS : submittedResponse.getTimestamp(),
/*
Issue 4476: FormApp: getEditResponseUrl() produces invalid URL
https://code.google.com/p/google-apps-script-issues/issues/detail?id=4476
*/
ER1 : submittedResponse.getEditResponseUrl(),
/* Workaround from
https://code.google.com/p/google-apps-script-issues/issues/detail?id=4476#c2
*/
ER2 : submittedResponse.getEditResponseUrl().replace(
/?edit2=.*/,"?edit2=" + submittedResponse.getId()
)
};
Logger.log(values);
}
参考
- 类FormResponse-谷歌应用程序脚本参考
- 问题4476:FormApp:getEditResponseUrl()生成无效URL