Tap Forms app icon half
Tap Forms Forum text image
Blue gradient background

Exchange tips and ideas with the Tap Forms community

Search Results for 'script'

Viewing 15 results - 856 through 870 (of 2,951 total)
  • Author
    Search Results
  • #47271

    In reply to: Creating a dictionary

    Goutalco
    Participant

    Hello everybody,

    Since the number of dictionaries is significant the import of images for every page of the dictionary blows up my Tap Forms 5 document to a size > 40 GB. So I opted for the second option, i.e. searching for a root and opening the dictionary as a PDF file.

    The solution suggested by Brendan by setting up a Website Address field which when clicked will launch the default PDF Viewer was not working for me. I got the following Error:

    
    The application “Tap Forms 5” does not have permission to open “Test.pdf.”
    

    So I found another solution which opens the PDF Viewer via a form script and tells the default PDF viewer to open the dictionary on the page that contains the term searched by the user.

    In case anybody is confronted with a similar problem, i.e. searching for alphabetically arranged items in PDF files, I share my script.

    
    var root;
    
    var user_input = function Show_Page(ok) {
    	if (ok == true) {		
    		// Variable for the record searched by root
    		var page_for_root;
    	    
    	        // Getting the pages (records) of the dictionary
    		var pages = form.getRecords();
    		
    		// Getting the id of the field that takes the 
    		// first root present on a page
    		var root_1_id = 'fld-8ab2fc88535e49dbb60df845f4157590';
    
    		// Getting the id of the field that takes the last root      
                    // present on a page
    		var root_2_id = 'fld-fa1b6724b80f4780b1779ab4ef098c75';
    
    		
    		// Looping through the pages
    		for (var index = 0, count = pages.length; index < count;
                    index++){
    			
    			// Getting the first root present the current page
    			var root_1 = pages[index].getFieldValue(root_1_id);
    			
    			// Getting the last root present the current page
    			var root_2 = pages[index].getFieldValue(root_2_id);
    			
    			// Compare root to root_1 and root_2
    			var compare_1 = root_1.localeCompare(root, 'ar')
    			var compare_2 = root_2.localeCompare(root, 'ar')
    
    			// Try to get the first page that contains root 
                            // and leave the loop in this case
    			if (compare_1 <= 0 && 0 <= compare_2) {
    				page_for_root = pages[index];
    				break;	
    			}			
    		}
    		
    		// If there is at least one page that 
                    // contains root, show the first one
    		if (!(page_for_root === undefined)) {
    		      // Getting the URI for the dictionary
                          // file (with appropriate page number) 
                          // stored in DevonThink
    		      var devon_id = 'fld-16ada2521a864aae8646222a6661a422';
        		      var devon = page_for_root.getFieldValue(devon_id);   		
        		      // Open the dictionary on the the requested page 
        		      Utils.openUrl(devon);
        		      // Go to the page (record) of the dictionary 
                          // in Tap Forms 5
        		      form.selectRecord(page_for_root);
      		} else {
      			console.log("Root not found");
      		}   
       } else {
              console.log("Cancel button pressed.");
       }
    }
    
    	
    function Search_Dic() {
    		
    	let prompter = Prompter.new();
    	prompter.cancelButtonTitle = 'Cancel';
    	prompter.continueButtonTitle = 'OK';
    	prompter.addParameter('Root: ', 'root')
            .show('Dictionary', user_input);
    }
    
    Search_Dic();
    
    Victor Warner
    Participant

    I wish to use the record.addFileFromUrlToField function to add an attachment to a File Attachment type field.

    The files are all named in a consistent way: year + job number + “invoice – invoice number” but then the invoice number various.

    An example:

    If the file is called: “2022_046 – Smith Consular Service invoice – invoice number UK144720.pdf”

    I can form the first part of the filename from a Tap Forms field (“2022_046”) plus the text upto the invoice number. It is the end part of the file name which I cannot form (“UK144720” in the above example) as it changes from file to file.

    The script I have come up with at the moment is:

    function Add_Attachment() {
    var file_attachment_id = 'fld-1f7f08ca22de4884b5a7aa6b52a74251';
    var protocol_number_full_file_naming_id = 'fld-cdbcef5028c54e8591313e2bc5295d1a';
    var protocol_number = record.getFieldValue('fld-cdbcef5028c54e8591313e2bc5295d1a');
    
    var url = "file:///Users/victor/Desktop/" + protocol_number + " - Smith Consular Service invoice - invoice number [ ].pdf"
    
    console.log(url);
    
    	record.addFileFromUrlToField(url, file_attachment_id);
    	document.saveAllChanges();
    
    }
    
    Add_Attachment();

    It is the part in “[ ]” in

    var url = "file:///Users/victor/Desktop/" + protocol_number + " - Smith Consular Service invoice - invoice number [ ].pdf"

    with which I would like to known if it is possible to use a wildcard/regular expression.

    Any help would be gratefully received.

    • This topic was modified 3 years, 6 months ago by Brendan.
    #47250
    Yvette M
    Participant

    Hi.

    If I’m not asking too much, could someone help me with the following database?

    Here’s the scenario:
    I am team manager for two girls soccer teams. Both are the same age group of girls, but one is the A team, the second is the B team. In our club, they are both 08(year they were born) teams and their team IDs are TK and NM.
    So the A team is 08 NM
    B team is 08 TK

    There are approx. 18 girls on each team and for the most part, the 08 NM roster always plays together, and the 08 TK roster plays together. When we play at tournaments, this can change. Some of the 08 NM girls may play for the 08 TK team, and vice versa. Also, we may have guest players.

    As a club, each player has club fees, uniform costs, and registration costs that should be the same for each player (but can be different).

    Also, every tournament has its costs that players are responsible for. I add all the costs, such as the tournament registration cost for the team and coaches travel expenses together and divide that figure based on the amount of girls going to the tournament. There will always be one registration cost per team for each tournament so that gets divided between the amount of girls in that team. But sometimes if both teams are going to the same tournament, then the coaches travel expenses will be divided by girls from both teams. So, for example, if the 08 NM and the 08 TK team are both going out of town to the same tournament, then we would all split the coaches travel fees. ($400 divided by 18 vs. $400 divided by 36)

    I want to be able to record these things:
    First, the players info. Name, team they are on, Jersey #, people related to them (I’ll explain why in a minute).

    Second, I want to keep track of Costs and Fees. I need to be able to list what fees are charged for each season. Examples: How much registration was, uniform was, etc.
    I want to know what tournaments we attended and what the cost was to be in the tournament. I want to be able to show who played at each tournament (that will give me the number to divide the cost by)

    Third, and most important, I want to track what each player owes and what each player was a part of. Somewhat an attendance record for each player.

    My main goal is to be able to say, Player 1 owes me $X amount of money. This is because Player 1 was in this tournament, which was on this day, and costs this much. I would like to be able to track each time Player 1 makes a payment, how much, for what, and her balance. A register of each players transactions so when a parent asks me “what do I owe” I can answer “you owe this much because of these reasons and you paid me on these dates so far”.

    Right now, my method is not great at all of keeping track and I am getting worried I am not going to be able to get on top of this problem if I don’t make a change now. That’s why I am begging for help.

    I accept payments from parents mainly through my bank and the parents use zelle. So, this is great because I can go back and look through transaction to see who paid when. But, I do this manually each time a parent asks and it’s so much work. I have to search for their parents name on the bank site( this is why I wanted people to record who is related to each player) so, maybe if was automated this task, I could pick Player 1 to find their payments and automatically it knows to include Player 1’s moms name and dads name into the search.

    Is there a way to use a script to automatically retrieve the statements from my bank (my bank allows downloads of statements in a .csv output that I can upload to tapforms.) and have 5he statements refresh and update each players payments log or record?

    I’m sure this was a lot to read and maybe too much to ask help with. But, if anybody can help and make my life easier while managing two teams, I know the staff , owner, and dedicated people who monitor these forums are the smartest people ever and can help me.

    There’s probably things I missed that may cause confusion, but please ask. I can better describe anything.

    Thanks for your time.
    Can’t wait to see if someone will help.

    Yvette

    #47236

    In reply to: Creating a dictionary

    Goutalco
    Participant

    Thank you Brendan,

    I converted all my dictionaries to images and using your hint I successfully imported these images to my document via a CSV file. This part was quite straightforward.

    Now I like to create a search inside a form script via the Prompter class and since my understanding of JavaScript is at best rudimentary I really appreciate any comment to the script that I was able to generate using the help file.

    
    var root;
    
    var user_input = function printOut(continued) {
    	if (continued == true) {
    	
    		var page_for_root;
    	       // Getting the pages of the dictionary
    		var pages = form.getRecords();
    		
    		// Getting the id of the field that takes the first root present on a page
    		var root_1_id = 'fld-e724350c999d4fddafc12d258d407a3c';
    
    		// Getting the id of the field that takes the last root present on a page
    		var root_2_id = 'fld-a01b915c72904b2caba68eb8c2657055';
    		
    		for (var index = 0, count = pages.length; index < count; index++){
    			// Getting the first root present the current page
    			var root_1 = pages[index].getFieldValue(root_1_id);
    			// Getting the last root present the current page
    			var root_2 = pages[index].getFieldValue(root_2_id);
    			
    			// Compare the root the user is searching for to root_1 and root_2
    			var compare_1 = root_1.localeCompare(root, 'ar')
    			var compare_2 = root_2.localeCompare(root, 'ar')
    
    		       // Try to get the first page that contains root and 
                           // leave the loop in this case
    			if (compare_1 <= 0 && 0 <= compare_2) {
    				page_for_root = pages[index];
    				break;	
    			}			
    		}
    		
    		// If there is at least one page that contains root, show the first one
    		if (!(page_for_root === undefined)) {
        		        form.selectRecord(page_for_root);
      		} else {
      			console.log("Root not found");
      		}   
       } else {
              console.log("Cancel button pressed.");
       }
    }
    	
    function Search_For_Root() {
    		
    	let prompter = Prompter.new();
    	prompter.cancelButtonTitle = 'Cancel';
    	prompter.continueButtonTitle = 'OK';
    	prompter.addParameter('Root: ', 'root').show('Enter a root', user_input);
    
    }
    
    Search_For_Root();
    

    Thank you for your patience.

    Cheers

    • This reply was modified 3 years, 6 months ago by Goutalco.
    Attachments:
    You must be logged in to view attached files.
    #47234
    Goutalco
    Participant

    Hello everybody,
    I like to create a dictionary database for classical languages based on some scanned dictionaries (19th and 20th century) that are available in the form of PDF files. The PDF files are not searchable and due to the mixing of several alphabets and diacritical characters present in these files ocr is not reliable (creating searchable PDF files would be very time consuming).

    The database should work with user input based on the roots of the language.

    Example for one PDF file. Let’s call the dictionary DIC and let ABC be a root.

    All entries in DIC pertaining to the Root ABC are present on a certain page of DIC.

    I have a list of all possible roots and the page number pertaining to each root, for example

    ABC: 23
    ACE: 51`
    BBD: 134`

    I like to create a Tap Forms 5 document which has one of the following two options:

    When the user searches for Root ABC, either

    1. Tap Forms 5 tells the Preview or any other PDF-Application to open file to open the dictionary DIC and show page 23,
    2. or a Form which contain all images of DIC opens record # 23.

    For performance reasons (the PDF files are quite large – several GB) I’am inclined to opt for the second option.

    So I have to create a form with a field that is able to accommodate photos obtained from the pages of DIC.
    My question is:
    1. How can I import thousands of photos into a Tap Form 5 form
    2. and how can I search for roots?

    The answer to the second question is probably connected to the Prompter class of the JavaScript API. But how can I import all the photos inside a Tap Forms 5 document?

    Cheers

    #47226
    Brent Willingham
    Participant

    Brendan,

    Thanks for the prompt response. The more complicated scenario, scenario 2, is what I’m looking to do. I have no experience with scripting, but looks like a fun challenge and this may be a good little project to practice on.

    Thanks again for the support, and I really love the App!

    #47223
    Brendan
    Keymaster

    Hi Brent,

    Cascading Pick Lists is something I’m working towards, but it’s not there yet.

    But within a Script you can set a Pick List on a field based on some condition.

    my_field.pickList = document.getPickList('Sub-Practice 1');

    The tricky thing about cascading Pick Lists are there are really two different ways to go about them.

    1. A simple hierarchical menu whereby you select the last level value and it gets entered into the field.
    2. A more complicated scenario where you select a value from a Pick List in Field A, then Field B’s Pick List changes to list only those values that are associated with the selected value in Pick List A. For example, select a Country, then the Province field’s Pick List changes to those Provinces which are relevant only for the selected country.
    #47222
    Brendan
    Keymaster

    Hi Michael,

    I added back-ticks around your code so it’s easier to read.

    That looks like it should work. But record is a keyword that means to use the currently selected record. In the script I would change record to rec or something like that. See if that solves the problem.

    Thanks,

    Brendan

    #47217
    Brent Willingham
    Participant

    I think this thread pretty well describes what I am looking to do. I want to create a database that tracks activities and expenses related to Wildlife Management Practices that need to be done to maintain a wildlife exemption on a property. There are 7 different pre-defined main management practices and each has it’s own set of sub-practices. So a parent/child pick list situation – I think. There would be a Management Practice field that has a pull down pick list. Depending on which practice is chosen, it’s respective sub practice list would appear in the Sub Practice field.

    Since I’m a novice and don’t have any experience with scripting, I think I’d be ok with Sam’s idea in Reply 43418: “If you have a few options, you could use the built in pick lists and create one for each of the levels.”

    I don’t expect the categories or sub-categories to change so I don’t mind creating pick lists for each of the levels – I just don’t really know how to get started here.

    Thanks,
    Brent

    #47216
    Victor Warner
    Participant

    I am using the prompter function and for a popup list is it possible for one to be the default?

    On running the script, the default is “Unspecified”

    For example in the following code for passport_type_list variable, I would like the first entry (‘United Kingdom of Great Britain and Northern Ireland passport’) to be automatically shown rather than ‘Unspecified’.

    var heshe;
    var heshe_list = ['his', 'her'];
    var director_signee;
    var passport_type;
    var passport_type_list = ['United Kingdom of Great Britain and Northern Ireland passport', 'Irish passport', 'United States of America passport'];
    
    let prompter = Prompter.new();
    prompter.cancelButtonTitle = 'Cancel';
    prompter.continueButtonTitle = 'Continue';
    prompter.addParameter('Passport type: ', 'passport_type', 'popup', passport_type_list)
    prompter.addParameter('He or she: ', 'heshe', 'popup', heshe_list)
    prompter.addParameter('Name of the director signing: ', 'director_signee')
    .show('Choose whether there is a he or she\n\n\nIf a company then put in name of director signing',output);
    • This topic was modified 3 years, 6 months ago by Brendan.
    #47212
    Daniel Leu
    Participant

    Yes, using a custom layout you can place buttons that execute a script. It is a big time saver.

    In the custom layout editor, select the ‘add run script button…’ at the top right, place the button on your layout, and the set the button script.

    Attachments:
    You must be logged in to view attached files.

    Cheers, Daniel

    ---
    See https://lab.danielleu.com/tapformspro/ for scripts and tips&tricks

    #47211
    Tom Vogt
    Participant

    Is there a way to create a button (or something looking like a button) in a layout and trigger a script through it?

    I’m building a simple book keeping thing with Tap Forms for my wife and she’s a complete non-techie. Starting a script from the menu would work for me, but for her a button right at the right place in a layout would be much better.

    #47204
    Michael Tucker
    Participant

    I have fields just two fields that need to operate in a form….

    ShareSell$Amt (numeric, id:fld-89c6961ad2ec43e8853ff13e052fc807)
    NextRung$Amt (calculation, id:fld-276de1515a7c4054b9df9410cbbefd29)

    I just want after a find of the fields involved, to run a script to
    read in the first found record field NextRung$Amt,
    move to the next record and insert that read amount into field ShareSell$Amt,
    then continue thru the found set of records.

    The first record has the beginning ShareSell$Amt that is calculated in the record as NextRung$Amt.

    The function I’m looking for — is that number from the field NextRung$Amt is picked up and put into the next record’s ShareSell$Amt, and that makes that record calculate a new NextRung$Amt, which is picked up and put into the next record, then on until records in the found set run out.

    This script just stops on the first record, so it needs something.

    function Calc_NextRung_LADDER4() {
    	let balance = 000000;
    	var nextrung_id = 'fld-276de1515a7c4054b9df9410cbbefd29';
    	var newsharesell_id = 'fld-89c6961ad2ec43e8853ff13e052fc807';
    	//var transaction_date_id = 'fld-2567fc59b0ce45f982f2fe2d20eb0d79';
    	//need a saved find 'Calc_Balances LADDER4'
    	//Sam Moffatt, Tap Forms Forum, 10/21/2019 #37289
    	
    	for(record of form.getSearchNamed('Calc_Balances LADDER4').getRecords())
    	{
    		balance += record.getFieldValue(nextrung_id);
    		record.setFieldValue(newsharesell_id, balance);
    	}
    	document.saveAllChanges();
    }
    
    Calc_NextRung_LADDER4();

    In the screenshot, this set has 8 records or “rungs”. Theoretically the script would populate the 7 following rungs or records after the amount is first set to begin in the first record.

    Thanks for those that make these things easy for those of us who infrequently dabble in scripts,
    Mike

    • This topic was modified 3 years, 6 months ago by Brendan.
    Attachments:
    You must be logged in to view attached files.
    #47201
    Stig Widell
    Participant

    Hi,
    The Swedish farmer now has an excellent tool with Tap Forms 5 in organizing cows and calves. Two script are involved created by Brendan and Sam, thanks to both of them.
    However there is a need for one more script.
    The birth date of a calf in form “Kalvningar” is equal to the delivery date for the mother cow. In the form “Rekryteringsdjur” there is a list of all deliveries for a cow.
    Now there is a need for a field in “Rekryteringsdjur” identifying the date of the cows latest delivery.
    I hope someone can help me!!
    Enclose the template.

    Attachments:
    You must be logged in to view attached files.
    #47197
    Brendan
    Keymaster

    Hi Ed,

    So are you looking for some sort of a dashboard or something?

    You could do that with a Form Script that fetches totals from fields from different forms and then displays them in a form.

    See the scripting topic here:

    https://www.tapforms.com/help-mac/5.3/en/topic/scripts

    To get a total of a field from a specific form, you can use code like this:

    function populateFormTotals() {
    
       // get the form you want a total from
       var form1 = document.getFormNamed("Form 1");
    
       // get the field ID you want the total from
       var form1Field1Id = form1.getFieldNamed("Quantity").getId();
    
       // get the total for all records in form1 for the specified field.
       var totalOfForm1Field1 = form1.getTotalOfField(form1Field1);
       
       // put the total into a field on this form.
       var totalField1Id = form.getFieldNamed("Total Field 1").getId();
       record.setFieldValue(totalOfForm1Field1, totalField1Id);
       form.saveAllChanges();
    }
    
    populateFormTotals();

    You would then want to populate all the fields in your form with the values obtained from the different forms and fields. But you have to decide what those would be.

    Then whenever you want to see the overall totals, just run the form script again and the fields will update.

    Thanks,

    Brendan

    • This reply was modified 3 years, 6 months ago by Brendan.
Viewing 15 results - 856 through 870 (of 2,951 total)