【问题标题】:Generate unique Form URL for each respondent为每个受访者生成唯一的表单 URL
【发布时间】:2015-11-07 21:11:23
【问题描述】:

我有一个 Google Form 带有一个 Google 电子表格来存储回复。在我的电子表格中,我有 4 列:姓名、电子邮件、收入和第四列 Id,用于识别特定的收件人。

我想要完成的是为每个受访者生成一个唯一的 URL,以便他们可以响应表单在以后使用相同的 URL 来编辑表单。

我查看了getEditUrl()(Google Apps 脚本)方法,该方法在提交响应后为响应者创建了一个唯一的 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)。

这可能吗?

【问题讨论】:

  • 您想知道是谁提交了表单吗?你有没有看过预填充的 url 是如何构造的?您可以构造一个“预填充”的 url(填充部分或所有字段的 url)。例如,您可以构建一个预填充的 url,该 url 填写一个项目,即提交表单的人的姓名。
  • 不是谁回复的。我想为每个收件人建立一个唯一的网址,以便他们可以使用该网址提交然后重新编辑他们的回复。
  • 这个问题被另一个用户交叉发布到 Web Apps SE 站点:webapps.stackexchange.com/q/86396/88163
  • 第三段有错误。它说“getEditUrl”,但此方法返回用于编辑表单的 URL,而不是用于编辑响应的 URL。见getEditUrl()

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


【解决方案1】:

原贴于https://webapps.stackexchange.com/a/86399/88163


是的,这是可能的,但方法略有不同:

为每个受访者提交一个答案,以便他们每个人获得一个编辑URL,然后将相应的URL发送给每个受访者。

下面是一个代码 sn-p,它通过两行代码以编程方式提交响应并记录一些响应属性,包括编辑响应 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);
}

参考文献

【讨论】:

  • 这不符合 OP 的要求;虽然他们会有一个唯一的 URL,但在他们提交表单时需要重新生成。
  • @Mogsdad :我认为您将 getEditResponseUrl() 与 toPrefilledUrl() 混淆了。代码使用第一个。
  • 你几乎是对的,我做了一个不同的错误的事情 - 我记错了 getEditResponseUrl() 是如何工作的,认为它跟踪响应的特定值。
  • @Mogsdad 感谢您回来。关于如何改进此答案的任何提示/建议?
  • 这是一个非常好的答案,真的。我唯一能建议的是将语气从“不,这不可能”改为“是的,但间接地,这就是方法”,并添加一个简短的摘要 getEditResponseUrl() supposed 到做。必须解决长期存在的错误的细节对于实现工作代码很重要,但对于理解解决方案中的基本思考过程并不重要,因此将解决方法作为次要问题来帮助读者“理解”。
猜你喜欢
  • 1970-01-01
  • 2012-03-15
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2013-03-14
  • 2011-06-06
相关资源
最近更新 更多