Copy link to clipboard
Copied
Hi,
I am creating a basic PDF form survey with radio button yes/no questions and next / back buttons to show each page. When the user pushes the "next" button on page 20, page 21 needs to be shown only IF 3 previous questions on depression (1,2, and 3) OR three previous questions on irritability (6,7, and 8) were answered yes (yes = 1, no = 0).
Here is the code that is ALMOST working:
Document level JS
var depressionchecklist = this.getField("Q1"+"Q2"+"Q3").valueAsString;
var irritabilitychecklist = this.getField("Q6"+"Q7"+"Q8").valueAsString;
JS for the "next" button on page 20
if ( depressionchecklist == "3" || irritabilitychecklist == "3" ) {
this.pageNum = this.pageNum = 20;}
else {this.pageNum = 21; }
Right now, even when the depression and irritability questions are all answered yes, when I hit the next button on page 20, it automatically skips to page 22 (it reverts to the else statement).
It's probably some simple mistake with the code.... Any ideas?
Copy link to clipboard
Copied
This
var depressionchecklist = this.getField("Q1"+"Q2"+"Q3").valueAsString;
gets the value of a single field called "Q1Q2Q3".
I'm guessing that isn't what you want: you're probably trying to take a shortcut but you do need to get each field separately.
Copy link to clipboard
Copied
Ok, interesting. I tried this:
var depressionchecklist = this.getField("Q1").valueAsString + this.getField("Q2").valueAsString + this.getField("Q3").valueAsString;
var irritabilitychecklist = this.getField("Q6").valueAsString + this.getField("Q7").valueAsString + this.getField("Q8").valueAsString;
But still not working...
Does this look right?
Copy link to clipboard
Copied
Maybe I need to use integers instead of strings? Since I want to add them and see if the sum = 3?
Any thoughts on that?
Copy link to clipboard
Copied
Use the "value" property instead of "valueAsString".
The issue can also be forced by casting the field value as a Number, like this.
var depressionchecklist = Number(this.getField("Q1").value) + Number(this.getField("Q2").value) + Number(this.getField("Q3").value);
Copy link to clipboard
Copied
So I'm throwing out the OR statement for now to simplify things, and this is what I'm trying:
Document Level JS
var depressionchecklist = Number(this.getField("Q1").value) + Number(this.getField("Q2").value) + Number(this.getField("Q3").value);
Button JS (on page 20)
if ( depressionchecklist == 3 ) {
this.pageNum = this.pageNum = 20;}
else {this.pageNum = 21; }
This doesn't seem to work, as the button defaults to the else statement even if Q1, Q2, and Q3 are all answered yes.
Remember, the value of each question is a 0 (for no) and a 1 (for yes), however I assigned these myself and I'm sure they are strings, because I could have called them "Choice one" and "Choice two".
I seem to be going in circles here...
Copy link to clipboard
Copied
Why are you using a doc-level script to define the depressionchecklist variable? That means it's only updated once.
Move it to the other script.
Copy link to clipboard
Copied
Add an app.alert to report the value of depressionchecklist. This is the basic route to solving problems in code - see that the values are what you expect.
Copy link to clipboard
Copied
Hmm, and why is this in document level JavaScript, which is run only once, when the file is first opened, and before the user fills in the form...?
Copy link to clipboard
Copied
Great question! I realized that it shouldn't be in the document level JavaScript at all... New to this
With all of your help, I got the whole thing working! This is what I did:
var depressionchecklist = this.getField("Q1").valueAsString + this.getField("Q2").valueAsString + this.getField("Q3").valueAsString;
var irritabilitychecklist = this.getField("Q6").valueAsString + this.getField("Q7").valueAsString + this.getField("Q8").valueAsString;
if ( depressionchecklist == "111" || irritabilitychecklist == "111" )
{this.pageNum = 20;}
else {this.pageNum = 21; }
I realized that adding strings was still an option, it just needed to check for "111" instead of 3.
Might be a sketchy solution, but quick nonetheless.
I didn't do the app.alert... not sure how that works - would it have made the code cleaner?
Thanks again!
Copy link to clipboard
Copied
If you want to add values as numbers, then you need to make sure they are numbers and not strings.
To do that change this line:
var depressionchecklist = this.getField("Q1").valueAsString + this.getField("Q2").valueAsString + this.getField("Q3").valueAsString;
To:
var depressionchecklist = Number(this.getField("Q1").valueAsString) + Number(this.getField("Q2").valueAsString) + Number(this.getField("Q3").valueAsString);
Copy link to clipboard
Copied
app.alert isn't something to leave in your code (normally), but it is hugely useful in problem solving (debugging).
Every programmer, at every level, ends up asking themselves "why isn't this working? Everything looks right". This is where it is really useful to put out a message showing the value of important variables. If you'd added
app.alert("Value of depressionchecklist just before the if statement is " + depressionchecklist)
it would have showed you that the value wasn't what you expected. My code is often full of things like this as I try to chase down the causes of weird stuff.
Caution! It's easy to get stuck with the same message over and over, especially in things like calculation scripts that can be called over and over. No problem, just kill Acrobat with Task Manager or Activity Monitor. YOU WILL LOSE ANY CHANGES YOU DIDN'T SAVE !
Copy link to clipboard
Copied
Or press Esc repeatedly and hope that one of those clicks will cause the script to stop executing...