Set a Google Form's elements when a user is entering for submit - google-apps-script

Suppose I have the following:
Spreadsheet A
and I want to show the users a different question every time they enter a form for submitting (they see only one question in the form):
Form A
But there's another more difficult catch:
The form must check with the spreadsheet data which bands are still "unrated" by this user, and only show a question for one of those bands. If the user has rated every band in the spreadsheet, then the form should only show a "There are no more bands to rate" message.
And, the submit of the responses should be in this way:
Form A Responses
Is this possible with Google Forms, App Script, etc.?

not possible with apps script. you cannot modify the form at show time.
at most you can adjust the form (during onFormSubmit) for the next user to see. thus its impossible to customize for a specific user and you can also run into timing issues even if user is not important.

Related

Button in email to change cell value in google sheets

I am designing a ticketing system that runs through google forms and sheets. I want the agents to never have to interact with the actual sheet. I want to have a link/button in the email ticket where the agent can mark as resolved and the value in a cell in the sheet gets changed automatically.
Is this feasible?
It is possible and there are a couple ways to do it. I would suggest the below slightly different method than what your question asks (what if they accidentally click it!?).
Since you're already using google forms, I would send your people a link to another form that confirms a ticket should be closed. You code the link to pre-populate the ticket number to ensure that there's no human error in making sure they entered the proper ticket number.
See example to a form here with a link that will populate the form with a number from the link (I used your question #)
Once the user clicks submit, you can use that event to have your app script go modify your spreadsheet accordingly.

Multiple OnFormSubmit trigger to specific spreadsheet

So, we have this task where we have a Google Form where a user submits data as a sign up for a mentoring service that gets passed on to a Spreadsheet and the user gets an e-mail as a sort of like confirmation that the sign-up did indeed happen. During this, the mentor that the user specified also gets an e-mail with some of the information that the user has sent, and a link that redirects them to a pre-filled Google Form that contains some of the information that the user submitted, and a drop-down question that basically serves as an attendance check.
Now, all of that mentioned already works. The problem is, the way it is set-up is that there are 2 Google Forms that direct to the same spreadsheet, just in different tabs. If I try to use OnFormSubmit as a trigger for the functions that allows for the emails to be sent, what happens is both OnFormSubmit triggers occur at the same time. I've seen multiple solutions to this problem here but none of them seem to work for me. Is there a way to manually script the OnFormSubmit function to let it work only when a specific form is passed?

Record Time taken to complete a google form

I am trying to record the total time taken to complete and submit a Google form.
My logic is simple that the following code would record and put the timestamp as a multiple choice option.
Then upon submitting the form, we get a time stamp anyway but along with that, we would get the initially recorded timestamp as an answer to that question.
This is my cute little code:
function initial() {
var form = FormApp.getActiveForm();
form.getItemById(1589920082).asMultipleChoiceItem().setChoiceValues([new Date()]);
}
I have set the trigger as OnOpen but surprisingly, it does not renew the timestamp every time I open the form. Theoretically, it should record the time when the form was open but I think I am missing something here.
On the other hand, if I change the trigger to OnSubmit, it starts recording fresh timestamps every time I submit the form. But I don't want that as we get submission timestamps anyway. What I am trying to record is the time the form was open.
I know this question was asked a year ago, but here is a workaround I just came up with.
Have 2 forms! The first form can be a disclaimer, instructions, etc. The second form is the original form you intended for the users to fill out. Turn on email collection for both, so you can know which user submitted the test.
Get the sharing link and in the settings of the first form add the link in the confirmation message:
Then link both forms into a spreadsheet and you will see the time stamp of each submissions. From there you can easily do a calculation to determine the duration.
Unfortunately you cannot have any code executed when user opens form for filling in, as onOpen trigger is not supposed to be run in this case:
https://developers.google.com/apps-script/guides/triggers/#onopen
The onOpen() trigger runs automatically when a user opens a spreadsheet, document, or form that he or she has permission to edit. (The trigger does not run when responding to a form, only when opening the form to edit it.)
There is an open feature request in Google Issue Tracker to introduce some kind of onOpen trigger when form opened for response, you can "star" it to make it more possible to appear: https://issuetracker.google.com/issues/63985842

Can onFormSubmit() trigger be triggered by something else other than a human submitting a Google form?

I have a Google form, it is set up to send emails on completion of the form. I followed http://www.labnol.org/internet/auto-confirmation-emails/28386/ pretty much exactly, just changing the text mainly. And it does indeed send emails on a submit, hooray!
The form itself has required questioned so a human shouldn't be able to submit the form without filling at least those questions in.
However, over the weekend (on Sunday 11th), three emails were sent with blank responses, even to the required questions!
So I think there are three likely explanations:
The required questions didn't work / structure of the form
momentarily errored and allowed three blank responses from a human.
Some sort of robot / crawling script somehow triggered a null submit
The form was completed by a human and the data was not recorded, nor included in the email.
Do any / all of those explanations make sense / seem plausible?
And if 3 is the answer, do you know if it was a transitory, maybe documented, error that happened on Sunday?
I do not see why a bot could not submit a google form. The onSubmit trigger is just as it sounds. As soon as the form is submitted the google script runs so regardless of what sends the information as long as it was submitted to the form the script will run.
This scrip does a check against blank data for the text body of the e-mail but nothing else.
I have tested this and can confirm that even if your google form has a question set as required, if it is a text or paragraph entry then all you have to do is enter space and it will consider that valid data. All form submissions should be stored on a google spreadsheet so I would recommend checking the spreadsheet responses to see if the cell is actually blank or if it contains data like ' '.
Personally I always use specific ranges when doing an auto response or if I need to work with data from a form submission. Generally data should always be in the same place on the spreadsheet.
Your script runs whenever a form is submited. So if a bot can bypass the check if question is empty and still submit it then your script will run anyway.

Distinguish between forms when using "on form submit"

With the new Google Sheets, responses from more than one form can be sent to the same spreadsheet. This is very convenient.
However, it appears that when using the On Form Submit trigger, there is no way to distinguish between forms. This creates a major problem.
For example, I have one form that users submit to signup for a mailing list. I have a second form that users use to submit reports. I have a script that takes the reports and sends them to the mailing list recipients according to their preferences. I need to correlate variables in the mailing list and the reports in order to send the reports according to preferences. I set up the script such that whenever a report is submitted, it is automatically sent. However, when a signup form is submitted, it is triggering the script and sending emails (using information from the signup form).
Is there a way to tell Google to only trigger the script when a specific form is submitted, not when any of the forms linked to the spreadsheet is submitted?
Thanks!
I have found a roundabout way to distinguish between forms through onFormSubmit(). Taking the fact that while there is a many-to-one relationship between Forms to a Spreadsheet, there is a one-to-one relation between a Form and a Sheet. Also, all forms append a row in their unique sheet for the response value. That row of data (as a Range) is passed as a value in e, as e.range. To get the URL of the form that was used, e.range.getSheet().getFormUrl() can be used. If the need was just to distinguish between forms, e.range.getSheet() could be used.
With that, a switch in your onFormSubmit() function could be added as a control flow towards specific (for each form) functions.
I was having the same concern. I hope this is still relevant, and for posterity sake.
TL;DR: e.range.getSheet()