Skip to main content
June 12, 2020
解決済み

Adobe Acrobat Pro 2017: Averages, avg of averages, ignore blanks, ignore unchecked

  • June 12, 2020
  • 返信数 2.
  • 6124 ビュー

Good Afternoon,

I've tried to use the below formula from TYR67 on a form I'm making for my Sleep Clinic and ran into some errors I was looking for some help to square it away.

/*

    @17537118

        aFields : an array of the field names to use for the calcluation

        bIgnoreBlanks : a boolean that tells the function whether or not to ignore blank fields

        bIgnoreZeros : a boolean that tells the function whether or not to ignore zero values

*/

function calcAverage(aFields, bIgnoreBlanks, bIgnoreZeros) {

    var total = 0;

    var n = 0;

    for (var i in aFields) {

        var f = this.getField(aFields[i]);

        if (f==null) {

            console.println("Error! Can't locate a field called: " + aFields);

            continue;

        }

        if (f.valueAsString=="" && bIgnoreBlank) continue;

        var v = Number(f.valueAsString);

        if (isNaN(v)) continue;

        if (v==0 && bIgnoreZeros) continue;

        total+=v;

        n++;

    }

    if (n==0) event.value = "";

    else event.value = total/n;

}

 

You can then call it from the field's calculation script like this:

 

calcAverage(["Field1", "Field2", "Field3"], true, true);

__________________________

There were errors finding fields and as per forum suggestions I changed:

var f = this.getField(aFields);

to

var f = this.getField(aFields[i]);

Now the only error I get is:

ReferenceError: bIgnoreBlank is not defined
31:Document-Level:calAverage.

 

*no clue what I'm doing and just winging all of this...

I ended up making check boxes and radio buttons to perform the same function, just to test the script on a different kind of choice selection....

 

anyhow,

I have a form and part of it calculates FOSQ-10(Sleep Quality/ quality of life)

If  a question is blank then it only averages checked values that aren't zero.

I'd like all slots to be blank as well until filled out (so we can print a copy for patients)

form template: Q 1-2 get averaged, Q 3,4,5 averaged, Q 6,7,8 averaged, Q9, Q10.

each of those five sections are averaged together if answered, if 0 or unanswered they aren't included in average.

then final # is multiplied by 5....resulting in a # from 1-20.

 

-Besides the (ReferenceError: bIgnoreBlank is not defined
33:Field:Calculate.),

I find that the form doesnt calculate until Q10 is answered (or all the questions from q1-10 are answered)(calculation order is correct)

...if the check boxes are all selected, but then one is changed to zero, that change isn't reflected...

 

Thanks for any help you can provide!!

It's greatly appreciated.

Semper Fi

 

*Your post has been changed because invalid HTML was found in the message body. The invalid HTML has been removed. Please review the message and submit the message when you are satisfied.

 

No clue what may be missing now...

 

このトピックへの返信は締め切られました。
解決に役立った回答 Bernd Alheit

Use bIgnoreBlanks, not bIgnoreBlank

返信数 2

try67
Community Expert
Community Expert
June 12, 2020

Sorry about that... If you would point me to where you found it I'll fix it there, too.

Participating Frequently
December 10, 2020

We are also having this problem using your formula to calculate the average. We are creating a form with 10 rows, each cell is free entry (not drop down), and we want to calculate the average but ignore any rows that are empty.

My first concern is that we are not putting the formula in the right place or selecting some of the correct drop downs in the parameters before we even insert the formula. 

My second concern is that our cell names might be causing an issue because the name of each cell include a space and is not a single word.

We have no experience with Javascript so I have to speak in lay terms 🙂

I'm including screenshots of how we've set up the form. Basically the last row of each column should include the average formula -- does it need to change each time based on how the cells are labeled?  Have we set everything else up right so far before we include the formula?

Appreciate your help!

 

try67
Community Expert
Community Expert
December 10, 2020

Where are you using the code?

Bernd Alheit
Community Expert
Bernd AlheitCommunity Expert解決!
Community Expert
June 12, 2020

Use bIgnoreBlanks, not bIgnoreBlank

June 12, 2020

Awesome!!

So close... that one little "s"....

Cheers!

Thanks for the help and quick reply

Bernd Alheit
Community Expert
Community Expert
June 13, 2020

The correct code is:

function calcAverage(aFields, bIgnoreBlanks, bIgnoreZeros) {
    var total = 0;
    var n = 0;
    for (var i in aFields) {
        var f = this.getField(aFields[i]);
        if (f==null) {
            console.println("Error! Can't locate a field called: " + aFields[i]);
            continue;
        }
        if (f.valueAsString=="" && bIgnoreBlanks) continue;
        var v = Number(f.valueAsString);
        if (isNaN(v)) continue;
        if (v==0 && bIgnoreZeros) continue;
        total+=v;
        n++;
    }
    if (n==0) event.value = "";
    else event.value = total/n;
}