如何使一个URL发送到三个Google Forms URL中的一个?

时间:2019-02-06 07:31:34

标签: google-apps-script google-form google-form-quiz

我需要在三个调查中的每一个中获得相等的人口。这三项调查是相同的,除了一项更改-它包含不同的图片。

我想向调查对象分发一个URL。

我想算一下我以前收到的回复数,然后加一个。 我想根据计算将会话重定向到三个(Google表单)URL之一

(响应计数+ 1)MOD 3

我认为我需要一个Google Apps脚本来做到这一点?

这是一些伪代码:

var form0 = FormApp.openByUrl( 
   'htttps://docs.google.com/forms/d/e/2342f23f1mg/viewform' 
);

var form1 = FormApp.openByUrl( 
   'htttps://docs.google.com/forms/d/e/23422333g/viewform' 
);

var form2 = FormApp.openByUrl( 
   'htttps://docs.google.com/forms/d/e/2342wfeijqeovig/viewform' 
);

var form0Responses = form0.getResponses();
var form1Responses = form1.getResponses();
var form2Responses = form2.getResponses();

var whichURL = (
   form0Responses.length +
   form1Responses.length +
   form2Responses.length + 1
  ) % 3;                     // modulo three

// var goToForm =  switch ( whichURL ) blah blah;
// redirect to goToForm;
// How do I redirect now?

谢谢!

1 个答案:

答案 0 :(得分:0)

也许有一个更简单的解决方案,但我不认为我知道:)

您给出的公共链接可以是指向“代理”页面的链接,该页面不包含任何内容,而只是将用户重定向到正确的页面。或者它可能是指向包含实际表格的实际页面的链接。让我们看看这些选项。

0)将代码发布为网络应用

无论哪种情况,您都需要将代码发布为网络应用。在GAS中,它比听起来简单得多,您将在这里找到所有信息:https://developers.google.com/apps-script/guides/web

确保您设置Anyone, even anonymous可以访问该应用程序,并且该应用程序始终按您的方式运行(如果您选择User accessing the app,则他们将必须通过身份验证过程,这不是您所需要的)

1)通过GAS网络应用重定向。

在这种情况下,您的代码如下:

// I changed your function a bit so that it could be easier to work with 
// in case the number of your forms changes later on
function getForm() {

  var forms = [
    {
      // I'm using openById instead of openByUrl 'cause I've run into issues with 
      // the latter
      form: FormApp.openById('1')
    },
    {
      form: FormApp.openById('2')
    },
    {
      form: FormApp.openById('3')
    }    
  ];

  var whichURL = 0;
  for (var i in forms) {
    forms[i].responses = forms[i].form.getResponses().length; 
    whichURL += forms[i].responses;
  }
  whichURL++;

  // we're returning the actual URL to which we should redirect the visitors
  return forms[whichURL % forms.length].form.getPublishedUrl();
}

// doGet is Google's reserved name for functions that 
// take care of http get requests to your web app
function doGet() {
  // we're creating an html template from which getForm function is called
  // as the template is evaluated, the returned result 
  // of the function is inserted into it
  // window.open function is a client-side function 
  // that will open the URL passed to it as attribute
  return HtmlService.createTemplate('<script>window.open("<?= getForm() ?>", "_top");</script>').evaluate();
}

因此,在发布您的应用程序之后,您将获得doGet函数将运行的链接打开-您将被重定向到表单。

这里的问题是,您通过这种方式获得的URL不太漂亮,例如https://script.google.com/macros/s/1234567890abcdefghijklmnopqrstuvwxyz/exec,并且还会在页面顶部显示一条消息“该应用不是由开发人员开发的Google”在重定向发生之前的1-2秒内。

2)将您的表单嵌入另一个网页

这里的想法是不同的:您不会为用户提供“代理”链接,而是向他们提供一个页面,该页面会要求Google脚本提供正确的表单链接,并将该表单显示在页面中。 iframe。

因此,有几个步骤:

2.1)(更改doGet功能(getForm将保持不变):

function doGet() {
  return ContentService.createTextOutput(getForm());
}

在这种情况下,doGet不会返回要通过浏览器呈现的html,而只是返回到您的表单的链接。

侧注::更改代码后,您需要发布代码的新版本以使更改生效。

2.2)在site.google.com

上创建一个Google网站。

2.3),使用以下代码在页面中插入“嵌入”块:

<script>
function reqListener(response) {
  // change height and width as needed
  document.body.insertAdjacentHTML('beforeend', '<iframe src="' + response.target.response + '" width="400" height="400"></iframe>'); 
}
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "INSERT-YOUR-SCRIPT-URL");
oReq.send();
</script>

它的作用:javascript代码向您的脚本发送一个http请求,获取表单URL并将其传递到回调函数reqListener中,而后者又将其插入iframe中的文档主体中元素。

好处是您的URL更加易于使用(您也可以在自己的网站上使用此方法)。

结果,您将有如下所示: enter image description here