我需要在三个调查中的每一个中获得相等的人口。这三项调查是相同的,除了一项更改-它包含不同的图片。
我想向调查对象分发一个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?
谢谢!
答案 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更加易于使用(您也可以在自己的网站上使用此方法)。