Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 谷歌表单url指向上次更新的答案_Google Apps Script_Google Sheets_Google Forms - Fatal编程技术网

Google apps script 谷歌表单url指向上次更新的答案

Google apps script 谷歌表单url指向上次更新的答案,google-apps-script,google-sheets,google-forms,Google Apps Script,Google Sheets,Google Forms,我已经创建了一个谷歌表单,其中有一个与之相关联的谷歌电子表格,我发送给的每个收件人都可以访问(使用该表单)。现在,URL对于每个收件人来说都不是唯一的。收件人可以访问表单,然后提交表单。提交后,我将通过GoogleFormResponse类中可用的函数生成一个编辑URL。然后,收件人可以在提交表单后使用我提供的编辑url编辑他们的回复 这是我的密码: 函数myFunction(){ assigneditURL(); } 函数assignEditUrls(){ var form=FormApp.o

我已经创建了一个谷歌表单,其中有一个与之相关联的谷歌电子表格,我发送给的每个收件人都可以访问(使用该表单)。现在,URL对于每个收件人来说都不是唯一的。收件人可以访问表单,然后提交表单。提交后,我将通过GoogleFormResponse类中可用的函数生成一个编辑URL。然后,收件人可以在提交表单后使用我提供的编辑url编辑他们的回复

这是我的密码:

函数myFunction(){
assigneditURL();
}
函数assignEditUrls(){
var form=FormApp.openById('formId');
//在此处输入表单ID
var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses');
//根据需要更改图纸名称
var data=sheet.getDataRange().getValues();
var urlCol=5;//应该填充URL的列号;A=1,B=2等
var responses=form.getResponses();
var时间戳=[]、URL=[]、结果URL=[];
对于(var i=0;i
您还可以查看与表单关联的

这个模型的问题是,收件人需要返回一个经过编辑的URL,以便在以后编辑他们的响应。相反,我希望他们保留我最初提供给他们的相同URL,每次他们返回该URL时,我应该确定它是哪个收件人,并用最后更新的URL重定向他们

要实现这种情况,我需要:

1。为每个收件人创建唯一的URL(标识符)

2。相同的URL应指向上次更新的URL(表单),以便它们始终可以使用最初提供的相同URL(后端进程)


使用谷歌的可用工具可以实现这一点吗?如果是,我如何创建一个唯一的url来标识哪个收件人对表单做出了响应?

在Google Apps脚本的范围内,您不能提供到Google表单的重定向

以下是我脑海中的两个想法

  • 如果您愿意使用其他服务来处理重定向,您可以让它为您执行重定向。(我不推荐,只是说这是一种选择。)

  • 你可以编写一个GoogleApps脚本web服务来展示你真实的表单模型。用户将有一个唯一的URL作为HTTP查询参数传递其唯一标识符;见鬼,你可以像现在一样使用
    goo.gl
    为它们生成一个简短的URL。根据标识符,用最后的结果预填充假表单。提交后,web服务可以通过编程方式提交表单

为每个收件人创建唯一的URL(标识符)

为每个人创建一个单独的谷歌表单会给你这个

相同的URL应指向上次更新的URL


假设您要为每个用户创建一个单独的表单,请尝试在提交第一个响应后将编辑URL放回每个表单的说明或第一页的某个位置。你必须清楚地表明,他们必须继续点击该链接。如果这是您的要求,则没有设置自动将原始Google表单URL重新定向到相应的编辑响应URL

我喜欢第二个主意。基本上,我会为每个收件人生成一个唯一的url。当他们提交表格时,我将在电子表格中填写他们的答案。现在,当他们再次访问同一个url时,我将对照我的电子表格进行检查,确定url,并在其前面填充他们之前响应的内容,以便他们可以使用我最初提供给他们的相同url查看上次的答案。所以,基本上每次他们访问url时,我都会用他们之前提交的内容预先填充表单。这个逻辑正确吗?就是这样-听起来可行。确实如此:)。您是否知道如何为每个将填写调查的收件人生成唯一的表单url?现在,所有收件人的url都是完全相同的,我需要一些独特的东西来识别响应者。你知道怎么做吗?唯一的URL将用于web app+查询参数,而不是Google表单。这是一种不用谷歌表单就能完成所有工作的方法,在新表单中已经过时,但有一些有用的想法。演示如何获取现有响应以构建预填充的URL(您可以调整它以显示当前响应并提交更新)。太棒了!我看过你的密码了。我很难在这件事上动脑。。。我需要一种在收件人第一次打开表单时创建唯一id的方法,这样即使在提交表单之前,也已经有一个唯一id来区分收件人表单。这样,下次他们点击链接并编辑他们的回复时,我可以对照我的电子表格检查,确定是哪个收件人,并给他最后更新的答案。这是一个解决方案。缺点是我需要创建~5000个表单。如果这是针对用户的
function myFunction() {
  assignEditUrls();

}

function assignEditUrls() {
  var form = FormApp.openById('formId');
    //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++) {
    timestamps.push(responses[i].getTimestamp().setMilliseconds(0));

    urls.push(shortenUrl(responses[i].getEditResponseUrl()));
  }
  for (var j = 1; j < data.length; j++) {

    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 = "apiKey";

  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;
}