Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

Populating a field with results of others (sorting & adding custom text)

Community Expert ,
Aug 29, 2016 Aug 29, 2016

I have a PDF form with many popup fields asking «Yes», «Maybe» or «No». I need a way to collect all the answers, and sorting them, all the «Yes» first, than all the «Maybe», than all the «No». When I need after that sorting of the three answer, is put this into a «Results» field with the contain of the Tool tips for each popup and the ability to add some bold text, between the three sorted answers.

I was able to found some javascript in the forum here to collect the field data only. It does not seems to be easy to modify if you have many fields to collect/sort/extract.

Any help or direction to do this will be appreciated.

Thanks!

TOPICS
Acrobat SDK and JavaScript
2.0K
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

LEGEND , Aug 29, 2016 Aug 29, 2016

Assuming you have 50 dropdowns named A1, A2, ...A50 and that each dropdown has three items (Yes, Maybe, No), you could do something like:

// Initialize object to hold response info

var oResponse = {

    "Yes" : [],

    "Maybe" : [],

    "No" : []

};

var i, f;

// Loop through the fields (A1, A2, ...A50)

for (i = 1; i <= 50; i += 1) {

    // Get a reference to the current field

    f = getField("A" + i);

    // Add tooltip text of current field to corresponding array in the response object

    oResponse[f.valu

...
Translate
Community Expert ,
Aug 29, 2016 Aug 29, 2016

That's not so simple to implement, especially the part about sorting them (based on what?) and adding bold text (that would require using Span objects the Rich Text Formatting option)...

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 29, 2016 Aug 29, 2016

It’s more filtering than sorting... I need to get all the «Yes» tool tips contain, than the «maybe», than the «no» (all in the order they appears in the form. I can live without the bolding of custom text.

And Georges, yes i’m talking about Combo box drop down list.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 29, 2016 Aug 29, 2016

If you provide an example of what you want the output to look like and let us know what the field names of the dropdowns are, I'd be happy to provide more guidance.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 29, 2016 Aug 29, 2016

This is what I got so far... and it’s a prototype only. 4 questions, and javascript that grab the tool tips (a copy of the question) of each fields.

Screen Shot 2016-08-29 at 7.49.20 PM.png

What I want is something like this... Question filtered by answer with a title inserted. All the YES first, than all the MAYBE than all the NO.

Screen Shot 2016-08-29 at 7.49.08 PM.png

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 29, 2016 Aug 29, 2016

This is what I have so far... It does not seems to be the best way if you have 25-50 fields to filter and collect.

//set the vars

var one = this.getField("A1");

var two = this.getField("A2");

var three = this.getField("A3");

var four = this.getField("A4");

var five = this.getField("Results");

//this function concatenates the fields values into one with a return as a separator.

function concatFields(field1,field2,field3,field4,fieldDest){

//ensure all vars are present

if(field1 && field2 && field3 && field4 && fieldDest){

  var fieldVals = new Array();

  if(field1.value!='' && field1.value!=null){

   fieldVals.push(field1.userName);

  }

  if(field2.value!='' && field2.value!=null){

   fieldVals.push(field2.userName);

  }

if(field3.value!='' && field3.value!=null){

   fieldVals.push(field3.userName);

  }

if(field4.value!='' && field4.value!=null){

   fieldVals.push(field4.userName);

  }

  fieldDestResult = fieldVals.join('\n');

  //only populate the fieldDest if it's empty

  //if(fieldDestResult.value!=''||fieldDestResult.value!=null){

   fieldDest.value=fieldDestResult;

  //}

}

}

concatFields(one,two,three,four,five);

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 29, 2016 Aug 29, 2016

Assuming you have 50 dropdowns named A1, A2, ...A50 and that each dropdown has three items (Yes, Maybe, No), you could do something like:

// Initialize object to hold response info

var oResponse = {

    "Yes" : [],

    "Maybe" : [],

    "No" : []

};

var i, f;

// Loop through the fields (A1, A2, ...A50)

for (i = 1; i <= 50; i += 1) {

    // Get a reference to the current field

    f = getField("A" + i);

    // Add tooltip text of current field to corresponding array in the response object

    oResponse[f.valueAsString].push(f.userName);

}

// Generate the output string

var aOutput = [];

if (oResponse["Yes"].length > 0) aOutput.push("This is priority YES\r" + oResponse["Yes"].join("\r"));

if (oResponse["Maybe"].length > 0) aOutput.push("This is priority MAYBE\r" + oResponse["Maybe"].join("\r"));

if (oResponse["No"].length > 0) aOutput.push("This is priority NO\r" + oResponse["No"].join("\r"));

// Populate the results field

getField("Results").value = aOutput.join("\r\r");

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 29, 2016 Aug 29, 2016

Hi Georges, thanks for the javascript.

When added to my get results button, nothing happens. Maybe there is some missing letter from the copy/paste code.

My PDF is here if you want to take a look at why it’s not working.

https://dl.dropboxusercontent.com/u/1482399/Question1234_PopulateResults.pdf

Many thanks!

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 29, 2016 Aug 29, 2016

It works if you change 50 to 4, since you only have 4 fields. You mentioned earlier that you might have as many as 50, so I used that as an example.

for (i = 1; i <= 4; i += 1) {

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 29, 2016 Aug 29, 2016

That was it...
Thanks! Amazing what a few line of JS can do.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 29, 2016 Aug 29, 2016

I'm glad it's working. You mentioned that nothing happened with the earlier code, but it should have generated errors that are reported in the JavaScript console (Ctrl+J). If you're going to be doing much JavaScript programming, you should select the JavaScript preference that causes the console to be shown whenever an error occurs, which is useful for debugging.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 29, 2016 Aug 29, 2016

BTW, if you want to add bold text, it's not too complicated, just replace those last several lines with something like:

// Generate the output rich text value (array of span objects)

var aOutput = [];

if (oResponse["Yes"].length > 0) {

    aOutput.push({text: "This is priority YES\r", fontWeight: 700})

    aOutput.push({text: oResponse["Yes"].join("\r") + "\r\r"});

}

if (oResponse["Maybe"].length > 0) {

    aOutput.push({text: "This is priority MAYBE\r", fontWeight: 700});

    aOutput.push({text: oResponse["Maybe"].join("\r") + "\r\r"});

}

if (oResponse["No"].length > 0) {

    aOutput.push({text: "This is priority NO\r", fontWeight: 700});

    aOutput.push({text: oResponse["No"].join("\r")});

}

// Populate the results field

getField("Results").richValue = aOutput;

Just be sure that the field is set up for rich text formatting.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 30, 2016 Aug 30, 2016

George, I was planning to works on the bolding of the text this morning trying to get my head around span object, etc...

Many thanks again, I was able to add specific color , size and others attributes.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Sep 06, 2016 Sep 06, 2016

George, just noticed that the user need to pick something in every fields to get it working. Is there a way to make it works even with some fields answered?

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Sep 06, 2016 Sep 06, 2016

Ca you clarify what the problem is? I'd also need to see your current script.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Sep 06, 2016 Sep 06, 2016

See my latest prototype here > https://dl.dropboxusercontent.com/u/1482399/Question1234_v3.pdf

If I answer only a few field, the «Get results Button» do nothing. It’s working only when all fields are filled.

Thanks!

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Sep 06, 2016 Sep 06, 2016

The current script generates an error, so it stops executing and you don't get any output. The error is due to the fact that you configured the dropdowns to initially have a blank value. This means that you have to change a line of code near the beginning of the script to:

// Add tooltip text of current field to corresponding array in the response object

if (f.valueAsString) {

    oResponse[f.valueAsString].push(f.userName);

}

If you configure the JavaScript console to display when errors occur, it will help you debug problems like this.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Sep 06, 2016 Sep 06, 2016

Thanks for the tips on the JavaScript console and for the fix.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Sep 06, 2016 Sep 06, 2016

Look at this variations 7 drop down list fields and one check box. Everything works but the javascript console error is popping each time unless I pick a choice of the combo box.

The error... My search here and on acrobatusers.com did not allow me to find a way to fix it.

TypeError: oResponse[f.valueAsString] is undefined

22:Field:Mouse Up

TypeError: oResponse[f.valueAsString] is undefined

22:AcroForm:Merge:Annot1:MouseUp:Action1

The test file > https://dl.dropboxusercontent.com/u/1482399/Question1234_v4.pdf

Thanks!

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Sep 06, 2016 Sep 06, 2016

You just have to change the line beginning with "if", but here's the complete block for context:

// Add tooltip text of current field to corresponding array in the response object

if (typeof oResponse[f.valueAsString] !== "undefined") {

    oResponse[f.valueAsString].push(f.userName);

}

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Sep 07, 2016 Sep 07, 2016
LATEST

Again thank you!

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 29, 2016 Aug 29, 2016

What do you mean by popup fields? Are they dropdowns (aka combo boxes), or something else?

How exactly do you want to sort? For example, first by field value (Yes, No, Maybe), then by field name or tooltip text, and/or something else? I would probably use a script the loop through the fields, get the field name, value, and tooltip text and load them into an array, as an array containing those three values. You can then use the built-in sort method of an array, probably with the help of a sorting function. You'd then output the sorted result to the Results field, which I'm assuming would be a multiline text field. If you provide an example of what you want the output to look like and an idea of the field names for the "popups", we can provide more guidance.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines