Возможно, возможно более простое решение, но я не думаю, что знаю об этом:)
Общая ссылка, которую вы выдаете, может быть ссылкой на "прокси" страницу, которая ничего не содержитно просто перенаправляет пользователей на правильную страницу.Или это может быть ссылка на реальную страницу с необходимой формой.Давайте рассмотрим варианты.
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-код, отображаемый браузером, а просто ссылку на вашу форму.
Sidenote: после изменения кода вам нужно будет опубликовать новую версию кода, чтобы изменения вступили в силу.
2.2) Создатьсайт Google по адресу sites.google.com
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 будет гораздо более удобным для пользователя (вы можете использовать этот подход самостоятельноe тоже).
В результате у вас будет что-то вроде этого: ![enter image description here](https://i.stack.imgur.com/BMIgE.png)